package UDP;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.IOException;
import java.lang.String;
public class lt 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(lt.this,"请输入IP地址和端口号");
return;
}
if(datagramSoket==null||datagramSoket.isClosed()){
JOptionPane.showMessageDialog(lt.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(lt.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 byte[1024];
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) {
lt a=new lt();
a.setUpUI();
a.initSocket();
a.setListener();
}
}
UDP群聊
yyjy122023-12-12 22:08
相关推荐
麻瓜也要学魔法4 小时前
链路状态路由协议-OSPFEstar.Lee4 小时前
查手机号归属地免费API接口教程傻啦嘿哟5 小时前
代理IP在后端开发中的应用与后端工程师的角色Red Red5 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务向阳12186 小时前
Dubbo HTTP接入之triple协议亚远景aspice7 小时前
ISO 21434标准:汽车网络安全管理的利与弊Estar.Lee7 小时前
时间操作[计算时间差]免费API接口教程友友马8 小时前
『 Linux 』网络层 - IP协议(一)码老白9 小时前
【老白学 Java】Warshipv2.0(二)