2011-09-15 98 views
0

这是我昨天遇到的问题的后续行为。我有一个家庭作业分配来发送和接收客户端/服务器TCP套接字连接的数据。我想用UDP来制作它的一个版本。我的想法是,我可以重定向标准I/O并使用UDP发送流。例如,如果我输入:通过UDP套接字发送数据时出现问题

server: java UDPServer 5555 < file1.txt 
client: java UDPClient localhost 5555 > file2.txt 

应该在FILE1.TXT从服务器发送数据到客户端的FILE2.TXT。当我在不同的终端中运行客户端/服务器对时,会创建file2.txt,但数据永远不会实际发送。相反,它似乎陷入了无限循环,除非我终止应用程序,否则我无法在终端中输入任何内容。

服务器代码:

public static final int BUF_SIZE = 256; 

public static void main(String[] args) throws IOException{ 

    port = Integer.parseInt(args[0]); 

    DatagramSocket serverSocket = new DatagramSocket(port); 

    BufferedInputStream input = new BufferedInputStream(System.in); 
    BufferedOutputStream output = new BufferedOutputStream(System.out); 

    byte[] receiveData = new byte[BUF_SIZE]; 
    byte[] sendData = new byte[BUF_SIZE]; 
    byte[] buf = new byte[BUF_SIZE]; 
    String sentence; 

    if(System.in.available() > 0) { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     InetAddress address = receivePacket.getAddress(); 
     int bytesRead = 0; 
     while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) { 
      sentence = new String(buf, 0, bytesRead); 
      sendData = sentence.getBytes(); 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port); 
      serverSocket.send(sendPacket); 
     } 
    } else { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     sentence = new String(receivePacket.getData()); 
     output.write(sentence.getBytes()); 
    } 

    serverSocket.close(); 
    input.close(); 
    output.close(); 
} 

而且客户端代码:

public static final int BUF_SIZE = 256; 

public static void main(String[] args) throws IOException{ 

    String hostName = args[0]; 
    port = Integer.parseInt(args[1]); 

    DatagramSocket clientSocket = new DatagramSocket(); 
    InetAddress address = InetAddress.getByName(hostName); 

    BufferedInputStream input = new BufferedInputStream(System.in); 
    BufferedOutputStream output = new BufferedOutputStream(System.out); 

    byte[] sendData = new byte[BUF_SIZE]; 
    byte[] receiveData = new byte[BUF_SIZE]; 
    byte[] buf = new byte[BUF_SIZE]; 
    String sentence; 

    if(System.in.available() > 0) { 
     int bytesRead = 0; 
     while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) { 
      sentence = new String(buf, 0, bytesRead); 
      sendData = sentence.getBytes(); 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port); 
      clientSocket.send(sendPacket); 
     } 
    } else { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     sentence = new String(receivePacket.getData()); 
     output.write(sentence.getBytes()); 
    } 

    clientSocket.close(); 
    input.close(); 
    output.close(); 
} 

我还是新的socket编程,所以我在我的课本基础这一关的示例代码。我是否有一些明显的错误,即阻止数据传输?非常感谢您的耐心和帮助!

回答

0

您遇到的第一个问题是client.main因为您的shell命令错误而无法运行。出于某种原因,使用Java,您无法重定向输出如何传统完成。您可以简单地在client.main的开头处插入几条打印语句,以查看没有任何执行。试试这个:

java UDPClient localhost 5555 | tee file2.txt 

请参阅redirect Java output

您遇到的另一个问题是客户端和服务器都在等待接收数据报。你必须在服务器代码:

if(System.in.available() > 0) { 
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
serverSocket.receive(receivePacket); 

而且你必须在客户端代码:

else { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     sentence = new String(receivePacket.getData()); 
     output.write(sentence.getBytes()); 
     } 

注意else语句都会被执行,因为System.in.available总是返回0。记住你没有重定向输入到客户端,所以System.in中没有任何东西。要解决此问题,您需要首先发送客户端数据报,以便服务器可以使用file2.txt的内容进行响应。

0

你错过了所有你需要做的工作。代码要做哪些传输步骤,重传,确认,重新排序等?如果你想使用UDP,你必须自己完成TCP为你做的所有事情。

例如参见RFC 1350以获得在UDP之上分层的文件传输协议的示例。

相关问题