2012-09-06 21 views
0

我正在编写一个使用套接字进行双向通信的程序。客户端程序向用户提供一些选项,当用户选择该选项时,它将被服务器程序处理,并将结果返回给客户端程序。我在服务器程序中遇到了一些麻烦,因为如果我将它放入条件语句中,它将不会处理PrintWriter语句,如下图所示。Java中的PrintWriter套接字程序

客户:

Socket socket = null; 

    try 
    { 
     System.out.println("Connecting to Server"); 

     socket = new Socket("192.168.0.104", 7003); 
     socket.setSoTimeout(10000); 
     System.out.println("Connected"); 

     DataOutputStream os = new DataOutputStream(socket.getOutputStream()); 

     InputStreamReader userInput = new InputStreamReader(System.in); 
     BufferedReader userBuffer = new BufferedReader(userInput); 

     InputStreamReader serverInput = new InputStreamReader(socket.getInputStream()); 
     BufferedReader serverBuffer = new BufferedReader(serverInput); 
     PrintWriter print = new PrintWriter(socket.getOutputStream(), true); 

     System.out.println("Option 1"); 
     System.out.println("Option 2"); 
     System.out.println("Option 3"); 
     String userOption = userBuffer.readLine(); 

     os.writeBytes(userOption); 

     if (userOption.equals("1")) 
     { 
      String line = serverBuffer.readLine();    
      System.out.println(line);    
     } 

     System.out.println("Closing Client Connection"); 
     serverBuffer.close(); 
     serverInput.close(); 
     print.close(); 
     socket.close(); 
     os.close(); 
     System.exit(0); 

    } 

服务器:

ServerSocket serverSock = null; 
    Socket standSock = null; 

    try 
    { 
     serverSock = new ServerSocket(7003); 
     standSock = serverSock.accept(); 

     InputStreamReader input = new InputStreamReader(standSock.getInputStream()); 
     BufferedReader read = new BufferedReader(input); 
     PrintWriter print = new PrintWriter(standSock.getOutputStream(), false); 

     String dateTime = (Calendar.getInstance()).getTime().toString(); 

    if (read.readLine().equals("1")) 
    { 
     System.out.println("Option 1"); 
     print.println("You're connected to the Server at: " + dateTime); 
    } 

     System.out.println("Closing Server Connection"); 
     read.close(); 
     input.close(); 
     print.close(); 
     standSock.close(); 

    } 

我测试过的用户输入从客户端程序和它正确地得到它,但问题是,如果我移动

print.println("You're connected to the Server at: " + dateTime); 

在条件语句中,程序只是挂起并最终超时,但如果我移动该状态nt在条件声明外运行。如果我将它放入条件声明中,为什么它不能工作?

回答

2

客户端中的os.writeBytes(userOption);永远不会写回报。您正在服务器上调用readline(),因此它会等待,直到您输入回车。您从System.in调用的readline()实际上会丢弃您输入的返回值,因此永远不会传输。 将+ \n"添加到os.writeBytes(userOption);应该有所斩获。

可能更好的选择是实际使用您在客户端创建的PrintWriter,它会在调用print.println(userOption)后自动刷新StreamBuffer。它不需要额外的\n

1

问题是DataOutputStream只是在换行符或关闭流之后才真正发送信息,但关闭流也会关闭套接字。

我会推荐使用PrintWriter,因为它更易于管理,特别是在构造函数中,您可以使第二个参数成为true,因此每当您在该PrintWriter对象上执行println()时,它就会“自动刷新”会自动发送信息。

+0

它是PrintWriter延迟发送,而不是DataOutStream,它是无缓冲的。 – EJP

+0

我同意DataOutStream是无缓冲的,并且PrintWriter默认延迟,但是当您在PrintWriter对象的构造函数中将autoflush设置为true时,则不会。 –