Невозможно получать сообщения в двухстороннем клиентском чате через сервер с использованием сокетов JAVA ..... (многопоточный) - PullRequest
0 голосов
/ 13 января 2012

У меня есть 2 клиентских сокета. Каждый из них имеет свой собственный AWT.Frame в качестве графического интерфейса для чата. На стороне сервера у меня есть ServerSocket с двумя потоками, созданными для обработки каждого из клиентов.

Запись сообщения в поток выполняется правильно, но я не могу его прочитать ... и оба потока также завершаются (я думаю, в основном из-за некоторого исключения ... NullPointer, но не отображается на консоли) после того, как я нажму "отправить"Кнопка "на обоих окнах клиента ..

Код 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, который создает 2 объекта класса ChatClient и устанавливаетразмер, видимость и т. д. кадра ....

Я думаю, это большой вопрос, но я не могу понять, почему не может принять .. любого, кто мог бы помочь мнезаранее!:)

PS: и это не настоящее приложение .. я изучаю сокеты JAVA .. поэтому просто пытаюсь закодировать что-то вроде этого ..

Ответы [ 2 ]

0 голосов
/ 15 января 2012

просто быстрое исправление попытки

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

должно решить вашу проблему NullPointerException

0 голосов
/ 15 января 2012

Похоже, что вы не можете быть в вашем ChatServerThread по этой строке:

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

Блок else никогда не будет выполнен, так как s не может быть null (если этоNullPointerException будет выдано при вызове метода * 1007. * Я предполагаю, что вы имели в виду проверку равенства ссылок для null:

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