Java Server& C#客户冻结

时间:2016-11-01 15:50:35

标签: java c# server client

我有一个Java Server和一个C#Client。而且我确实确定客户端上的outputstreamer或服务器上的输入流出了问题。

byte[] arr = IOUtils.toByteArray(is,14);
PrintWriter out = new PrintWriter(os, true);
out.print("Received "+ new String(arr,"UTF-8"));
out.flush();
out.close();

"是"在这种情况下是输入流变量。来自Socket.getInputStream()。 删除流的长度(在这种情况下为14)会导致系统超时。客户没有得到任何响应,除了:"读取失败"

客户端包含C#程序

 byte[] start = getIdentifier();
 byte[] end = Encoding.UTF8.GetBytes(toSend);
 byte[] arr = start.Concat(end).ToArray();
 //Arr variable is a couple of strings smashed together and transformed into a byte[]

 networkStream.Write(arr, 0, arr.Length);
 networkStream.Flush();
 StreamReader streamReader = new StreamReader(networkStream);
 result = streamReader.ReadToEnd();

我实际上也尝试使用BinaryWriter写入服务器,但这也没有用。如果我知道将要发送的数据长度,我可以解决问题。但我不知道如何将流的长度发送到服务器。

我尝试使用Available()来查看有多少内容可读,但由于某些原因,有时候是0.如果数据尚未由客户端发送。

关于如何解决冻结的任何想法?

编辑:

我想我理解流媒体现在如何运作。 起初我在客户端这样做了:

var length = BitConverter.GetBytes(arr.Length);
Array.Reverse(length);

然后在服务器端我放了这段代码:

 /* Get Input Data Length */
 byte[] arr = IOUtils.toByteArray(is, 4);
 int length = (arr[0] << 24) & 0xff000000 |
              (arr[1] << 16) & 0x00ff0000 |
              (arr[2] << 8) & 0x0000ff00 |
              (arr[3] << 0) & 0x000000ff;

 /* Get Input Data */
 arr = IOUtils.toByteArray(is, length);

@Andreas你提到的big-endian字节顺序明确了如何将长度发送到服务器

0 个答案:

没有答案