我希望在连接后向客户发送回复
以下是代码的片段
try {
while (true)
{
in = socket.getInputStream();
out = socket.getOutputStream();
byte[] reception = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = in.read(reception);
String bufferServer = "Buffer Server ";
baos.write(reception, 0, read);
reception = baos.toByteArray();
String chaine = new String(reception, "Cp1252");
System.out.println("Reception from client : " + chaine);
byte[] bufferServeurToClient = bufferServer.getBytes();
out.write(bufferServeurToClient); // send to client
out.flush();
}
}
客户可以发送多个请求,即'为什么我使用while(true)来监听请求直到客户端断开连接。
问题是我从客户端的服务器端没有收到任何信息。 如果我删除while(true)它工作,我收到变量" bufferServeurToClient"在客户端
编辑:客户端现在正在工作,但是当我打印响应时,我的字符串后面有很多奇怪的字符(方块),为什么?
String ip = InetAddress.getLocalHost ().getHostAddress ();
Socket socket = new Socket(ip, port);
System.out.println("SOCKET = " + socket);
InputStream in = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
OutputStream out = socket.getOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(out);
String bufferClient="Buffer Client ";
byte[] bufferClientToServer= bufferClient.getBytes();
out.write(bufferClientToServer);
byte[] reception = new byte[1024] ;
int read;
while ((read = bis.read(reception)) != -1){
String chaine = new String( reception , "Cp1252" );
System.out.println("Reception from server: " + chaine);
}
bis.close();
bos.close();
}
感谢您的帮助
答案 0 :(得分:3)
客户端可以发送多个请求,这就是我使用while(true)的原因,以便在客户端断开连接之前监听请求。
如果客户端可以发送多个请求,您需要一种区分它们的方法 - 响应之间的和。目前,您只是假设只需拨打一次read
即可完成此任务:
int read =in.read(reception);
可以读取请求的部分,或者可能是多个请求。修复此问题的常见选项是使用某种分隔符(例如,每个文本行一个请求)或使用长度前缀,其中(比方说)每个请求或响应的前四个字节表示有多少数据。
现在您还没有显示客户端的样子 - 但我的猜测是您实际上正在等待服务器关闭连接,当然您永远不会这样做而while(true)
循环就在那里。这是您需要修改的另一段代码。
答案 1 :(得分:1)
如果您发送多个请求,它们很可能会被作为单个请求读取。这是因为流没有消息的概念,所以如果你写了很多字节,就可以用任何方式读取它们。例如一次一个字节,或一次全部。
无论如何,你应该至少得到一个回复。
答案 2 :(得分:1)
在打印任何内容之前,您正在客户端阅读EOS,并且服务器永远不会关闭连接,因此没有EOS。
您不需要所有这些ByteArrayOutputStreams。仔细查看您的代码,您将看到它们可以完全消除。这也将解决EOS问题。
如果read()返回-1,服务器应关闭套接字。
答案 3 :(得分:0)