zoukankan      html  css  js  c++  java
  • 案例——UDP聊天

    UDP聊天案例

      做一个网络编程相关的案例,想着用利用UDP的快速且不用连接的优点做一个聊天室,我们一个聊天程序需要可以接收消息,也要可以发送消息,所以我们的DatagramSocket对象不但需要调用send函数,还需要调用recieve函数。
      而且由于聊天的特殊性,有可能在你发送的时候有消息需要接收,所以我们需要用到线程,开启两个线程,一个负责接收,一个负责发送,为了清晰起见,我们将收发消息各封装在两个实现了runnable接口的类中,然后重写run方法,内容就是消息的收或者发。
      在实现操作的时候,开启两个这样的程序,即可与自己聊天了(沙雕嗷~~),当然如果将IP最后一段改成广播形式,那这个局域网内的人都可以收到,即群聊。

    接收消息的类

    //接收任务
    class Receive implements Runnable{
    
        private DatagramSocket ds;		//私有成员是一个对象,由他调用recieve函数
    
        public Receive(DatagramSocket ds) {	//构造器
            super();
            this.ds = ds;
        }
    
    
        @Override
        public void run() {
    
            System.out.println("udp  接收端     run");
    
            while(true)
            {
                try {
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    ds.receive(dp);
    
                    String ip = dp.getAddress().getHostAddress();
                    int port = dp.getPort();
                    String text = new String(dp.getData(),0,dp.getLength());
    
                    System.out.println(ip+":"+port+":    "+text);
                    if(text.equals("886"))
                    {
                        System.out.println(ip+"...离开聊天室");
                    }
                } catch (Exception e) {
    
                }
    
            }
        }
    }
    

    发送消息的类

    //发送任务
    class Send implements Runnable{
    
        private DatagramSocket ds;
    
        public Send(DatagramSocket ds) {
            super();
            this.ds = ds;
        }
    
        @Override
        public void run() {
    
            System.out.println("udp  发送端     run");
    
            try {
                //将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
    
                while ((line = bufr.readLine()) != null)
                {
                    byte[] buf = line.getBytes(); //将数据转成字节数组
                    //将字节数组封装到数据包中
                    //如果IP改为121.255.255.255,最后一位是255,通知所有的主机
                    DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("121.255.255.21"), 10003);
                    ds.send(dp);
    
                    if("886".equals(line))
                        break;
                }
    
                ds.close();
            }catch(IOException e) {
    
            }
        }
    
    }
    

    主类

    public class UdpChatTest {
        /**
         * 案例一:通过udp实现群聊程序
         *
         *  思路:
         *  	这个程序既有收又有发,需要同时执行,需要多线程技术
         *  	一个线程复制发,一个线程负责收。需要两个任务
         * @throws IOException
         */
    
        public static void main(String[] args) throws IOException {
    
            //发送端的socket 接收端的socket
            DatagramSocket sendDs = new DatagramSocket();
            DatagramSocket ReceDs = new DatagramSocket(10006);
    
    		//创建两个任务对象
            Send send = new Send(sendDs);
            Receive rece = new Receive(ReceDs);
    		
    		//创建线程对象,并把任务对象传入
            Thread t1 = new Thread(send);
            Thread t2 = new Thread(rece);
    		
    		//开启线程
            t1.start();
            t2.start();
        }
    }
    
  • 相关阅读:
    Silverlight 开发环境
    Silverlight通过代码恢复控件属性到默认值
    msn登陆弹出“msnmsgr.exe无法找到入口”的解决办法
    Silverlight UI Designer has thrown an unhandled exception
    数据访问技术路线图
    Could Not Load Type ‘System.ServiceModel.Activation.HttpModule’
    卸载Macfee杀毒软件之后Outlook无法加载项scanotlk.dll,outlook已经将其禁用
    SQL Server 2008 无法生成FRunCM线程
    excel2007数据挖掘客户端看不到
    Windows Server 2008 R2 激活文件备份与还原方法如下
  • 原文地址:https://www.cnblogs.com/vfdxvffd/p/11694232.html
Copyright © 2011-2022 走看看