我有一个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字节顺序明确了如何将长度发送到服务器