基于Udp通讯的Java局域网群聊小程序
阅读原文时间:2023年07月10日阅读:2

/**

基于Udp通讯的Java局域网群聊小程序

*/

package com.UdpDemo;

import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class UdpDemo {

private Frame f;  
private TextField tf;  
private Button but;  
private Button but1;  
private TextArea ta;

DatagramSocket ds1;

//1.创建udpSocket服务建立端点,监听10000端口,接受的ds  
DatagramSocket dss;

//创建一个线程用来接收10000端口并打印到文本框中  
Thread t1=new Thread(new Runnable(){  
    public void run(){  
        while(true){  
            try{  
                //1.创建udpSocket服务建立端点,监听10000端口,接受的ds1  
                dss=new DatagramSocket(10000);  
                //2.定义数据包,用于存储数据  
                byte\[\] buf=new byte\[1024\];  
                DatagramPacket dp=new DatagramPacket(buf,buf.length);  
                //3.通过服务的receive方法将收到的数据存入数据包中  
                dss.receive(dp);  
                //4.通过数据包的方法获取其中的数据  
                String ip=dp.getAddress().getHostAddress();  
                String data=new String(dp.getData(),0,dp.getLength());  
                //获取发送的端口  
                int port=dp.getPort();  
                //输出到文本框  
                ta.append("\\n"+ip+":"+port+"\\t:--->"+data+"#\\r\\n\\n");  
                //关闭资源  
                dss.close();  
            }  
            catch(Exception e){  
                System.out.println("接收数据异常");  
            }  
        }  
    }  
});

    public void send(){  
        try{  
            //1.创建udp服务,通过DatagramSocket对象  
            ds1=new DatagramSocket();  
            //确定数据  
            byte\[\] bufSend1=tf.getText().getBytes();  
            // 构造 DatagramPacket,用来将长度为 length 的包发送到指定主机上的指定端口。封装成数据包    DatagramPacket(byte\[\] buf,int length,InetAddress address,int port)  
            DatagramPacket dp1=new DatagramPacket(bufSend1,bufSend1.length,InetAddress.getByName("127.0.0.255"),10000);  
            //send方法发送,Socket服务将已有数据包发送。  
            ds1.send(dp1);  
            //关闭发送资源  
            ds1.close();    

        }  
        catch(Exception e){  
            System.out.println("send异常");  
        }  
    }  
    //定义一个函数,该函数调用时需传入要发送的参数  
    public void sendGo(String obj){  
        //到追加文本区,显示本人已发送的  
        ta.append("My Speak:"+obj+"\\r\\n"+"#");  
        //调用send()函数发送数据  
        send();  
        //清空输入框  
        tf.setText("");  
    }

//UDPDemo方法来调用窗体创建和运行接收线程  
UdpDemo(){        init();        t1.start();        }

public void init(){  
    f=new Frame("UdpDemo");  
    //f.setBounds(横坐标,纵坐标,长度,宽度);  
    f.setBounds(200,200,600,600);  
    f.setLayout(new FlowLayout());  
    //输入框长度  
    tf=new TextField(60);  
    //按钮文字  
    but=new Button("发送");  
    //按钮文字  
    but1=new Button("清屏");  
    // 文本框位置  
    ta=new TextArea(30,80);  
    //将以上组件添加到窗体中  
    f.add(ta);  
    f.add(tf);  
    f.add(but);  
    f.add(but1);  
    //文本框设置为不可编辑  
    ta.setEditable(false);  
    //文本框为指定的颜色  
    tf.setBackground(new Color(244, 244, 244));  
    //创建可显示的窗体  
    myEvent();  
    f.setVisible(true);  
}

private void myEvent(){  
    f.addWindowListener(new WindowAdapter(){  
        public void windowClosing(WindowEvent e){  
            //向大家发送我下了的提示  
            sendGo("我下了!");  
            //关闭资源  
            ds1.close();  
            //关闭窗体  
            System.exit(0);  
        }  
    });  
    but.addActionListener(new ActionListener(){  
        public void actionPerformed(ActionEvent e){  
            sendGo(tf.getText());  
        }  
    });  
    but1.addActionListener(new ActionListener(){  
        public void actionPerformed(ActionEvent e){  
            //清空文本框  
            ta.setText("");  
            //清空输入框  
            tf.setText(" ");  
        }  
    });  
    tf.addKeyListener(new KeyAdapter(){  
        public void keyPressed(KeyEvent e){  
        //如果按Enter则调用sendGo方法  
            if(e.getKeyCode()==KeyEvent.VK\_ENTER){  
                sendGo(tf.getText());  
            }  
        }  
    });  
}

public static void main(String \[\] arguments) {  
    try{  
        //创建UdpDemo()对象  
        new UdpDemo();  
    }  
    catch(Exception e){  
        //有异常时打印到对话框  
        System.out.println("main异常");  
    }  
}  

      
//采用127.0.0.255的回环地址来测试,若使用仅需更改为局域网ip网段即可。(例:网段为192.168.0.1改为192.168.1.255即可)

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章