Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java客户端服务器问题_Java_Sockets_Client Server - Fatal编程技术网

Java客户端服务器问题

Java客户端服务器问题,java,sockets,client-server,Java,Sockets,Client Server,请看一看这个例子 为了使连接保持活动状态并向服务器发送多条客户端消息,我将代码更改为: // Send the message to the server OutputStream os = Client.socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); InputStream is = Client

请看一看这个例子

为了使连接保持活动状态并向服务器发送多条客户端消息,我将代码更改为:

// 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);
}
客户端:

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

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

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

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

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
}

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

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

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

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
}

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

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

最后,这意味着服务器端没有正确实现

如果您需要的话,也可以使用它在单线程环境中只处理一个客户机,但是正确的做法是关闭while循环中的socket对象(在最后),并让循环仅为读/写函数控制消息


问候

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

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

最后,这意味着服务器端没有正确实现

如果您需要的话,也可以使用它在单线程环境中只处理一个客户机,但是正确的做法是关闭while循环中的socket对象(在最后),并让循环仅为读/写函数控制消息


关于

服务器似乎正在关闭连接。您是否有代码打印的值?你有服务器代码吗?@Martin,是的,服务器代码是参考网站上列出的代码。服务器说:服务器启动并侦听端口25000,从客户端收到的消息是0,发送到客户端的消息是0
客户端显示:发送到服务器的消息:从服务器接收到的消息:0发送到服务器的消息:1服务器读取一条消息,发送响应,然后关闭套接字。显然,您还必须更改服务器。看起来服务器正在关闭连接。您是否有代码打印的值?你有服务器代码吗?@Martin,是的,服务器代码是参考网站上列出的代码。服务器说:服务器启动并侦听端口25000,从客户端收到的消息是0,发送到客户端的消息是0
客户端显示:发送到服务器的消息:从服务器接收到的消息:0发送到服务器的消息:1服务器读取一条消息,发送响应,然后关闭套接字。因此,显然,您还必须更改服务器。