【问题标题】:Java client-server issueJava客户端-服务器问题
【发布时间】:2013-05-24 12:02:41
【问题描述】:

请看示例here

希望能够保持连接有效并向服务器发送多个客户端消息,我将代码更改为:

// Send the message to the server
OutputStream os = Client.socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
InputStream is = Client.socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

for (int i = 0; i < 10; i++) {
    String sendMessage = i + "\n";
    bw.write(sendMessage);
    bw.flush();
    System.out.println("Message sent to the server : " + sendMessage);
    String message = br.readLine();
    System.out.println("Message received from the server : " + message);
}

我不明白为什么这只适用于第一条消息。

谁能解释一下?

更新:

系统输出:

服务器端:

`Server Started and listening to the port 25000`
`Message received from client is 0`
`Message sent to the client is 0`

客户端:

`Message sent to the server : 0`
`Message received from the server : 0`
`Message sent to the server : 1`

【问题讨论】:

  • 看起来服务器正在关闭连接。你有你的代码打印的值吗?有服务器代码吗?
  • @Martin,是的,服务器代码是引用网站上列出的代码。服务器说:服务器已启动并监听端口 25000 从客户端接收的消息为 0 发送到客户端的消息为 0。
    客户端说:发送到服务器的消息:0 从服务器接收的消息:0 发送到的消息服务器:1
  • 服务器读取一条消息,发送响应,然后关闭套接字。所以显然你还必须改变服务器。

标签: java sockets client-server


【解决方案1】:

我在发布的代码link 中看到的问题是服务器没有完全处理请求,它接受(客户端套接字连接)并读取此连接上可用的任何内容,然后等待您的客户端的更多客户端连接(接受)程序从不制作(这很好)。

它不会继续读取客户端的输入流(只读取一次),因此在第一次请求后发送给客户端的任何内容都会被丢弃。

在服务器端,一旦与客户端(接受)建立连接,就会派生一个新线程并将关联的套接字传递给它。在这个线程中(比如请求处理程序)有一个围绕套接字输入流的循环

Server:

 Socket socket = serverSocket.accept()
 InputStream is = socket.getInputStream();
 InputStreamReader isr = new InputStreamReader(is);
 BufferedReader br = new BufferedReader(isr);
while(socket.isConnected() && !socket.isInputShutdown())
{
 String number = br.readLine(); //this would block until message arrives from client socket
 //further logic
 //write back to client etc
}

【讨论】:

    【解决方案2】:

    好的,抱歉,没看到。问题出在服务器端。 ServerSocket 只是一个侦听套接字,用于接受来自许多客户端的连接。通常,您将在每个“接受”之后启动一个新线程,该线程将处理生成的 Socket 对象。

    套接字对象最终代表了您的真实连接。现在,您必须使用循环的地方是从您的套接字读取,而不是从服务器套接字读取。

    最后,说明Server端没有正确实现。

    如果你需要的话,你也可以用它在单线程环境中只处理一个客户端,但是正确的做法是关闭 while 循环内的套接字对象(在最后),并让循环只为读/写功能控制消息。

    问候

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2011-05-26
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多