网络编程--UDP

一 . 简介

  • UDP协议(用户数据报协议)将数据及源和目的封装成数据包,不需要建立连接。
  • UDP协议以数据报作为数据传输的载体,每个数据报大小限制在64K以内
  • 使用UDP进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明所要达到的Socket(主机地址和端口号),然后在将数据报发生出去。
  • 因为无连接,所以该协议速度很快,同时也导致这是一个不可靠协议

二. 相关操作类

1. DatagramPacket:表示数据报包
构造方法:

DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
//构造数据报包,用来将长度为 length 的包---发送---到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length) 
//构造 DatagramPacket,用来---接收---长度为 length 的数据包。

常用方法:

 InetAddress getAddress() 
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 
 byte[] getData() 
          返回数据缓冲区。 
 int getLength() 
          返回将要发送或接收到的数据的长度。 
 int getPort() 
          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 

2. DatagramSocket:进行端到端通信的类

void receive(DatagramPacket p) 
          从此套接字接收数据报包。 
void send(DatagramPacket p) 
          从此套接字发送数据报包。

//根据客户端发送过来的socket,服务端可以进行获取该客户端的相关信息
InetAddress getInetAddress() 
          返回此套接字连接的地址 
int getPort() 
          返回此套接字的端口  

三. 简单聊天工具

import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
class Send implements Runnable
{
    //1..创建Socket服务(系统随机分配,不需指定端口)
    private DatagramSocket ds;
    Send(DatagramSocket ds)
    {
        this.ds = ds;
    }
    public void run()
    {
        try
        {
            //键盘录入聊天内容
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while((line=bufr.readLine())!=null)
            {
                //2..创建数据报,将数据封装
                byte[] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10002);
                //3..发送数据报
                ds.send(dp);
                if("over".equals(line))
                    break;
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("发送端异常");
        }
    }
}

class Rece implements Runnable
{
    //1..创建Socket服务(指定端口)
    private DatagramSocket ds;
    public Rece(DatagramSocket ds)
    {
        this.ds = ds;
    }
    public void run()
    {
        try
        {
            while(true)
            {
                //2..创建数据报,用于接收数据
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                //3..接收数据
                ds.receive(dp);  //此方法在接收到数据报之前会一直阻塞
                //4..处理数据
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());
                if("over".equals(data))
                {
                    System.out.println(ip+"下线");
                    break;
                }
                Date d = new Date();
                DateFormat df = new SimpleDateFormat("HH:mm:ss");
                System.out.println(ip+"  "+df.format(d)+"\n"+data);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("接收端异常");
        }
    }
}

class ChatTest
{
    public static void main(String[] args) throws Exception
    {
        DatagramSocket sendSocket = new DatagramSocket();
        DatagramSocket receSocket = new DatagramSocket(10000);
        new Thread(new Send(sendSocket)).start();
        new Thread(new Rece(receSocket)).start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值