UDP实现群聊

发布时间:2023年12月17日

package TCP;
?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.IOException;
import java.lang.String;
?
public class liaotian 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(liaotian.this,"请输入IP地址和端口号");
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?if(datagramSoket==null||datagramSoket.isClosed()){
?? ??? ??? ??? ?JOptionPane.showMessageDialog(liaotian.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(liaotian.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) {
?? ??? ??? ?liaotian a=new liaotian();
? ? ? ? ? ? a.setUpUI();
?? ??? ??? ?a.initSocket();
?? ??? ??? ?a.setListener();
?? ??? ?}
?? ??? ?
}

运行之后直接输入端口号8899就能开始群聊

文章来源:https://blog.csdn.net/2302_76545698/article/details/134955961
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。