UDP多人群聊

一,创建类

二,类

1,Liao类

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.net.*;

import java.io.IOException;

import java.lang.String;

public class Liao extends JFrame{

private static final int DEFAULT_PORT=8899;

private JLabel stateLB;

private JTextArea centerTextArea;

private JPanel southPanel;

private JTextArea inputTextArea;

private JPanel bottomPanel;

private JTextField ipTextField;

private JTextField remotePortTF;

private JButton sendBT;

private JButton clearBT;

private DatagramSocket datagramSoket;

private void setUpUI(){

setTitle("聊天");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(400,400);

setResizable(false);//窗口大小不可改变

setLocationRelativeTo(null);//设置窗口相对于指定组件的位置

stateLB=new JLabel("weijianting");

stateLB.setHorizontalAlignment(JLabel.RIGHT);

centerTextArea=new JTextArea();

centerTextArea.setEditable(false);

centerTextArea.setBackground(new Color(211,211,211));

southPanel=new JPanel(new BorderLayout());

inputTextArea=new JTextArea(5,20);

bottomPanel=new JPanel(new FlowLayout(FlowLayout.CENTER,5,5));

ipTextField=new JTextField("127.0.0.1",8);

remotePortTF=new JTextField(String.valueOf(DEFAULT_PORT),3);

sendBT=new JButton("发送");

clearBT=new JButton("清屏");

bottomPanel.add(ipTextField);

bottomPanel.add(remotePortTF);

bottomPanel.add(sendBT);

bottomPanel.add(clearBT);

southPanel.add(new JScrollPane(inputTextArea),BorderLayout.CENTER);

southPanel.add(bottomPanel,BorderLayout.SOUTH);

add(stateLB,BorderLayout.NORTH);

add(new JScrollPane(centerTextArea),BorderLayout.CENTER);

add(southPanel,BorderLayout.SOUTH);

setVisible(true);

}

private void setListener(){

sendBT.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

final String ipAddress=ipTextField.getText();

final String remotePort=remotePortTF.getText();

if(ipAddress==null||ipAddress.trim().equals("")||remotePort==null||remotePort.trim().equals("")){

JOptionPane.showMessageDialog(Liao.this,"请输入IP地址和端口号");

return;

}

if(datagramSoket==null||datagramSoket.isClosed()){

JOptionPane.showMessageDialog(Liao.this,"监听未成功");

return;

}

String sendContent=inputTextArea.getText();

byte\[\] buf=sendContent.getBytes();

try{

centerTextArea.append("我对"+ipAddress+":"+remotePort+"说:\n"+inputTextArea.getText()+"\n\n");

centerTextArea.setCaretPosition(centerTextArea.getText().length());

datagramSoket.send(new DatagramPacket(buf,buf.length,InetAddress.getByName(ipAddress),Integer.parseInt(remotePort)));

inputTextArea.setText("");

}catch(IOException e1){

JOptionPane.showMessageDialog(Liao.this, "出错了,发送不成功");

e1.printStackTrace();

}

};

});

clearBT.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

centerTextArea.setText("");

}

});

}

private void initSocket(){

int port=DEFAULT_PORT;

while(true){

try{

if(datagramSoket!=null&&!datagramSoket.isConnected()){

datagramSoket.close();

}

try{

port=Integer.parseInt(JOptionPane.showInputDialog(this,"请输入端口号","端口号",JOptionPane.QUESTION_MESSAGE));

if(port<1||port>65535){

throw new RuntimeException("端口号超出范围");

}

}catch(Exception e){

JOptionPane.showMessageDialog(null,"你输入的端口不正确,请输入1~65535之间的数");

continue;

}

datagramSoket=new DatagramSocket(port);

startListen();

stateLB.setText("已在"+port+"端口监听");

break;

}catch(SocketException e){

JOptionPane.showMessageDialog(this, "端口号被占用,请重新设置端口");

stateLB.setText("当前未启动监听");

}

}

}

private void startListen(){

new Thread(){

private DatagramPacket p;

public void run(){

byte\[\] buf=new byte1024;

p=new DatagramPacket(buf,buf.length);

while(!datagramSoket.isConnected()){

try{

datagramSoket.receive(p);

centerTextArea.append(p.getAddress().getHostAddress()+":"+((InetSocketAddress)p.getSocketAddress()).getPort()+"对我说:\n"+new String(p.getData(),0,p.getLength())+"\n\n");

centerTextArea.setCaretPosition(centerTextArea.getText().length());

}catch(IOException e){

e.printStackTrace();

}

}

}

}.start();

}

public static void main(String\[\] args) {

Liao a=new Liao();

a.setUpUI();

a.initSocket();

a.setListener();

}

}

三,结果

相关推荐
中微极客2 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
猿的天空6 小时前
机器人双手迎来全栈训练系统:灵初智能EgoSteer让灵巧手无所不能
网络·人工智能·计算机·ai·程序员·机器人·编程
Xzaveir_7776 小时前
OPPO、vivo、荣耀号码认证:多终端拨测矩阵与异常复现
大数据·网络·科技·矩阵·产品经理·ai-native
wuqingshun3141596 小时前
从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
网络
牛马工作号6 小时前
Zigbee 专业详解:从协议到排障
网络·物联网·安全
牛马工作号6 小时前
Wi‑Fi 完全指南:从 802.11 协议到 Wi‑Fi 7、AC+AP 与 Mesh 工程组网
网络·网络协议·智能路由器
智慧光迅AINOPOL6 小时前
智慧工厂全光网怎么扛住AGV与强电磁?光电复合缆与工业级方案
网络·全光网解决方案·全光网·酒店全光解决方案·泛住宿全光网解决方案
JoyCong19987 小时前
手机变身“司令台”!ToDesk AI安卓版上线
网络·人工智能·科技·智能手机·电脑·远程工作·远程操作
a4493153627 小时前
iPhone 基带故障诊断——无服务/搜索不到网络的芯片级维修实录
网络·macos·ios·电脑·iphone
XR1234567887 小时前
园区网络“三网合一“怎么落地?信锐全网智能方案实践
网络