【问题标题】:Unable to receive messages in 2 way client chat via Server using JAVA Sockets.....(MultiThreaded)无法使用 JAVA 套接字通过服务器以 2 方式客户端聊天接收消息.....(多线程)
【发布时间】:2012-01-13 03:16:51
【问题描述】:

我有 2 个客户端套接字..每个都有自己的 AWT.Frame 作为 GUI 用于聊天.. 在服务器端,我有一个带有 2 个线程的 ServerSocket,用于处理每个客户端。

msg 到流的写入已正确完成,但我无法读取它。在我单击“后,两个线程也终止(我认为主要是由于一些异常。两个客户端窗口上的“发送”按钮..

ChatServer.main() 的代码

public static void main(String args[])throws IOException
{
    boolean listening=true;
    try
    {
        try
        {
            server=new ServerSocket(12591);
        }catch(IOException e)
        {
            System.out.println("Couldn't listen to specified port as it might be already used by some other service");
            System.exit(1);
        }

        System.out.println("Waiting for some client to initiate connection...");
        //while (listening)
        //{
            new ChatServerThread(server.accept()).start();
            System.out.println("Connected to User1!");

            new ChatServerThread(server.accept()).start();
            System.out.println("Connected to User2!");
        //}

    }catch(SocketException e)
    {
        System.out.println(e.getMessage());
    }
    server.close();
}

ChatServerThread.constructor() 和 run() 方法的代码(ChatServerThread 扩展线程)

public ChatServerThread(Socket s)
{
    super("ChatServerThread"+(++count));
    socket = s;

    try
    {
        in=new DataInputStream(socket.getInputStream());
        out=new DataOutputStream(socket.getOutputStream());
    }catch(IOException e)
    {
        System.out.println("Problem getting I/O connection");
        System.exit(1);
    }
}
public void run()
{
    while(true)
    {
        try
        {
            String s = in.readUTF();
            if(s.equals("DISCONNECT~!@#"))
            {
                break;
            }else
            {
                ChatServer.chatMsgs.add(s);
                System.out.println(s);
                //makeClients.c1.display.append(s);
                //makeClients.c2.display.append(s);
                ChatClient.addMsg2Disp(s);
            }
        }catch(IOException e)
        {
            System.out.println("IOException occured");
        }
    }
}

ChatClient的方法(有GUI):它的构造函数,实现了Listener方法:

public ChatClient()
{
    setLayout(new BorderLayout());

    bottomPanel=new Panel(new FlowLayout());
    bottomPanel.add(txtEntry=new TextArea(4,80));
    bottomPanel.add(send=new Button("Send"));
    bottomPanel.add(disconnect=new Button("Disconnect"));

    add(bottomPanel, BorderLayout.SOUTH);

    display=new TextArea();
    //display.setEditable(false);
    add(display, BorderLayout.CENTER);

    try
    {
        client=new Socket(InetAddress.getLocalHost(), 12591);
        in = new DataInputStream(client.getInputStream());
        out = new DataOutputStream(client.getOutputStream());
    }catch(UnknownHostException e)
    {
        System.out.println("Local Host cannot be resolved on which the server is runnig");
        System.exit(1);
    }catch(IOException e)
    {
        System.out.println("Problem acquiring I/O Connection.");
        System.exit(1);
    }

    send.addActionListener(this);
    disconnect.addActionListener(this);
}
public void actionPerformed(ActionEvent ae)
{
    if(ae.getSource().equals(send))
    {
        try
        {
            if(!(txtEntry.getText().trim().equals("")))
            {
                out.writeUTF(txtEntry.getText());
                out.flush();
            }
        }catch(IOException e)
        {
            System.out.println("IOException occured");
        }
    }
    else if(ae.getSource().equals(disconnect))
    {

    }
}
static void addMsg2Disp(String msg)
{
    display.append(msg);
}

最后还有 1 个名为 makeClients 的类,它实例化 ChatClient 类的 2 个 obj,并设置框架的大小、可见性等......

我认为这是一个大问题,但无法弄清楚为什么无法接收.. 任何可以帮助我的人..提前谢谢! :)

PS:它不是一个真正的应用程序..我正在学习 JAVA 套接字..所以只是尝试编写这样的代码..

【问题讨论】:

  • 客户端连接到服务器了吗????目前的输出是什么?
  • @sonuthomas 嗯是的..正在显示接受后说“已连接”的 2 个 SOPln 语句..(这是控制台上服务器端的输出).. 控制台没有输出客户端,因为它只有一个 GUI ..所以我在指定的文本区域中写了一些消息..然后单击发送..在两个客户端上单击发送后,服务器线程终止..我不知道为什么..没有任何例外..并且用于在display textarea 中显示文本的注释行给了我NullPointerException....所以我将 textarea 设为静态并尝试过..但现在仍然无法解决..

标签: java sockets networking serversocket event-listener


【解决方案1】:

看起来你的问题可能出现在这一行的 ChatServerThread 中:

if (s.equals("DISCONNECT~!@#") || s != null)

else 块永远不会被执行,因为 s 不能是 null(如果是 NullPointerException 将在调用 equals 方法时抛出。我猜你的意思是null 的引用相等检查:

if (s.equals("DISCONNECT~!@#") || s == null)

【讨论】:

  • 感谢您的回复..!我认为你是对的..但是 if-else 仅用于检查用户是否请求断开连接;而且我没有在那边得到NullPointerException,我在ChatClient.addMsg2Disp(s); 声明中有它,即在addMsg2Disp 方法中..为什么会这样..
  • 实际上更正了 if-else(我不知道为什么我在那里放了一个 !=null 检查)..它只是为了检查断开连接..在那个 if-else 和我仍然在我将字符串附加到 textarea 的地方有这个异常
  • 为什么要从 ChatServer 调用 ChatClient 上的静态方法?我猜这是为了调试,但您没有从与 ChatServer 相同的 JVM 中实例化 ChatClient 的实例。
  • 嗯好吧..现在我明白了..不..那不是为了调试目的;我正在尝试的是,一旦线程的运行方法收到任何消息,他们就会调用该静态方法,以便它可以将消息附加到静态文本区域..这样它对两个客户端都是可见的
  • 客户端的GUI(makeClients类)由不同的JVM执行;不是由执行 ChatServer 的同一个 .. 没错.. 所以现在我应该怎么做才能将消息附加到 textarea.. 任何想法..?
【解决方案2】:

只是一个快速修复尝试

if(s != null ? (s.equals("DISCONNECT~!@#")) :false)

应该解决你的NullPointerException问题

【讨论】:

  • 没有得到那个..你想检查什么..1st它是否为null,如果它为null,那么是否与断开字符串相等..?
  • 我的错,对答案进行了编辑,以下是我试图做什么的解释:首先检查天气 s 是否为空,如果是这样继续执行 s.equals 函数,否则返回 false .这仅在 s 的值不为 null 时执行 equals 函数,这应该可以解决您在使用 null 对象检查 equals 函数是否相等时引起的 NullPointerException 问题
  • 嗯好吧..即使我认为你正在尝试类似的东西..无论如何我尝试了你所说的..但在我尝试附加的地方仍然有相同的异常到 textarea 的消息,即在 addMsg2Disp() 方法调用-->在方法内部..
  • 在执行对addMsg2Disp() 的调用之前检查s 是否为null,仅在s 不为null 时执行方法调用。 if(s!=null){ChatClient.addMsg2Disp(s);}
  • if(s!=null) { ChatServer.chatMsgs.add(s); ChatClient.addMsg2Disp(s); } 注释掉了整个 if-else 块并添加了这个..但它仍然显示NullPointerException
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多