Java套接字服务器提供Java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):连接异常
我已经在客户端创建了客户端-服务器应用程序,当我向服务器发送多个请求时,稍后会出现以下错误。当我监视TCPview时,有很多端口连接处于关闭等待状态。是否有任何端口连接遇到此问题。请查找下面的错误日志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
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;
}
}