【问题标题】:Java Server Client communication seems to stuckJava Server Client 通信似乎卡住了
【发布时间】:2016-06-19 13:02:08
【问题描述】:

你好 stackoverflow 社区,

我遇到了一个关于 Java 中套接字通信的问题。

这是我的服务器和客户端类的示例代码:

服务器:

public class OTPServer {


static ServerSocket serverSocket;
final static int PORT = 4242;
static Socket clientConnection;

public static void main(String[] args) {

    try {
        serverSocket = new ServerSocket(PORT);
        System.out.println("Socket initialized");
        String serverMessage = "Hello, I am the Host";
        ServerTool serverTool = new ServerTool();

        while (true) {
            clientConnection = serverSocket.accept();
            if(clientConnection.isConnected()) {
                System.out.println("Client connected");
            }

            BufferedReader clientInputReader = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
            DataOutputStream serverOutput = new DataOutputStream(clientConnection.getOutputStream());
            System.out.println("Sending message to client: " + serverMessage);
            serverOutput.writeBytes(serverTool.encodeMessage(serverMessage));
            serverOutput.flush();
            String clientMessage = clientInputReader.readLine();
            System.out.println("Encoded answer from client: " + clientMessage);
            String decodedMessage = serverTool.decodeMessage(clientMessage);
            System.out.println("Decoded answer from client: " + decodedMessage);

            serverOutput.close();
            clientInputReader.close();

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("Hello, I am the OTP Server!");

}

这里是客户端:

public class OTPClient {

static Socket clientSocket;
final static int PORT = 4242;
final static String HOST = "localhost";


public static void main(String[] args) {
    System.out.println("I am the OTP Client!");
    String serverMessage;
    String clientResponse = "I am the Client";
    OTPTool otpTool = new OTPTool();

    try {

        clientSocket = new Socket(HOST, PORT);
        BufferedReader serverInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        DataOutputStream outputStream = new DataOutputStream(clientSocket.getOutputStream());
        System.out.println("Connection to Host established");
        serverMessage = serverInput.readLine();
        System.out.println("Encoded Message from Server: " + serverMessage);
        String decodedMessage = otpTool.decodeMessage(serverMessage);
        System.out.println("Decoded message from Server: " + decodedMessage);
        System.out.println("Answering with own message: " + clientResponse);
        outputStream.writeBytes(clientResponse);
        outputStream.flush();
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

现在我的问题出在哪里:

连接建立并且服务器似乎将其消息发送到客户端并等待应答。客户端不打印他从服务器获得的消息。 一旦我取消服务器,客户端就会打印它从服务器获得的消息以及信息,答案是发送端退出,退出代码为 0,所以看起来这部分很好,只是以某种方式卡住了。 正如您在给出的示例代码中看到的那样,我已经尝试刷新 outputStream。

我有什么明显的遗漏吗? 我知道,这确实是基本的东西,但这是我第一次使用套接字进行通信。

提前谢谢你!

最好的问候, 罗尼

顺便说一句:我知道服务器只连接到一个请求连接的客户端。这对我来说绝对足够了。

【问题讨论】:

  • 绝对是死锁/并发问题。您按什么顺序运行这些类中的每一个?
  • 您正在调用 readLine。您的serverTool.encodeMessage 是否在邮件末尾包含换行符?
  • @BrettOkken 目前serverTool.encodeMessage 只返回参数字符串。 @vontell 首先我启动服务器,然后启动客户端,这应该没问题,因为服务器正在等待客户端连接到它。

标签: java sockets client-server communication


【解决方案1】:

它被卡住了,因为serverInput.readLine(); 阻塞,直到遇到换行符或文件结尾。在服务器端,您没有发送换行符,因此客户端阻塞。

【讨论】:

  • 谢谢!我不知道,常规的字符串返回值不包括它们。现在完美地工作。有没有办法在没有换行符或文件结尾的情况下读取输入?
  • 当然。不要打电话给readLine。使用其他读取方法之一。这需要您定义一个定义消息开始/停止的“协议”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多