我通过使用ServerSockets和Sockets在Java中使用TCPIP开发了一个应用程序。该应用程序是一个侦听器,用于侦听到达指定端口的消息。当消息到达时,它将被处理并完成各种事情。我的公司提供了一个小应用程序,它充当发送消息的客户端。最近,他们扩展了一次性发送多条消息的小应用程序。
现在,作为Listener的应用程序没有完全收到多条消息。我试图增加ServerSocket上的默认缓冲区,但仍然没有收到完整的消息。怎么调试呢?该公司有另一个应用程序的工作版本,可立即发送消息,并立即收到。 Listener应用程序一次接收一条消息。以下代码是一个示例:
@Startup
@Singleton
public class Listener {
private ServerSocket serverSocket;
private Socket socket;
@Resource
private ScheduledExecutorService executor;
@PostConstruct
public void init() {
serverSocket = new ServerSocket(portNumber);
Runnable runnable = new Runnable() {
public void run() {
try {
if(socket == null) {
socket = serverSocket.accept();
socket.setKeepAlive(true);
}
else if(socket.isClosed()) {
socket = serverSocket.accept();
socket.setKeepAlive(true);
}
char[] messages = buildMessage(socket.getInputStream());
}
catch(Exception e) {
System.out.println("Exception occurred");
e.printStackTrace();
}
}
};
executor.scheduleAtFixedRate(runnable, 0, 0, TimeUnit.SECONDS);
}
public char[] buildMessage(InputStream inputStream) throws Exception {
StringBuilder message = null;
char[] values = null;
if(inputStream != null) {
message = new StringBuilder();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
int byteRead = bufferedInputStream.read();
while(byteRead != -1) {
char value = (char) byteRead;
message.append(value);
// check how many bytes available
if(bufferedInputStream.available() != 0) {
byteRead = bufferedInputStream.read();
}
else {
// to avoid blocking of data
break;
}
}
}
}
}
答案 0 :(得分:0)
TCP中没有消息。
它是一个字节流,可以一次只接收一个字节的块接收。
如果您想要留言,您必须自己实施,直到您拥有所需的一切为止。
这可能需要更改或提供应用程序协议,如行,XML,长度字前缀等,以便您知道消息停止的位置。