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