[英]My java multi-thread (client-server) program throws a NullPointerException when socket object instance is created using the accept() method
我正在尝试创建一个多线程客户端-服务器通信程序,该程序使用 2 个线程连接到多个客户端(但一次只能连接 2 个)。 该方案的特点是:
客户端可以从他们这边终止通信程序,但服务器线程不会退出。
在服务器程序满足退出条件之前,服务器中的线程不会关闭ServerSocket
,即,如果请求,服务器会持续连接到各种客户端。
每次客户端终止程序时,仅关闭通信(相关)流。
现在的问题是创建Socket
对象的代码行。 调用ServerSocket
对象的accept()
方法后,抛出NullPointerException
。 关于我哪里出错的任何见解都会非常有帮助。
我的服务器端代码:
class Clientconnect implements Runnable
{
ServerSocket ss;
Socket s;
String n;
int f;
Clientconnect() throws Exception
{
new ServerSocket(776);
new Socket();
}
public void run()
{
n = Thread.currentThread().getName();
while(true) // thread iteration
{
try
{
System.out.println("Thread "+Thread.currentThread().getName()+" is ready to accept a
connection.....");
s = ss.accept(); // ------**The NullPointerException occurs here**
System.out.println("Thread "+Thread.currentThread().getName()+" has accepted a connection:\n----------");
PrintStream ps = new PrintStream (s.getOutputStream());
BufferedReader cl = new BufferedReader (new InputStreamReader (s.getInputStream()));
BufferedReader kb = new BufferedReader (new InputStreamReader (System.in));
String in, out;
ps.println("you are connected via thread "+n);
ps.println("----------------------");
while (true)
{
in = cl.readLine();
if( in.equalsIgnoreCase("system_exit"))
{
break;
}
System.out.println("Client : "+in);
System.out.print("Server "+n+" :");
out = kb.readLine();
ps.println(out);
}
s.close();
ps.close();
cl.close();
System.out.print("do you want to close the server socket\n1:close\n2:continue\nenter");
f = Integer.parseInt(kb.readLine());
if(f == 1)
{
ss.close();
break;
}
else
{
continue;
}
}
catch (Exception e){e.printStackTrace();}
}
}
}
class test2g
{
public static void main (String args[]) throws Exception
{
Clientconnect cc = new Clientconnect();
Thread t1 = new Thread (cc, "t1");
Thread t2 = new Thread (cc, "t2");
t1.start();
t2.start();
}
}
这是一个相当简单的通信程序,没有复杂的资源访问或检索。 我在同一台机器上运行客户端,所以它是“本地主机”。
我的客户端代码只是 try{} 块的交互。
PS 我曾尝试在Clientconnect
类中将ServerSocket
和Socket
对象声明为静态对象,但没有帮助。
我相信ss
需要在构造函数中分配:
Clientconnect() throws Exception
{
ss = new ServerSocket(776);
new Socket(); // Not needed because it creates a Socket that is immediately thrown away.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.