Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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套接字服务器提供Java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接异常_Java_Tcp_Socketserver - Fatal编程技术网

Java套接字服务器提供Java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接异常

Java套接字服务器提供Java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接异常,java,tcp,socketserver,Java,Tcp,Socketserver,我已经在客户端创建了客户端-服务器应用程序,当我向服务器发送多个请求时,稍后会出现以下错误。当我监视TCPview时,有很多端口连接处于关闭等待状态。是否有任何端口连接遇到此问题。请查找下面的错误日志 java.net.SocketException: No buffer space available (maximum connections reached?): connect at java.net.PlainSocketImpl.socketConnect(Native Met

我已经在客户端创建了客户端-服务器应用程序,当我向服务器发送多个请求时,稍后会出现以下错误。当我监视TCPview时,有很多端口连接处于关闭等待状态。是否有任何端口连接遇到此问题。请查找下面的错误日志

 java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at com.lk.cc.socketserver.Main.isHostRunning(Main.java:90)
    at com.lk.cc.socketserver.Main.main(Main.java:43)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
    Exception in thread "main" java.lang.NullPointerException
        at com.lk.cc.socketserver.Main.isHostRunning(Main.java:102)
        at com.lk.cc.socketserver.Main.main(Main.java:43)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
客户

    public class Main {

  private static ArrayList<HostConnections> hostList;


  public static void init() {
    hostList = new ArrayList<HostConnections>();
    hostList.add(new HostConnections("localhost", 7881));
    hostList.add(new HostConnections("localhost", 7882));
    hostList.add(new HostConnections("localhost", 7883));
    hostList.add(new HostConnections("localhost", 7884));
  }

  public static void main(String[] args) {
    // write your code here
    boolean hostStatus=true;
    init();
    while (hostStatus) {
      System.out.println("Used " + hostList.get(0));
      HostConnections nextHost = hostList.get(0);
      //Collections.rotate(hostList, -1);
      System.out.println(hostList);

      hostStatus = isHostRunning(nextHost);
      System.out.println(hostStatus);
    }
  }


  private static boolean isHostRunning(HostConnections availableHost) {
    boolean isAlive = false;
    Socket client=null;
    try {
        client = new Socket(availableHost.getHostIpAddress(), availableHost.getHostPort());
      //client.getInputStream().close();

     // client.getOutputStream().close();
      isAlive = true;

    } catch ( Exception e) {
      e.printStackTrace();

    }finally {
      try {
        //client.getOutputStream().flush();
        client.close();
        client.isClosed();
        System.out.println(client.isClosed());
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

    return isAlive;
  }
}
公共类主{
私有静态ArrayList主机列表;
公共静态void init(){
hostList=newarraylist();
添加(新的主机连接(“localhost”,7881));
添加(新的主机连接(“localhost”,7882));
添加(新的主机连接(“localhost”,7883));
添加(新的主机连接(“localhost”,7884));
}
公共静态void main(字符串[]args){
//在这里编写代码
布尔hostStatus=true;
init();
while(主机状态){
System.out.println(“Used”+hostList.get(0));
HostConnections nextHost=hostList.get(0);
//集合。轮换(主机列表,-1);
System.out.println(主机列表);
主机状态=isHostRunning(下一次运行);
System.out.println(主机状态);
}
}
专用静态布尔isHostRunning(主机连接可用主机){
布尔值为live=false;
socketclient=null;
试一试{
client=新套接字(availableHost.getHostIpAddress(),availableHost.getHostPort());
//client.getInputStream().close();
//client.getOutputStream().close();
isAlive=真;
}捕获(例外e){
e、 printStackTrace();
}最后{
试一试{
//client.getOutputStream().flush();
client.close();
client.isClosed();
System.out.println(client.isClosed());
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回现场;
}
}
我的要求是检查列表中的所有连接每次都可用。
谢谢

你把插座漏到什么地方了
CLOSE\u WAIT
表示TCP已收到来自对等方的关闭,并正在等待本地应用程序关闭套接字

您还应该在该测试循环中尝试睡眠。你在烧插座,好像没有明天

事实上,我质疑整个目的。了解资源是否可用的唯一可靠方法是尝试使用它,并在正常执行过程中出现错误时进行处理。其他任何事情都等同于算命

注意:

  • flush()
    之前的
    close()
    是多余的
  • 调用
    isClosed()
    available()
    通常是浪费时间,这也不例外
  • 您是否知道此代码只测试一台主机

  • 我的要求是创建一个代理套接字服务器,该服务器路由客户端对可用线程的请求,并将响应发送回客户端。这是我用来测试代理服务器是否收到来自客户端的多个点击的方法。你认为呢?我已经告诉你我的想法了。这是胡说八道。摆脱它。只需在发生连接异常时进行处理。
        public class Main {
    
      private static ArrayList<HostConnections> hostList;
    
    
      public static void init() {
        hostList = new ArrayList<HostConnections>();
        hostList.add(new HostConnections("localhost", 7881));
        hostList.add(new HostConnections("localhost", 7882));
        hostList.add(new HostConnections("localhost", 7883));
        hostList.add(new HostConnections("localhost", 7884));
      }
    
      public static void main(String[] args) {
        // write your code here
        boolean hostStatus=true;
        init();
        while (hostStatus) {
          System.out.println("Used " + hostList.get(0));
          HostConnections nextHost = hostList.get(0);
          //Collections.rotate(hostList, -1);
          System.out.println(hostList);
    
          hostStatus = isHostRunning(nextHost);
          System.out.println(hostStatus);
        }
      }
    
    
      private static boolean isHostRunning(HostConnections availableHost) {
        boolean isAlive = false;
        Socket client=null;
        try {
            client = new Socket(availableHost.getHostIpAddress(), availableHost.getHostPort());
          //client.getInputStream().close();
    
         // client.getOutputStream().close();
          isAlive = true;
    
        } catch ( Exception e) {
          e.printStackTrace();
    
        }finally {
          try {
            //client.getOutputStream().flush();
            client.close();
            client.isClosed();
            System.out.println(client.isClosed());
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
    
        return isAlive;
      }
    }