服务器套接字未在 Java 中发送回数据



所以,我刚刚学会了如何用Java制作socket和所有好东西,所以我的第一次尝试得到了来自客户端的消息,然后客户端崩溃了。应该发生的是从客户端获取一条消息,如果该消息等于此消息,则发送回数据。但是,即使消息正确,消息是否正确if函数也不会触发。

即使我删除if函数以检查字符串是否正确,程序仍然冻结。顺便说一下,我的服务器是控制台应用程序,我的客户端是SWT应用程序。

以下是删除了if函数的服务器代码:

try {
System.out.println("Waiting for a connection...");
// Start a server
ServerSocket server = new ServerSocket(3211);
// Listen for anyone at that port
Socket socket = server.accept();
System.out.println("The client has connected!");
// Get the data being sent in
DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream ouputStream = new DataOutputStream(socket.getOutputStream());
// Turn that into UTF-8
String data = inputStream.readUTF();
System.out.println("Received " + data);
ouputStream.writeUTF("Great!");
System.out.println("Awesome!");
socket.close();
inputStream.close();
ouputStream.close;
server.close();
System.out.println("Socket closedn-----------------------------");
}
catch(IOException e) {
System.out.println(e);
}

和客户端(按下按钮时触发(:

try {
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nConnecting to the server...");
Socket socket = new Socket("192.168.1.206", 3211);
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nConnected to the server!");
DataInputStream input = new DataInputStream(System.in);
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.writeUTF("sweet");
String data = input.readUTF();
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nSERVER: " + data);
input.close();
output.close();
socket.close();
}
catch (IOException er) {
allMessagesTextBox.setText(allMessagesTextBox.getText() + "n" + er);
}

一旦我按下按钮尝试启动连接(服务器已经在运行(,客户端就会立即冻结。它甚至不发送任何"连接到服务器"之类的东西。

知道出了什么问题,以及如何解决这个问题吗?

您的客户正在读取System.in。它应该从套接字输入流中读取。

注意:你只需要关闭一个套接字的最外层输出流。如有必要,它会刷新它并关闭输入流和套接字。您目前不仅关闭了不必要的内容,而且关闭顺序错误,

套接字无法发送数据,因为您没有在outputstream引用上调用.flush()方法。使用这个,你不必在流上显式编写flush()close()方法

服务器代码

System.out.println("Waiting for a connection...");
// Start a server
try (ServerSocket server = new ServerSocket(3211)) {
// Listen for anyone at that port
try (Socket socket = server.accept()) {
System.out.println("The client has connected!");
// Get the data being sent in
try (DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()))) {
try (DataOutputStream ouputStream = new DataOutputStream(socket.getOutputStream())) {
// Turn that into UTF-8
String data = inputStream.readUTF();
System.out.println("Received " + data);
ouputStream.writeUTF("Great!");
System.out.println("Awesome!");
}
}
}
System.out.println("Socket closedn-----------------------------");
} catch (IOException e) {
System.out.println(e);
}

客户端代码

try {
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nConnecting to  the server...");
try (Socket socket = new Socket("127.0.0.1", 3211)) {
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nConnected to the server!");
try (DataInputStream input = new DataInputStream(socket.getInputStream())) {
try (DataOutputStream output = new DataOutputStream(socket.getOutputStream())) {
output.writeUTF("sweet");
}
String data = input.readUTF();
System.out.println(String.format("data received from server '%s':n", data));
allMessagesTextBox.setText(allMessagesTextBox.getText() + "nSERVER: " +  data);
}
}
} catch (IOException er) {
allMessagesTextBox.setText(allMessagesTextBox.getText() + "n" + er);
}

服务器上的输出

Waiting for a connection...
The client has connected!
Received sweet
Awesome!
Socket closed
-----------------------------

客户端上的输出

data received from server 'Great!':

现在转到代码中的问题。

查看您编写的客户端代码DataInputStream input = new DataInputStream(System.in);而不是DataInputStream input = new DataInputStream(socket.getInputStream())

这导致从服务器接收消息失败

最新更新