Java教程

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

本文主要是介绍基于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即可)
这篇关于基于Udp通讯的Java局域网群聊小程序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!