TCP。即使服务器不接受他,客户端也会连接

时间:2015-07-19 15:27:07

标签: java tcp client-server

我有TCP服务器 - 客户端应用程序。它有效,但有时会发生一些事情。客户端连接到服务器,但服务器说他不接受他。

服务器端代码:

while(!stopped){
            try {
                AcceptClient();
            } catch(SocketTimeoutException ex){
                continue;
            } catch (IOException ex) {
                System.err.println("AppServer: Client cannot be accepted.\n"+ex.getMessage()+"\n");
                break;
            }
...

private void AcceptClient() throws IOException {
    clientSocket = serverSocket.accept();
    clientSocket.setSoTimeout(200);
    out = new ObjectOutputStream(clientSocket.getOutputStream());
    in = new ObjectInputStream(clientSocket.getInputStream());
    System.out.println("Accepted connection from "+clientSocket.getInetAddress());
}

客户端代码:

    try {
        socket = new Socket(IPAddress, serverPort);
        socket.setSoTimeout(5000);
        out = new ObjectOutputStream(socket.getOutputStream());
        in = new ObjectInputStream(socket.getInputStream());
    } catch (IOException e1) {
        sendSystemMessage("DISCONNECTED");
        sendSystemMessage(e1.getMessage());
        return;
    }
    sendSystemMessage("CONNECTED");

如果客户端连接消息:

  

显示来自...的已接受连接。但有时它不会出现   即使客户发送消息“已连接”

服务器仍在运行循环尝试获取客户端并且它正在捕获socketTimeoutException。客户端已连接,发送消息并等待响应。

2 个答案:

答案 0 :(得分:1)

我怀疑失踪'冲洗'在您的客户的内部' sendSystemMessage()'。 不幸的是,ObjectInputStream的构造函数尝试从底层流中读取一个头(这不是非常直观的恕我直言)。因此,如果客户端无法刷新数据 - 服务器可能仍然停留在线路上" in = new ObjectInputStream(socket.getInputStream())" ...

作为旁注,服务器通常每个传入客户端启动一个线程更好,但这只是一个侧面评论(加上它显然取决于要求)。

答案 1 :(得分:0)

我发现了问题。我的网络上的通信速度太慢,因此获取输入流的时间过长。解决方案有两个部分。在获取输入流之前刷新输出流。并在初始化流后设置套接字时间。

服务器端:

clientSocket = serverSocket.accept();
out = new ObjectOutputStream(clientSocket.getOutputStream());
out.flush()
in = new ObjectInputStream(clientSocket.getInputStream());
clientSocket.setSoTimeout(200);