繁体   English   中英

Java套接字通信问题

[英]Java socket communication problem

我正在使用Java进行套接字通信。 服务器正在从客户端读取字节,如下所示:

InputStream inputStream;
final int BUFFER_SIZE = 65536;
byte[] buffer = new byte[BUFFER_SIZE];
String msg="";

while (msg.indexOf(0)==-1 && (read = inputStream.read(buffer)) != -1)
{
    msg += new String(buffer, 0, read);
}
handleMessage(msg)

当客户端在服务器混合消息时一次发送多个消息时,会出现问题

MSG1: <MyMessage><Hello/>nul
MSG2: </MyMessage><MyMessage><Hello again /></MyMessage>nul

因此,消息1的尾部是消息2的一部分。null表示java nul符号。

为什么输入流会混合消息?

提前致谢!

您做错了比较。 您检查字符串中的任何地方是否有\\ 0,然后认为它是一条消息。 错误。 实际上,在第二个示例中,\\ 0出现两次。

您应该以其他方式进行操作。 从char中以char形式从Stream中读取(使用包装的BufferedInputStream,否则性能将很糟糕),并在达到\\ 0时跳过。 现在消息已完成,您可以处理它。

InputStream bin = new BufferedInputStream(inputStream);
InputStreamReader reader = new InputStreamReader(bin);
StringBuilder msgBuilder = new StringBuilder();
char c;
while ( (c=reader.read()) != -1 ) 
{
    msgBuilder .append(c);
}
handleMessage(msgBuilder.toString())

最好使用换行符进行行分隔。 在这种情况下,您可以只使用BufferedReader的readline()功能。

套接字和InputStream只是字节流,而不是消息。 如果要基于\\0这样的字符分解流,则需要自己执行此操作。

但是,在您的情况下,您似乎在发送方遇到了一个错误,因为\\0位置不正确,并且在客户端很容易成为错误。

顺便说一句:使用字符串+ =效率很低。

InputStream读取的数据将随操作系统一起提供,并且无法保证如何拆分。 如果您希望分拆新行,则可能需要考虑以下内容:

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

然后使用reader.readLine()将每一行作为String ,这就是您的消息。

我认为您的问题出在您的方法中:

客户端一次发送多个消息时出现问题

套接字通常只获取大块字节,窍门在于如何发送它们,如何标记消息的开始/结束以及如何检查错误(快速哈希可以做很多事情),因此该行为是在我看来,如果确实需要一次发送多封邮件,则只需要处理邮件即可。

套接字将控制您的消息是否是完整的物理方法,但是消息中所涉及的是您的关注。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM