Java 一个应用程序中的服务器和服务器套接字:不工作
我正在尝试编写一个小程序,它打开一个服务器,创建一个连接到此服务器并从中接收消息的客户端 这是到目前为止的代码Java 一个应用程序中的服务器和服务器套接字:不工作,java,sockets,client,serversocket,Java,Sockets,Client,Serversocket,我正在尝试编写一个小程序,它打开一个服务器,创建一个连接到此服务器并从中接收消息的客户端 这是到目前为止的代码 public static void main(String[] args) { final ServerSocket serverSocket; try { serverSocket = new ServerSocket(12345); Thread t = new Thread(){ public void run(){
public static void main(String[] args) {
final ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(12345);
Thread t = new Thread(){
public void run(){
try {
Socket server = serverSocket.accept();
PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
writer.write("Hello World");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
Socket client = new Socket("localhost", 12345);
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String message = reader.readLine();
System.out.println("Received " + message);
} catch (IOException e1) {
e1.printStackTrace();
}
}
如果我运行程序,它会一直在readLine()中等待-因此客户端显然不会从服务器接收消息。
有人知道为什么这不起作用吗?您的阅读线程正在等待数据流中的换行符。只需将服务器更改为使用:
writer.write("Hello World\r\n");
你会得到你期待的结果。或者,您可以关闭服务器套接字,然后当它到达数据流的末尾时,
readLine
将返回。您的读取线程正在等待数据流中的换行符。只需将服务器更改为使用:
writer.write("Hello World\r\n");
你会得到你期待的结果。或者,您可以只关闭服务器套接字,然后当它到达数据流的末尾时,
readLine
将返回。您应该将readLine放入一个循环中,如下所示:
public static void main(String[] args) {
final ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(12345);
Thread t = new Thread() {
public void run() {
try {
Socket server = serverSocket.accept();
PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
writer.write("Hello World");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
Socket client = new Socket("localhost", 12345);
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
// Check this --------------------------------------------------->
String message = null;
while ((message = in.readLine()) != null) {
System.out.println("Received " + message);
break; //This break will exit the loop when the first message is sent by the server
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
您可以阅读此文档以获得进一步的解释:您应该按如下方式将读线放入循环中:
public static void main(String[] args) {
final ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(12345);
Thread t = new Thread() {
public void run() {
try {
Socket server = serverSocket.accept();
PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
writer.write("Hello World");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
Socket client = new Socket("localhost", 12345);
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
// Check this --------------------------------------------------->
String message = null;
while ((message = in.readLine()) != null) {
System.out.println("Received " + message);
break; //This break will exit the loop when the first message is sent by the server
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
您可以阅读此文档以获得进一步的解释:Better:change
writer.write(“Hello World”)代码>到writer.println(“你好世界”)代码>@RyanStewart:可能。我个人更喜欢减少代码对平台默认值的依赖性——当涉及到网络协议时,不管服务器是运行Windows还是某种风格的Unix。是的,尽管我怀疑您的选择在Mac上不太合适。如果我们担心产品的价值,那么答案就是出于这些确切的原因不要使用reader.readLine()
。不过,这是一个完全不同的方向。@RyanStewart:它应该做-BufferedReader.readLine
故意处理\n
,\r\n
和\r
我相信。(刚刚选中:“读取一行文本。行被视为由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任何一个终止。”)。我没有意识到。更好:改变writer.write(“你好世界”)代码>到writer.println(“你好世界”)代码>@RyanStewart:可能。我个人更喜欢减少代码对平台默认值的依赖性——当涉及到网络协议时,不管服务器是运行Windows还是某种风格的Unix。是的,尽管我怀疑您的选择在Mac上不太合适。如果我们担心产品的价值,那么答案就是出于这些确切的原因不要使用reader.readLine()
。不过,这是一个完全不同的方向。@RyanStewart:它应该做-BufferedReader.readLine
故意处理\n
,\r\n
和\r
我相信。(刚刚选中:“读取一行文本。行被视为由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任何一个终止。”)。我没有意识到。这根本不解决问题。这根本不解决问题。