Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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
C# Java套接字从C中读取字节#_C#_Java_Sockets - Fatal编程技术网

C# Java套接字从C中读取字节#

C# Java套接字从C中读取字节#,c#,java,sockets,C#,Java,Sockets,我试图读取Java应用程序中从C#应用程序发送的字节[] 但是,当我用C#将字符串编码为字节[]并用Java读取它时,使用下面的代码,我得到了除了最后一个字符以外的所有字符。为什么呢 Java接收代码: int data = streamFromClient.read(); while(data != -1){ char theChar = (char) data; data = streamFromClient.read(); System.out.println(""

我试图读取Java应用程序中从C#应用程序发送的
字节[]

但是,当我用C#将
字符串
编码为
字节[]
并用Java读取它时,使用下面的代码,我得到了除了最后一个字符以外的所有字符。为什么呢

Java接收代码:

int data = streamFromClient.read();
while(data != -1){
    char theChar = (char) data;
    data = streamFromClient.read();
    System.out.println("" + theChar);
}
C#发送代码:

public void WriteMessage(string msg){

    byte[] msgBuffer = Encoding.Default.GetBytes(msg);
    sck.Send(msgBuffer, 0, msgBuffer.Length, 0);
}

除非数据变成
-1
,否则需要一直读取数据。 因此,您需要将reading语句移动到
无限循环中,即
while(true)
,如果结果为
-1
,则从中退出一次

试试这个:

 int data = -1;
 while(true){
 data=streamFromClient.read();
 if(data==-1)
 {     
    break;
 }
 char theChar = (char) data;     
 System.out.println("" + theChar);
 }

我原以为你的
while
循环在某种程度上已经停止了1次迭代,但在我看来,你的C#程序根本没有发送所有字符。

虽然其他人已经提供了一个可能的解决方案,但我想展示一下我将如何解决这个问题

int data;
while((data=streamFromClient.read()) != -1) {
  char theChar = (char) data;
  System.out.println("" + theChar);
}
我只是觉得这个方法会更清晰一些。自由选择你更喜欢的


澄清:您的接收代码中有错误。您读取了最后一个字节,但从未处理它。在每次迭代中,您都会打印出上一次迭代中接收到的字节值。因此,当数据为-1时,最后一个字节将被处理,但您没有进入循环,因此它不会被打印。

我猜您没有发送最后一个字符。^是的lol。我们可以看到您的发送代码吗?我在while循环中将C代码添加到postYou call read()中两次,我认为这是无效的。你会漏掉一半字符。@C4stor:这是错误的,我从OP的帖子中复制了实际代码后忘记删除了它,谢谢。没有必要将“数据”初始化为-1。我不确定为什么我收到了否决票,或者为什么接受的解决方案是“接受的”。是的,它每次通过循环打印上一次迭代的值,但是当上一次迭代中的数据为-1时,这意味着没有更多的数据需要处理。因此,没有理由再次进行循环。