我使用ServerSocket在while循环中从客户端获取数据,它在第一次运行时工作,但在第二轮后失败。
我做了一些搜索,但仍然无法弄清楚发生了什么。
服务器端代码
package com.gorilla.main;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(44444);
while(true){
System.out.println("another round");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
System.out.println("available: "+ inputStream.available());
byte[] b = new byte[inputStream.available()];
inputStream.read(b);
System.out.println(new String(b));
System.out.println("=======================");
socket.close();
}
}
}
Clent side code
package com.gorilla.main;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client2 {
public static void main(String [] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 44444);
String s = "Hello World";
byte [] b = s.getBytes();
socket.getOutputStream().write(b);;
socket.close();
}
}
在我运行客户端3次后,和服务器端控制台的输出。
another round
available: 11
Hello World
=======================
another round
available: 0
=======================
another round
available: 0
=======================
another round
任何建议都将不胜感激。感谢。
答案 0 :(得分:2)
使用InputStream.available()
来调整缓冲区的大小,而不是从套接字中读取的内容。你应该分配一个缓冲区(通常是静态大小,或者可以是可配置的)并在循环中读取
// server code
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) > -1) {
// do something
}
InputStream.available():
返回可读取的字节数的估计值(或 从此输入流中跳过)而不会被下一个阻塞 调用此输入流的方法。下一次调用 可能是同一个线程或另一个线程。单个读取或跳过 这么多字节不会阻塞,但可以读取或跳过更少的字节。
如果您的协议是基于文本的,则可以将套接字的输入流包含在Scanner
内,从而使循环变为
while (scanner.hasNextLine()) {
String line = scanner.next();
}