Java利用UDP实现简单的双人聊天
一、创建新项目
 首先创建一个新的项目,并命名。

二、实现代码
 ?
 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的聊天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!