Java中的多线程聊天服务器 [英] Multithreaded chat-server in Java

查看:182
本文介绍了Java中的多线程聊天服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用Java实现可以支持多个客户端的服务器-客户端套接字程序,但是只要我的客户端连接到服务器,执行多线程的类就总是崩溃.

I'm trying to implement a server-client socket program in Java that can support multiple clients, but my class that performs the multithreading always crashes whenever my client connects to my server.

import java.io.*;
import java.net.*;
public class ClientWorker extends Thread{
    Socket cwsocket=null;

    public ClientWorker(Socket cwsocket){
        super("ClientWorker");
        cwsocket=cwsocket;
    }

    public void run(){
        try {
            PrintWriter out = new PrintWriter(cwsocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(cwsocket.getInputStream()));

            String serverinput, serveroutput="";

            out.println(serveroutput);

            while ((serverinput = in.readLine()) != null) {
                out.println(serveroutput);
                if (serveroutput.equals("Terminate"))
                    break;
            }
            out.close();
            in.close();
            cwsocket.close();

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

每当我创建一个PrintWriter对象时,都会引发NullPointerException异常,并且我不确定为什么它会继续发生.以下是我的服务器和客户端类.我在做什么错了?

Whenever I create a PrintWriter object, a NullPointerException exception is thrown, and I'm not sure why it continues to happen. Below are my server and client classes. What am I doing wrong?

import java.io.*;
import java.net.*;
public class Server {

    public static void main(String[]args)throws IOException{
        ServerSocket serversocket=null;
        final int PORT_NUM=4444;
        boolean flag=true;
        try{
            System.out.println("Listening for connection");
            serversocket=new ServerSocket(PORT_NUM);
        }catch(IOException e){
            System.out.println("Could not listen to port: "+PORT_NUM);
            System.exit(-1);    
        }
        while(flag){
            new ClientWorker(serversocket.accept()).start();
        }
        System.out.println("Terminating server...");
        serversocket.close();
    }
}

import java.io.*;
import java.net.*;
public class Client {

    public static void main(String[] args){
        Socket socket=null;
        PrintWriter out=null;
        BufferedReader in=null;
        BufferedReader userInputStream=null;
        String IP="127.0.0.1";
        try{
            socket = new Socket(IP, 4444);
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (UnknownHostException e) {
            System.out.println("Unknown host:" + IP);
            System.exit(1);
        } catch  (IOException e) {
            System.out.println("Cannot connect to server...");
            System.exit(1);
        }
        String userInput, fromServer;
        try{        
            userInputStream = new BufferedReader(new InputStreamReader(System.in));
            while ((fromServer = in.readLine()) != null) {
                System.out.println("Server: " + fromServer);
                if (fromServer.equals("Terminate"))
                    break;

                userInput = userInputStream.readLine();
                if (userInput != null) {
                        System.out.println("> " + userInput);
                        out.println(userInput);
                }
            }
        }catch(IOException e){
            System.out.println("Bad I/O");
            System.exit(1);
        }
        try{
            out.close();
            in.close();
            userInputStream.close();
            socket.close();
            System.out.println("Terminating client...");
        }catch(IOException e){
            System.out.println("Bad I/O");
            System.exit(1);
        }catch(Exception e){
            System.out.println("Bad I/O");
            System.exit(1);
        }
    }
}

推荐答案

    public ClientWorker(Socket cwsocket){
        super("ClientWorker");
        cwsocket=cwsocket;
    }

您需要做

        this.cwsocket=cwsocket;

或重命名参数,以免隐藏相同名称的成员.

Or rename the parameter so it doesn't shadow the member of the same name.

这篇关于Java中的多线程聊天服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆