A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

思路:
        在同一个java文件中写发送端与接收端,使用多线程完成。
        1,建立Send端,使用读取流读取键盘录入,将数据以byte[]的形式保存。
        2,建立数据报(DatagramPacket),填写参数,将byte[]数据发出。
        3,建立Rece端,建立byte[]与数据报,用来等待接收数据。
        3,得到数据报之后,调用数据报方法,得出数据报里的各种信息,例如,ip,data



import java.net.*;
import java.io.*;

class UdpOnline
{
        public static void main(String[] args)
        {
                try
                {

                DatagramSocket sendds=new DatagramSocket();//创建send端点
                DatagramSocket receds=new DatagramSocket(10003);//创建rece端点

                Send send=new Send(sendds);//创建send
                Rece rece=new Rece(receds);//创建rece

                new Thread(send).start();//send跑起!
                new Thread(rece).start();//rece跑起!

                }
                catch (Exception ex)
                {
                        throw new RuntimeException("建立失败!");
                }
        }
}

class Send implements Runnable//Udp  Send
{
        private DatagramSocket ds;
        Send(DatagramSocket ds)
        {
                this.ds=ds;
        }

        public void run()
        {
                try
                {
                        while(true)
                        {
                        //读取流读取键盘录入。
                        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
                        //将键盘录入的数据存储到String line 中做准备。
                        String line=null;
                       
                        while ((line=bufr.readLine())!=null)//注意,readLine方法是阻塞式方法,无数据会等待。
                        {
                                //将键盘录入的数据转成byte[],方便下面传送。
                                byte[] info=line.getBytes();
                                //创建数据报,并发送出去。这里我发送的目的地是自己。将ip和端口改成自己想要的吧,记得上面端口也要改。
                                DatagramPacket dp=new DatagramPacket(info,info.length,InetAddress.getByName("127.0.0.1"),10003);
                                //发送数据出去。
                                ds.send(dp);
                                //聊天结束语句。
                                if("over".equals(line))
                                        break;
                        }
                                //聊天结束语句。
                                if("over".equals(line))
                                        break;
                                //关闭资源。
                                bufr.close();
                                ds.close();

                        }



                }

                catch (Exception ex)
                {
                        throw new RuntimeException("Send data ok");
                }

       
        }
}


class Rece implements Runnable//Udp Rece
{
        private DatagramSocket ds;
        Rece(DatagramSocket ds)
        {
                this.ds=ds;
        }

        public void run()
        {
                try
                {        //创建数据接收的容器.
                        byte[] buf=new byte[1024];
                        while(true)
                        {
                        //创建数据报,为数据接受做准备。
                        DatagramPacket dp=new DatagramPacket(buf,buf.length);
                        //等待数据接受。也就是当监听的端口有数据报来时,在执行一次,也是阻塞式方法。
                        ds.receive(dp);
                        //获得数据报后,查看数据报相关信息,例如ip,data
                        String ip=dp.getAddress().getHostAddress();
                        String data=new String(dp.getData(),0,dp.getLength());
                        //打印出来.
                        System.out.println(ip+"::"+data);
                        //结束语句。
                        if("over".equals(data))
                                        break;

                        }

                       
                }
                catch (Exception ex)
                {
                        throw new RuntimeException("Rece data lose");
                }

        }
}

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马