Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户端未在聊天应用程序中通信_Java_Sockets_Chat - Fatal编程技术网

Java 客户端未在聊天应用程序中通信

Java 客户端未在聊天应用程序中通信,java,sockets,chat,Java,Sockets,Chat,我已经创建了多聊天应用程序 当前问题 当我编译我的类Chatinterface两次时,会打开两个客户端。现在,当我试图通过在文本区域中键入文本消息进行通信时。另一个客户端不显示消息,反之亦然 有人能纠正我的代码吗?告诉我发生了什么事 请不要苛刻,我只是个初学者 请注意,我已经提供了服务器的代码以及详细的解释 package stack; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.

我已经创建了多聊天应用程序

当前问题 当我编译我的类Chatinterface两次时,会打开两个客户端。现在,当我试图通过在文本区域中键入文本消息进行通信时。另一个客户端不显示消息,反之亦然

有人能纠正我的代码吗?告诉我发生了什么事

请不要苛刻,我只是个初学者

请注意,我已经提供了服务器的代码以及详细的解释

package stack;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SpringLayout;

class Chatinterface implements ActionListener,Runnable {

    private JFrame chatwindow;
    JTextArea typemsg;
    JTextArea displaymsg;
    JButton sendbutton;
    JButton logoutbutton;
    Socket client;
    BufferedReader read;
    PrintWriter write;
    String getmsg;
    String gettext;
    public Chatinterface(){

        try {
            client = new Socket("localhost",3420);
            write = new PrintWriter(client.getOutputStream());


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        displaygui();
    }

    private void displaygui() {
        chatwindow = new JFrame();
        chatwindow.setResizable(false);
        chatwindow.setBounds(100, 100, 450, 300);
        chatwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SpringLayout springLayout = new SpringLayout();
        chatwindow.getContentPane().setLayout(springLayout);

        typemsg = new JTextArea();
        springLayout.putConstraint(SpringLayout.NORTH, typemsg, 171, SpringLayout.NORTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, typemsg, 10, SpringLayout.WEST, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.SOUTH, typemsg, -10, SpringLayout.SOUTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, typemsg, 340, SpringLayout.WEST, chatwindow.getContentPane());
        chatwindow.getContentPane().add(typemsg);

        displaymsg = new JTextArea();
        displaymsg.setWrapStyleWord(true);
        displaymsg.setEditable(false);
        springLayout.putConstraint(SpringLayout.NORTH, displaymsg, 10, SpringLayout.NORTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, displaymsg, 0, SpringLayout.WEST, typemsg);
        springLayout.putConstraint(SpringLayout.SOUTH, displaymsg, 160, SpringLayout.NORTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, displaymsg, 0, SpringLayout.EAST, typemsg);
        chatwindow.getContentPane().add(displaymsg);

        sendbutton = new JButton("Send");
        springLayout.putConstraint(SpringLayout.NORTH, sendbutton, -76, SpringLayout.SOUTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, sendbutton, 5, SpringLayout.EAST, typemsg);
        springLayout.putConstraint(SpringLayout.SOUTH, sendbutton, -27, SpringLayout.SOUTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, sendbutton, 82, SpringLayout.EAST, typemsg);
        chatwindow.getContentPane().add(sendbutton);
        sendbutton.addActionListener(this);
        sendbutton.setActionCommand("S");

        logoutbutton = new JButton("Logout");
        springLayout.putConstraint(SpringLayout.NORTH, logoutbutton, 50, SpringLayout.NORTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, logoutbutton, -65, SpringLayout.EAST, sendbutton);
        springLayout.putConstraint(SpringLayout.SOUTH, logoutbutton, 108, SpringLayout.NORTH, chatwindow.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, logoutbutton, 0, SpringLayout.EAST, sendbutton);
        chatwindow.getContentPane().add(logoutbutton);
        logoutbutton.addActionListener(this);
        logoutbutton.setActionCommand("L");
        chatwindow.setVisible(true);

    }
    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Chatinterface method = new Chatinterface();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        Thread t1 = new Thread();
        t1.start();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {

        if(arg0.getActionCommand().equals("S"))
        {
            String gettext2;
            gettext2 = typemsg.getText();
            write.println(gettext2);
            displaymsg.append(gettext2+"\n");
            typemsg.setText("");
        }

        if(arg0.getActionCommand().equals("L")){
            System.exit(0);
        }

    }
    @Override
    public void run() {
        String readmsg;

        try {
            read = new BufferedReader(new InputStreamReader(client.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            readmsg = read.readLine();

            while(readmsg!=null)
            {

                displaymsg.append(readmsg);

            }


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
下面是在连接新客户机时调用的类处理程序

package stack;

import java.io.*;
import java.net.*;

public class Handler implements Runnable {
    Socket s;

    String getmsg = null;
    String sendmsg;

    public Handler(Socket s) {
        this.s = s;

    }
    public void run() {
            BufferedReader reader1 = null;
            PrintWriter writer1 = null;

            try {
                reader1 = new BufferedReader(new InputStreamReader(
                        s.getInputStream()));
                writer1 = new PrintWriter(s.getOutputStream(), true);
                sendmsg = reader1.readLine();
                while (sendmsg!=null) {

                        writer1.println(sendmsg);

                }
                reader1.close();
                writer1.close();
                s.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }

    }
}
这是主服务器类

package stack;

import java.net.*;
public class Servera  {
    public static void main(String[] args) throws Exception {
        Socket s;
        ServerSocket server = new ServerSocket(3420);

        while(true)
        {
            s = server.accept();
            Handler handler1 = new Handler(s);
            Thread t1 = new Thread(handler1);
            t1.start();
        }

    }
}

您的服务器没有收到客户端发送的消息。为此,您需要使用write.flush刷新客户端中的OutputStream 以下是代码更改:

   if(arg0.getActionCommand().equals("S"))
        {
            String gettext2;
            gettext2 = typemsg.getText();
            write.println(gettext2);
            write.flush()
            displaymsg.append(gettext2+"\n");
            typemsg.setText("");
        }
此外,您从一个客户端向另一个客户端发送消息的逻辑不正确。根据您的代码,服务器将向从中接收消息的同一客户端发送消息。为此,您需要维护客户端套接字池,然后将消息广播给所有客户端。希望这些能够回答您的查询。
如果答案正确,请接受。

为此,您需要维护客户端套接字池,然后将消息广播给所有客户端-您可以发布一个链接吗?我已经上传了类似应用程序的演示源,请尽快下载,否则它将过期