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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴华二 中级黑马   /  2012-3-27 00:56  /  2393 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.net.*;
import java.io.*;
class Send implements Runnable
{
        private DatagramSocket ds;
        public Send(DatagramSocket ds){
                this.ds = ds;
        }

        public void run(){
                try
                {
                        BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
                        String line = null;
                        while((line = br.readLine())!=null){
                                if("886".equals(line))
                                        break;

                                byte[] buf =line.getBytes();       

                                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);

                                ds.send(dp);
                        }
                }
                catch (Exception e)
                {
                        throw new RuntimeException("发送端出错!");
                }
               

        }

}

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

        public void run(){
                try
                {                       
                        while(true){
                                byte[] buf = new byte[1024];
                                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                                ds.receive(dp);

                                String ip = dp.getAddress().getHostAddress();
                                //System.out.println(ip);

                                String data = new String(dp.getData(),0,dp.getLength());

                                System.out.println(ip+":"+data);
                        }
                }
                catch (Exception e)
                {
                        throw new RuntimeException("接收端出错!");
                }
        }

}

class ChatDemo
{
        public static void main(String[] args) throws Exception
        {
                DatagramSocket sendSocket = new DatagramSocket();
                DatagramSocket receSocket = new DatagramSocket(10002);

                new Thread(new Send(sendSocket)).start();
                new Thread(new Rece(receSocket)).start();

        }
}
通过学习了UDP,写出一个dos下面的一个聊天工具,用两台机子测试正确。在理解那个 DatagramPacket时候有点晕了,有朋友能帮忙说一下这里的原理吗?谢谢...

4 个回复

倒序浏览
Udp的数据是通过包的形式发送的
而DatagramPacket就是将数据封包的java类
回复 使用道具 举报
udp是面向无连接的,数据是以数据包来传输的,每一个数据包都可以独立的到达目的地,所以传输端数据包要包含传输的数据,目的地址以及端口号,java为这个数据包
提供了一个专门的类,就是DatagramPacket,相当于邮局的包裹。
回复 使用道具 举报
UDP协议的全称是用户数据包协议,在网络中它与TCP协议一样用于处理。UDP数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
回复 使用道具 举报
与TCP协议发送和接收字节流不同,UDP终端交换的是一种称为数据报文的自包含(self-contained)信息。这种信息在Java中表示为DatagramPacket类的实例。发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马