繁体   English   中英

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

[英]Server Socket Isn't Sending Data Back in 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 closed\n-----------------------------");
}
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在读取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 closed\n-----------------------------");
} 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())

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM