有人请解释为什么我无法通过 TCP 将大字节 [] 发送到服务器
Someone please explain why I'm having trouble sending large byte[] to server via TCP
有人可以向我解释为什么服务器上的 byte[] buf
不包含客户端发送的 100,000 个 1 吗?在大约 60k 字节标记处,值保持全零。我承认我在 Streams 或 TCP 方面的工作不多,所以我确定我做错了什么;我只是不明白它是什么。我在服务器上对 InputStream
和 BufferedInputStream
都进行了尝试,结果相同。感谢 anyone/everyone 花时间给我解释一下!
客户端代码非常简单:
byte[] msgBytes = new byte[100000];
for (int i=0;i<msgBytes.length;i++){
msgBytes[i] = 1;
}
Socket sck = null;
try {
sck = new Socket("my.server.net", 1234);
OutputStream outStream = sck.getOutputStream();
outStream.write(msgBytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sck.close();
} catch (IOException e) {
e.printStackTrace();
}
}
同样,服务器代码也很简单:
ServerSocket srvSock = new ServerSocket(1234);
Socket sock = srvSock.accept();
returnAddress = sock.getInetAddress();
returnPort = sock.getPort();
BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000);
byte[] buf = new byte[100000];
iStream.read(buf);
尝试将 BufferedInputStream
替换为 DataInputStream
并使用 readFully
,因此您的服务器代码应变为:
ServerSocket srvSock = new ServerSocket(1234);
Socket sock = srvSock.accept();
returnAddress = sock.getInetAddress();
returnPort = sock.getPort();
DataInputStream iStream = new DataInputStream(sock.getInputStream());
byte[] buf = new byte[100000];
iStream.readFully(buf);
是的,但无论如何你需要阅读所有的流,你不知道另一边的大小。此外,您不应该将流内容读取到内存中,而最好尝试对其进行处理。
BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000);
byte[] buf = new byte[100000];
int cnt;
StringBuffer content = new StringBuffer();
while ((cnt = iStream.read(buf)) != -1) {
content.append(buf); // you should not store content of stream, but better process it if possible
};
有人可以向我解释为什么服务器上的 byte[] buf
不包含客户端发送的 100,000 个 1 吗?在大约 60k 字节标记处,值保持全零。我承认我在 Streams 或 TCP 方面的工作不多,所以我确定我做错了什么;我只是不明白它是什么。我在服务器上对 InputStream
和 BufferedInputStream
都进行了尝试,结果相同。感谢 anyone/everyone 花时间给我解释一下!
客户端代码非常简单:
byte[] msgBytes = new byte[100000];
for (int i=0;i<msgBytes.length;i++){
msgBytes[i] = 1;
}
Socket sck = null;
try {
sck = new Socket("my.server.net", 1234);
OutputStream outStream = sck.getOutputStream();
outStream.write(msgBytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sck.close();
} catch (IOException e) {
e.printStackTrace();
}
}
同样,服务器代码也很简单:
ServerSocket srvSock = new ServerSocket(1234);
Socket sock = srvSock.accept();
returnAddress = sock.getInetAddress();
returnPort = sock.getPort();
BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000);
byte[] buf = new byte[100000];
iStream.read(buf);
尝试将 BufferedInputStream
替换为 DataInputStream
并使用 readFully
,因此您的服务器代码应变为:
ServerSocket srvSock = new ServerSocket(1234);
Socket sock = srvSock.accept();
returnAddress = sock.getInetAddress();
returnPort = sock.getPort();
DataInputStream iStream = new DataInputStream(sock.getInputStream());
byte[] buf = new byte[100000];
iStream.readFully(buf);
是的,但无论如何你需要阅读所有的流,你不知道另一边的大小。此外,您不应该将流内容读取到内存中,而最好尝试对其进行处理。
BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000);
byte[] buf = new byte[100000];
int cnt;
StringBuffer content = new StringBuffer();
while ((cnt = iStream.read(buf)) != -1) {
content.append(buf); // you should not store content of stream, but better process it if possible
};