黑马程序员-网络编程之UDP传输小总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

UDP和TCP
UDP:无连接,不可靠,速度快,数据报大小不超过64k。聊天工具,实时摄像投影软件都是UDP。
TCP:面向连接,通过三次握手监测链接,可靠,速度慢,TCP数据包容量更大。下载软件用的是TCP。

UDP传输:
发送端:
1 创建udp服务,通过DatagramSocket对象。DatagramSocket对象是包投递服务的发送或接受点。
DatagramSocket ds=new DatagramSocket(20000);//为自己指定端口号是20000

2 确定数据,并装成数据包。DatagramPacket类表示数据报包,用于无连接投递服务(udp)
/DatagramPacket(byte[] buf,int lenth,InetAddress address,int port)
//构造数据报包,用来将长度为lenth的发送到指定主机上的指定端口号
byte[] data="
我是udp

".getBytes();
DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),10000);

3 通过socket服务,将已有的数据包发送出去,通过send方法。
ds.send(dp);

4 关闭资源。
ds.close();

接收端:
1 创建udpsocket服务,建立端点
DatagramSocket ds=new DatagramSocket(10000);//监听10000端口,也就是为自己指定端口为10000

2 定义数据包。用于存储接收来的数据包。
//DatagramPacket(byte[]buf,int length)构造DatagramPacket,用来接收长度为length的数据包
byte[]buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);

3 通过服务的receive方法将收到的数据存入数据包中。这是一个阻塞式方法,线程机制,就是说没有数据来,程序就停在这里等到数据来再向下执行。
ds.receive(dp);

4 通过数据包的方法获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();//返回这个包的目的端口号(发送的时候)或者源端口号(接收的时候)。每个程序都会被系统自动随机分配一个端口号,即使程序不变,每次随机分配一个。
System.out.println(ip+"::"+data+"::"+port);

//5关闭资源
ds.close();

点对点单向聊天软件的制作,详情见UDPDemo.java 和UDPDemo2.java,用dos命令窗口来实现。
如果想实现群聊,可以把ip最后一位设为255.
利用多线程实现可以同时收发信息的聊天软件。
实现代码如下:

/*编写一个聊天程序
 * 有收数据的部分和发数据的部分
 * 这两个部分需要同时执行,所以用到多线程技术
 * 一个线程控制收,一个线程控制发
 * 因为收和发的动作是不一致的,所以要定义两个run方法
 * 而且这两个run方法要封装到不同的类中*/
class Send1 implements Runnable{
	DatagramSocket ds;
	DatagramPacket dp;
	Send1(DatagramSocket ds){
		this.ds=ds;
	}
	public void run() {
		BufferedReader br=null;
		try {
			br=new BufferedReader(new InputStreamReader(System.in));
			String s=null;
			while((s=br.readLine())!=null){
				if(s.equals("over"))break;
				byte[] data=s.getBytes();
				dp=new DatagramPacket(data,0,data.length,InetAddress.getByName("127.0.0.1"),10003);
				ds.send(dp);
			}
		} catch (Exception e) {
			throw new RuntimeException("发送端出问题了");
		}finally{
			try {
				br.close();
				ds.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
}

class Receive1 implements Runnable{
	DatagramSocket ds;
	Receive1(DatagramSocket ds){
		this.ds=ds;
	}
	public void run() {
		
		try {
			while(true){
				byte[] data=new byte[1024];
				DatagramPacket dp=new DatagramPacket(data,data.length);
				ds.receive(dp);
				String s=new String(dp.getData(),0,dp.getLength());
				System.out.println(dp.getAddress().getHostAddress()+"的"+dp.getPort()+"端口号说:"+s);
			}
		} catch (Exception e) {
			throw new RuntimeException("接收端出问题了");
		}
	}
}

class ChatDemo{
	public static void main(String[]args) throws Exception{
		DatagramSocket sendSocket=new DatagramSocket();
		DatagramSocket receiveSocket=new DatagramSocket(10003);
		
		new Thread(new Send1(sendSocket)).start();
		new Thread(new Receive1(receiveSocket)).start();
	}
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值