UDP-java聊天应用中的节点检测

UDP-java聊天应用中的节点检测,java,swing,sockets,Java,Swing,Sockets,我正在为一个小型聊天应用程序编写一个Java代码,作为网络课程作业。它应该是一个类(p2p);不是(客户端/服务器)。每个对等方都应该连接到聊天室并发送/接收所有对等方都必须看到的消息。我做了代码,它在两台机器之间工作,因为我在局域网中为每台机器明确分配了IP地址,并从每台机器得到响应。我需要的是: 1-点击连接按钮后,将每个对等点连接到插座。 2-检测所有连接的对等点并将它们放入列表(阵列)中。 3-将所有消息发送给所有连接的对等方,这样每个人都可以发送所有消息 任何帮助都将不胜感激。 守则:

我正在为一个小型聊天应用程序编写一个Java代码,作为网络课程作业。它应该是一个类(p2p);不是(客户端/服务器)。每个对等方都应该连接到聊天室并发送/接收所有对等方都必须看到的消息。我做了代码,它在两台机器之间工作,因为我在局域网中为每台机器明确分配了IP地址,并从每台机器得到响应。我需要的是: 1-点击连接按钮后,将每个对等点连接到插座。 2-检测所有连接的对等点并将它们放入列表(阵列)中。 3-将所有消息发送给所有连接的对等方,这样每个人都可以发送所有消息

任何帮助都将不胜感激。 守则:

导入javax.swing.*

import java.awt.event.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; 
import javax.swing.JFrame;
import java.util.ArrayList;

class GUIExample extends JFrame implements ActionListener{  
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JButton b1;  
    JButton b2;  
    JLabel Name;
    JLabel port;
    JLabel HostName;
    JLabel Participants;
    JLabel Messages;
    JTextArea area;
    JTextPane pane;
    JTextPane pane1;
    JTextArea area1;
    JTextPane pane2;
    JTextArea area2;
    JTextField name;
    String s = "hi";
    JTextField p;
    JTextField IP;
    ArrayList<String> list = new ArrayList<String>();


    GUIExample() throws Exception { 

         InetAddress addr = InetAddress.getLocalHost();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        Name = new JLabel ("NAME");
        Name.setBounds(10, 10, 100, 20);
        add(Name);

        name = new JTextField();
        name.setBounds(100, 10, 200, 20);
        add(name);

        HostName=new JLabel("HostName");
        HostName.setBounds(10, 50, 100, 20);
        add(HostName);

        IP = new JTextField(addr.getHostAddress());
        IP.setBounds(100, 50, 100, 20);
        add(IP);

        port = new JLabel("PORT");
        port.setBounds(220, 50, 100, 20);
        add(port);

        p = new JTextField();
        p.setBounds(280, 50, 100, 20);
        add(p);

        Participants = new JLabel("Participants");
        Participants.setBounds(10, 100, 100, 20);
        add(Participants);

        area=new JTextArea(300,300);  
        area.setBounds(10,150,200,300);  
        add(area);

        Messages = new JLabel ("Messages");
        Messages.setBounds(300, 100, 100, 20);
        add(Messages);

        area1=new JTextArea(200,300);  
        area1.setBounds(300,150,300,300);  
        add(area1);

        area2 = new JTextArea(100,100);
        area2.setBounds(10, 500, 500, 50);
        add(area2);

        b1=new JButton("connect");  
        b1.setBounds(600,50,80,30);  
        b1.addActionListener(this);  
        add(b1); 

        b2=new JButton("Send");  
        b2.setBounds(600,500,80,30);  
        b2.addActionListener(this);  
        add(b1);  
        add(b2);  

        setSize(750,575);  
        setLayout(null);  
        setVisible(true);  



    }



    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b1)
        {
            if(name.getText().equals("") && IP.getText().equals(null) && !(p.getText().equals("11222"))){
                area1.append(" name or hostname or port fields are empty or invalid try again ");
            }
            else {
                area.append(name.getText());
                area1.append(name.getText()+ " is connected now \n");
                list.add(name.getText());
                list.add(IP.getText());
                list.add(p.getText());


            }
        }


        if(e.getSource() == b2)
        {
            BufferedReader inFromUser =
         new BufferedReader(new InputStreamReader
                     (System.in));
            DatagramSocket clientSocket = null;
            try {
                clientSocket = new DatagramSocket();
            } catch (SocketException e1) {
                System.out.println(" There is problem with Socek ");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            InetAddress IPAddress = null;
            try {
                byte[] ipp = new byte[]{(byte)192,(byte)168,1,48};
                IPAddress = InetAddress.getByAddress(ipp);
            } catch (UnknownHostException e1) {
                System.out.println(" There is problem with IP ");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            byte[] sendData = new byte[1024];
            String sentence = inFromUser.readLine();
            area2.setText(sentence);
            sendData = sentence.getBytes();
            DatagramPacket sendPacket =
               new DatagramPacket(sendData, sendData.length, 
                            IPAddress, 11222);
            try {
                clientSocket.send(sendPacket);
            } catch (IOException e1) {
                System.out.println("There is problem with Sending the packet");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            if(name.getText()!= null && area2.getText()!= null){
            area1.append(name.getText()+" : "+sentence+"\n");
            area2.setText(null);
            }
        }
    }  
    public static void main(String args[]) throws Exception{
        Runnable task = () -> {         
        DatagramSocket serverSocket = null;
        try {
            serverSocket = new DatagramSocket(11222);
        } catch (Exception e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];

            while(true)
              {
                 DatagramPacket receivePacket =
                    new DatagramPacket(receiveData, 
                             receiveData.length);
                 try {
                    serverSocket.receive(receivePacket);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                 String sentence = new String(
                             receivePacket.getData());
                 InetAddress IPAddress =
                             receivePacket.getAddress();
                 int port = receivePacket.getPort();
                     System.out.println("FROM Client:" +
                     sentence);
                 sendData = sentence.getBytes();
                 DatagramPacket sendPacket =
                 new DatagramPacket(sendData,
                          sendData.length, 
                             IPAddress, port);
                 try {
                    serverSocket.send(sendPacket);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
              }
            };
            Thread thread = new Thread(task);
            thread.start();
        new GUIExample();  
    }

    }  


 is to detect all
导入java.awt.event.*;
导入java.io.IOException;
导入java.net.DatagramPacket;
导入java.net.DatagramSocket;
导入java.net.InetAddress;
导入java.net.SocketException;
导入java.net.UnknownHostException;
导入javax.swing.JFrame;
导入java.util.ArrayList;
类GUI扩展JFrame实现ActionListener{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
按钮b1;
按钮b2;
JLabel名称;
JLabel端口;
JLabel主机名;
JLabel参与者;
JLabel消息;
jtext面积;
JTextPane窗格;
jTextPane1;
第1区;
jTextPane2;
第二区;
JTextField名称;
字符串s=“hi”;
jtextp;
JTextField-IP;
ArrayList=新建ArrayList();
GUIExample()引发异常{
InetAddress addr=InetAddress.getLocalHost();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
名称=新的JLabel(“名称”);
名称.立根(10,10,100,20);
加上(姓名);
name=新的JTextField();
名称.立根(100,10,200,20);
加上(姓名);
主机名=新的JLabel(“主机名”);
主机名.setBounds(10,50,100,20);
添加(主机名);
IP=新的JTextField(addr.getHostAddress());
IP.立根(100,50,100,20);
添加(IP);
端口=新的JLabel(“端口”);
港口立根(220、50、100、20);
添加(端口);
p=新的JTextField();
p、 立根(280,50,100,20);
加(p);
参与者=新的JLabel(“参与者”);
参与者。挫折(10,100,100,20);
添加(参与者);
面积=新的JTextArea(300300);
立根面积(10150200300);
增加(面积);
消息=新的JLabel(“消息”);
消息.设置边界(30010010020);
添加(消息);
区域1=新的JTextArea(200300);
区域1.立根(300150300300);
添加(区域1);
区域2=新的JTextArea(100100);
区域2.立根(105050050);
添加(区域2);
b1=新的按钮(“连接”);
b1.立根(600,50,80,30);
b1.添加ActionListener(本);
添加(b1);
b2=新的JButton(“发送”);
b2.立根(600500,80,30);
b2.addActionListener(本);
添加(b1);
添加(b2);
设置大小(750575);
setLayout(空);
setVisible(真);
}
已执行的公共无效操作(操作事件e){
如果(如getSource()==b1)
{
if(name.getText().equals(“”)和IP.getText().equals(null)和&!(p.getText().equals(“11222”)){
area1.append(“名称、主机名或端口字段为空或无效,请重试”);
}
否则{
append(name.getText());
area1.append(name.getText()+“现在已连接\n”);
list.add(name.getText());
list.add(IP.getText());
add(p.getText());
}
}
如果(如getSource()==b2)
{
BufferedReader INFOROMUSER=
新的BufferedReader(新的InputStreamReader
(系统中);
DatagramSocket clientSocket=null;
试一试{
clientSocket=newdatagramsocket();
}捕获(SocketException e1){
System.out.println(“Socek有问题”);
//TODO自动生成的捕捉块
e1.printStackTrace();
}
InetAddress IPAddress=null;
试一试{
字节[]ipp=新字节[]{(字节)192,(字节)168,1,48};
IPAddress=InetAddress.getByAddress(ipp);
}捕获(未知后异常e1){
System.out.println(“IP有问题”);
//TODO自动生成的捕捉块
e1.printStackTrace();
}
字节[]发送数据=新字节[1024];
String语句=INFOROMUSER.readLine();
区域2.setText(句子);
sendData=句子.getBytes();
数据包发送包=
新数据包(sendData、sendData.length、,
IP地址,11222);
试一试{
clientSocket.send(sendPacket);
}捕获(IOE1异常){
System.out.println(“发送数据包有问题”);
//TODO自动生成的捕捉块
e1.printStackTrace();
}
if(name.getText()!=null&&area2.getText()!=null){
area1.append(name.getText()+“:“+句子+”\n”);
区域2.setText(空);
}
}
}  
公共静态void main(字符串args[])引发异常{
可运行任务=()->{
DatagramSocket serverSocket=null;
试一试{
serverSocket=新的DatagramSocket(11222);
}捕获(异常e2){
//TODO自动生成的捕捉块
e2.printStackTrace();
}
字节[]接收数据=新字节[1024];
字节[]发送数据=新字节[1024];
while(true)
{
数据包接收