一、创建新项目 首先创建一个新的项目,并命名。
二、实现代码 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=1;//端口名 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("GUI"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,400); setResizable(false);//窗口大小不可改变 setLocationRelativeTo(null);//设置窗口相对于指定组件的位置 stateLB=new JLabel("聊天室"); 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(); } }
三、运行结果
用户1和用户2的聊天
好文阅读
发表评论