我发现当从非主线程启动时,ServerSocket在一定程度上变得不负责任。为什么?当我在主线程中启动ServerSocket时,一切正常。
主要开始类:
public class gui
{
public static void main(String args[])
{
new CpServer();
}
}
启动ServerSocket并接受连接的线程类:
public class CpServer extends Thread {
private ServerSocket server = null;
public CpServer()
{
try {
server =new ServerSocket(3700,1,InetAddress.getByName("0.0.0.0") );
} catch (Exception ex) {
System.out.println( "exception on start socket"+ ex.getMessage());
}
start();
}
public void run()
{
while(true)
{
try {
new NBSrvThr(server.accept()).start();
System.out.println("Accept");
} catch (Exception e)
{
System.out.println("Error acception connection "+e.getMessage());
}
}
}
}
通讯线程:
public class NBSrvThr extends Thread {
private Socket socket = null;
public NBSrvThr(Socket socket) {
this.socket = socket;
}
public void run() {
try (
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
) {
String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println("got packet: "+inputLine);
break;
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端测试应用程序
启动10个连接的主启动类:
public class NBClientManyRuns {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("Creating thread "+Integer.toString(i));
try {
NBThr.proceed(Integer.toString(i));
} catch (Exception e) {
System.out.println("Eception itn thr create "+Integer.toString(i));
}
}
}
}
连接Thread:
public class NBThr extends Thread {
public String id;
public static void proceed(String ID)
{
NBThr t= new NBThr() ;
t.id = ID;
t.start();
}
public void run()
{
System.out.println("Starting thread"+ " id="+ id);
String hostName = "127.0.0.1";
int portNumber = 3700;
try (
Socket socket = new Socket(hostName, portNumber);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
)
{
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
socket.getOutputStream().write("hello".getBytes());
System.out.println("Send done " + hostName + " id="+ id);
} catch (Exception e) {
System.out.println("Exception " + e.getMessage() +" "+ hostName + " id="+ id);
}
System.out.println("Leaving thread"+ " id="+ id);
}
}
控制台输出:
客户端测试结果显示并非所有连接都被接受:
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Starting thread id=0
Starting thread id=2
Starting thread id=1
Creating thread 4
Starting thread id=3
Creating thread 5
Starting thread id=4
Creating thread 6
Starting thread id=5
Creating thread 7
Starting thread id=6
Creating thread 8
Creating thread 9
Starting thread id=7
Starting thread id=8
Starting thread id=9
Send done 127.0.0.1 id=2
Send done 127.0.0.1 id=6
Leaving thread id=2
Leaving thread id=6
Send done 127.0.0.1 id=7
Leaving thread id=7
Send done 127.0.0.1 id=4
Leaving thread id=4
Exception Connection refused: connect 127.0.0.1 id=9
Leaving thread id=9
Exception Connection refused: connect 127.0.0.1 id=1
Leaving thread id=1
Exception Connection refused: connect 127.0.0.1 id=8
Exception Connection refused: connect 127.0.0.1 id=5
Exception Connection refused: connect 127.0.0.1 id=0
Leaving thread id=0
Leaving thread id=8
Exception Connection refused: connect 127.0.0.1 id=3
Leaving thread id=3
Leaving thread id=5
服务器控制台仅显示4个接受的连接:
Accept
Accept
Accept
Accept
got packet: hello
got packet: hello
got packet: hello
got packet: hello
我认为线程有一些问题,线程会导致饥饿。我建议为此使用线程池
我正在创建一个简单的web代理应用程序使用Java。基本上,main方法创建一个RequestReceiver对象,该对象具有侦听web浏览器http请求的ServerSocket。从ServerSocket.Accept()返回的套接字创建一个新的连接对象,并将其放入线程池中。
我在理解诸如/和/ 我试图创建九个,并让它们同时运行,以找出哪个是最有效的。 因此,当主函数启动时,我会锁定互斥锁,以确保线程不会启动,然后再告诉它们使用pthread_lock( 然后,我使用各种调度策略创建所有九个线程。完成后,我尝试使用pthread\u mutex\u unlock告诉所有线程同时启动( 但当我运行这个时,它永远不会解锁线程。主功能的“运行…”print语句将关闭,但线程从
当我尝试使用start-slave.sh连接到主服务器时,spark://master:port如这里所述 我正在得到这个错误日志 我尝试使用本地ip和本地名称访问主服务器(我设法同时使用和不使用密码ssh到主服务器、用户和root用户) 谢了!
我使用Java.NET套接字创建了一个服务器,我尝试通过localhost客户端访问它,它正在接受请求并响应客户端,但当我尝试通过LAN电缆连接从另一台计算机远程访问它时,它不接受任何连接,即使它正在监听本地端口(9999),然后为了查看端口是否不工作,我将Apache Web Server配置为监听端口(9999),它确实工作,所以我将它设置为监听不同的端口,但没有运气,并尝试打开防火墙上的各种
我有一个作为接入点(也称为wifi热点)运行的android设备,它运行的代码是: 我将有一些其他客户端设备连接到此设备的wifi热点,并尝试连接到插座,但它将无法。 接入点的 IP 地址类似于 192.168.43.1 ...所以我将尝试从客户端设备连接到192.168.43.1:8080,它将不起作用。 但是,如果两个设备都连接到另一个wifi网络,则服务器套接字。接受();它会工作得很好!我
问题内容: 我正在使用套接字运行一些测试,但遇到了一些奇怪的行为:ServerSocket将在第50个客户端套接字连接到它之后拒绝连接,即使该客户端套接字在打开下一个套接字之前就已关闭,即使延迟了在连接之间添加。 以下程序是我的实验代码,该代码在当前状态下不引发任何异常并正常终止。但是,如果将的阵列大小增加到50以上,则服务器套接字将拒绝在第50个连接后尝试连接的任何客户端套接字。 问题: 为什么