Java客户端 - 服务器问题

时间:2013-05-24 12:02:42

标签: java sockets client-server

请查看示例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);
}

我无法理解为什么这只适用于第一条消息。

有人可以解释一下吗?

更新

Sysouts:

服务器端:

`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`

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

好的,对不起,没见过。问题出在服务器端。 ServerSocket只是一个侦听套接字,用于接受来自许多客户端的连接。通常,您将在每个“accept”之后启动一个新的Thread,它将处理生成的Socket对象。

套接字对象最终代表您的真实连接。现在,你必须使用循环来从你的套接字读取,而不是从serversocket读取。

最后,这意味着服务器端未正确实现。

如果你需要的话,你也可以用它来参加单线程环境中的一个客户端,但是正确的做法是关闭while循环中的套接字对象(在结尾),并拥有循环它仅为读/写函数控制消息。

此致