Java非阻塞SocketChannel在特定大小后不接收

Java非阻塞SocketChannel在特定大小后不接收,java,nonblocking,socketchannel,Java,Nonblocking,Socketchannel,我的代码分为三类:协调器、发送器和接收器。Coordinator从用户处获取一个大小,并将其通知发件人。然后发送方首先将这个大小告诉接收方,然后将那个么多数据发送给接收方。一旦接收器接收到整个尺寸,它就会通知协调器接收到的尺寸。此循环完成后,协调器将等待来自用户的另一个大小输入 整个系统在尺寸为1K、32K甚至64K时运行良好。然而,当我进一步增大尺寸时,问题是接收器在达到一定尺寸后停止接收。在大多数情况下,它是86800字节。它只是卡在那里,没有更多的数据。发送方发送整个数据,连接完好无损(我

我的代码分为三类:协调器、发送器和接收器。Coordinator从用户处获取一个大小,并将其通知发件人。然后发送方首先将这个大小告诉接收方,然后将那个么多数据发送给接收方。一旦接收器接收到整个尺寸,它就会通知协调器接收到的尺寸。此循环完成后,协调器将等待来自用户的另一个大小输入

整个系统在尺寸为1K、32K甚至64K时运行良好。然而,当我进一步增大尺寸时,问题是接收器在达到一定尺寸后停止接收。在大多数情况下,它是86800字节。它只是卡在那里,没有更多的数据。发送方发送整个数据,连接完好无损(我使用isConnected()API进行了检查)。你知道为什么这样不行吗

以下是发件人的代码:

/*Makes connection with coordinator and opens a socket for receiver to connect here*/
 while (true) {
                int size = Utils.receiveInt(coordinator);
                Utils.sendInt(size, receiver);
                Utils.sendTill(size, receiver, null);
            }
以下是接收端的代码: /与协调员和发件人建立连接/

以下是我的Utils代码:

public static boolean sendInt (int num, SocketChannel channel) throws IOException{
        return sendTill(10, channel, intTo10CharString(num));
    }

    public static boolean sendTill (int size, SocketChannel channel, String dataU) throws IOException{
        String data;
        if(dataU == null){
            data = arbitString(size);
        }else{
            data = dataU;
        }
        CharBuffer buffer = CharBuffer.wrap(data);
        while(buffer.hasRemaining()){
            channel.write(Charset.defaultCharset().encode(buffer));
            System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit());
        }
        return true;
    }

    public static int receiveInt(SocketChannel channel) throws NumberFormatException, IOException{
        return Integer.parseInt(new String(Arrays.copyOf(Charset.defaultCharset().decode(receiveTill(intStringLength, channel)).array(),intStringLength)));
    }

    public static ByteBuffer receiveTill(int size, SocketChannel channel) throws IOException{
        int left = size;
        int ret;
        System.out.println("going to make buffer");
        ByteBuffer buffer = ByteBuffer.allocate(size);
        System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit()+" bufferCap: "+buffer.capacity());
        while(left>0){
            ret = channel.read(buffer);
            if(ret < 0){
                System.err.println("error in reading");
            }else if (ret!=0){
                //System.out.println("Received: "+ret+" left: "+left);
                System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit());//+" bufferCap: "+buffer.capacity());
            }else if(ret == 0){
                if(!channel.isConnected()){
                    System.out.println("not connected");
                }
            }
            left -= ret;
        }
        buffer.flip();
        return buffer;
    }

    public static String intTo10CharString(int integer){
        return String.format("%010d",integer);
    }

    public static String arbitString(int size) {
        return CharBuffer.allocate(size).toString().replace( '\0', ' ' );
    }
public静态布尔sendInt(int num,SocketChannel通道)引发IOException{
返回sendTill(10,channel,intTo10CharString(num));
}
公共静态布尔sendTill(整型大小、SocketChannel通道、字符串数据单元)引发IOException{
字符串数据;
if(dataU==null){
数据=任意字符串(大小);
}否则{
数据=数据单元;
}
CharBuffer=CharBuffer.wrap(数据);
while(buffer.haslaining()){
channel.write(Charset.defaultCharset().encode(buffer));
System.out.println(“bufPos:+buffer.position()+”bufLim:+buffer.limit());
}
返回true;
}
公共静态int-receiveInt(SocketChannel通道)抛出NumberFormatException,IOException{
返回Integer.parseInt(新字符串(Arrays.copyOf(Charset.defaultCharset().decode(receiveTill(intStringLength,channel)).array(),intStringLength));
}
public static ByteBuffer receiveTill(整数大小,SocketChannel通道)引发IOException{
int left=大小;
int ret;
System.out.println(“准备制作缓冲区”);
ByteBuffer缓冲区=ByteBuffer.allocate(大小);
System.out.println(“bufPos:+buffer.position()+”bufLim:+buffer.limit()+”bufferCap:+buffer.capacity());
而(左>0){
ret=通道读取(缓冲区);
如果(ret<0){
System.err.println(“读取错误”);
}否则如果(ret!=0){
//系统输出打印项次(“接收:+ret+”左:“+left”);
System.out.println(“bufPos:+buffer.position()+”bufLim:+buffer.limit());//+bufferCap:+buffer.capacity());
}else if(ret==0){
如果(!channel.isConnected()){
系统输出打印项次(“未连接”);
}
}
左-=ret;
}
flip();
返回缓冲区;
}
公共静态字符串intTo10CharString(int整数){
返回字符串。格式(“%010d”,整数);
}
公共静态字符串任意字符串(整型大小){
返回CharBuffer.allocate(size.toString().replace('\0','');
}
public static boolean sendInt (int num, SocketChannel channel) throws IOException{
        return sendTill(10, channel, intTo10CharString(num));
    }

    public static boolean sendTill (int size, SocketChannel channel, String dataU) throws IOException{
        String data;
        if(dataU == null){
            data = arbitString(size);
        }else{
            data = dataU;
        }
        CharBuffer buffer = CharBuffer.wrap(data);
        while(buffer.hasRemaining()){
            channel.write(Charset.defaultCharset().encode(buffer));
            System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit());
        }
        return true;
    }

    public static int receiveInt(SocketChannel channel) throws NumberFormatException, IOException{
        return Integer.parseInt(new String(Arrays.copyOf(Charset.defaultCharset().decode(receiveTill(intStringLength, channel)).array(),intStringLength)));
    }

    public static ByteBuffer receiveTill(int size, SocketChannel channel) throws IOException{
        int left = size;
        int ret;
        System.out.println("going to make buffer");
        ByteBuffer buffer = ByteBuffer.allocate(size);
        System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit()+" bufferCap: "+buffer.capacity());
        while(left>0){
            ret = channel.read(buffer);
            if(ret < 0){
                System.err.println("error in reading");
            }else if (ret!=0){
                //System.out.println("Received: "+ret+" left: "+left);
                System.out.println("bufPos: "+buffer.position()+" bufLim: "+buffer.limit());//+" bufferCap: "+buffer.capacity());
            }else if(ret == 0){
                if(!channel.isConnected()){
                    System.out.println("not connected");
                }
            }
            left -= ret;
        }
        buffer.flip();
        return buffer;
    }

    public static String intTo10CharString(int integer){
        return String.format("%010d",integer);
    }

    public static String arbitString(int size) {
        return CharBuffer.allocate(size).toString().replace( '\0', ' ' );
    }