我正在编写一个使用套接字进行双向通信的程序。客户端程序为用户提供了一些选项,当用户选择该选项时,它将由服务器程序处理并将结果返回给客户端程序。我在服务器程序方面遇到了一些问题,因为如果我将它放在条件语句中,它将不会处理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);
在条件语句中,程序只是挂起并最终超时,但如果我将该语句移出条件语句之外就可以了。如果我把它放在我的条件陈述中,为什么它不能起作用呢?
答案 0 :(得分:2)
客户端中的os.writeBytes(userOption);
实际上从未写过回报。您正在服务器上调用readline(),因此它会等到您输入一个返回值。您从System.in调用的readline()实际上会丢弃您键入的返回值,以便永远不会传输。
将+ \n"
添加到os.writeBytes(userOption);
应该可以解决问题。
可能更好的选择是实际使用您在客户端创建的PrintWriter,它会在调用print.println(userOption)
后自动刷新StreamBuffer。它不需要额外的\n
。
答案 1 :(得分:1)
问题是DataOutputStream仅在换行符之后或关闭流时才真正发送信息,但关闭流也将关闭套接字。
我建议坚持使用PrintWriter,因为它更易于管理,尤其是在构造函数中,您可以使第二个参数为true,因此它“自动刷新”,因此每当您对该PrintWriter对象执行println()时,它将自动发送信息。