繁体   English   中英

当使用 accept() 方法创建套接字对象实例时,我的 java 多线程(客户端-服务器)程序抛出 NullPointerException

[英]My java multi-thread (client-server) program throws a NullPointerException when socket object instance is created using the accept() method

我正在尝试创建一个多线程客户端-服务器通信程序,该程序使用 2 个线程连接到多个客户端(但一次只能连接 2 个)。 该方案的特点是:

  1. 客户端可以从他们这边终止通信程序,但服务器线程不会退出。

  2. 在服务器程序满足退出条件之前,服务器中的线程不会关闭ServerSocket ,即,如果请求,服务器会持续连接到各种客户端。

  3. 每次客户端终止程序时,仅关闭通信(相关)流。

现在的问题是创建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类中将ServerSocketSocket对象声明为静态对象,但没有帮助。

我相信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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM