2014-02-13 43 views
0

我正在尝试从我的Java应用程序中读取从C#应用程序发送的byte[]Java socket从C#读取字节#

但是,当我在C#中编码stringbyte[],并使用下面的代码在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); 
} 
+2

我的猜测是你没有发送最后一个字符。 –

+0

^是的大声笑。 我们可以看到您的发送代码吗? – Mozzie

+0

我将C#代码添加到帖子中 –

回答

2

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

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

我只是觉得这种方法会更清楚一点。随意选择你更喜欢的东西。

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

+0

没有必要将“数据”初始化为-1。 – C4stor

+0

你是对的。编辑。 – user432

1

你需要读取数据,直到除非是成为-1。 因此,如果结果为-1,您需要将infinite loop内的阅读说明(即while(true))从其中移出一次。

试试这个:

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

您在while循环中调用了read()两次,我认为这是无效的。你会错过一半的人物。 – C4stor

+0

@ C4stor:这是错误的,我忘记从OP的帖子复制实际代码后删除,谢谢 –

-2

我以为你while循环可能通过1次迭代不知何故已经关闭,但在我看来,你的C#程序根本就没有发送的所有字符。

+0

我不知道为什么我收到了投票或接受的解决方案为什么被“接受”。是的,它每次都通过循环打印上一次迭代的值,但是当前一次迭代中的数据为-1时,意味着不再需要处理。因此没有理由再次通过循环。 – M7Jacks