Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Java 请有人解释一下为什么我';我无法通过TCP将大字节[]发送到服务器_Java_Sockets_Tcp_Serversocket - Fatal编程技术网

Java 请有人解释一下为什么我';我无法通过TCP将大字节[]发送到服务器

Java 请有人解释一下为什么我';我无法通过TCP将大字节[]发送到服务器,java,sockets,tcp,serversocket,Java,Sockets,Tcp,Serversocket,有人能给我解释一下为什么服务器上的byte[]buf不包含客户端发送的100000个1s吗?在大约60k字节标记处,值保持为全零。我承认我没有在流或TCP方面做过很多工作,所以我肯定我做错了什么;我只是不明白那是什么。我在服务器上用InputStream和BufferedInputStream尝试了这一点,得到了相同的结果。感谢所有能抽出时间向我解释这一点的人 客户端代码非常简单: byte[] msgBytes = new byte[100000]; for (int i=0;

有人能给我解释一下为什么服务器上的
byte[]buf
不包含客户端发送的100000个1s吗?在大约60k字节标记处,值保持为全零。我承认我没有在流或TCP方面做过很多工作,所以我肯定我做错了什么;我只是不明白那是什么。我在服务器上用
InputStream
BufferedInputStream
尝试了这一点,得到了相同的结果。感谢所有能抽出时间向我解释这一点的人

客户端代码非常简单:

    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();
        }
    }

尝试将
BufferedInputStream
替换为
DataInputStream
,并轻松使用
以使服务器代码变为:

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
替换为
DataInputStream
,并轻松使用
以使服务器代码变为:

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
 };

是的,但无论如何你需要阅读所有的流,你不知道另一边的大小。此外,您不应该将流内容读取到内存中,但最好尝试处理它

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
 };

不确定这是否是您的问题,但通常您应该循环阅读流,直到您到达末尾。谢谢您的回复!麻烦你举个例子好吗?我如何知道它是结束的?BufferedInputStream.read(…)返回:读取到缓冲区中的字节总数,或者-1,如果由于已到达流的结尾而没有更多数据。不确定这是否是您的问题,但通常您应该循环读取流,直到到达结尾。感谢您的回复!麻烦你举个例子好吗?我如何知道它是结束的?BufferedInputStream.read(…)返回:读取到缓冲区中的字节总数,如果由于到达流的结束而没有更多数据,则返回-1。