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

/**

基于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即可)

posted on 2021-08-16 10:23  AnonymousJDK  阅读(90)  评论(2编辑  收藏  举报

导航