UDP网络通信收发包原理即代码

UDP网络通信的发包过程

1、使用DatagramSocket()创建一个数据包套接字。

2、使用DatagramPacket(byte[]buf, int offset, int length, InetAddress address, int port)创建要发送的数据包。

3、使用DatagramSocket类的send()方法数据包

 UDP网络通信的收包过程

1、使用DatagramSocket(int)创建一个数据包套接字,绑定到指定的端口。

2、使用DatagramPacket(byte[]buf,int length)创建字节数组来接收数据包.

3、使用DatagramSocket类的receive()方法接收UDP获取的数据实际上就存储在创建空包的数组种,转换显示时建议设置长度

System.out.println(dp.getLength()); //数据的具体长度

String str=new String(buffer,0,dp.getLength());

一般来说UDP协议的最大数据包的长度64k

多播或者组播的实现

代码实现

import java.io.FileWriter;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Rec {
	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket(9999);
		byte[] buffer = new byte[8192];
		DatagramPacket dp=new DatagramPacket(buffer, buffer.length);
		ds.receive(dp);

		System.out.println(dp.getLength()); //数据的具体长度
		String str=new String(buffer,0,dp.getLength());
		System.out.println(str);
		ds.close();
		
		PrintWriter pw=new PrintWriter(new FileWriter("d:/bbb.txt"));
		pw.println(str);
		pw.close();
	}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Send {
	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket();
		String msg = "现在几点了?";
		byte[] data = msg.getBytes();
		DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);
		ds.send(dp);
		ds.close();
	}
}

 

真正聊天室的实现原理

MulticastSocket可以将数据报以广播的方式发送给加入指定组的所有客户端

组播是指把信息同时传递给一组目的地址。它使用的策略是最高效的,因为消息在每条网络链路上只需传递一次,且

只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点传递被称作单播。当以单播的形式把消息传

递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可

扩展性。不过,许多流行的协议——例如XMPP,用限制接收者数量的方法弥补了这一不足

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Rev {
public static void main(String[] args) throws Exception {
	MulticastSocket ms=new MulticastSocket(9999);
	InetAddress ia=InetAddress.getByName("225.0.0.1");
	ms.joinGroup(ia);
	byte[] buffer=new byte[8192];
	DatagramPacket dp=new DatagramPacket(buffer, buffer.length);
	ms.receive(dp);
	System.out.println(dp.getAddress());
	System.out.println(dp.getPort());
	String str=new String(buffer,0,dp.getLength());
	System.out.println(str);
	ms.close();
}
}

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Revs {
	public static void main(String[] args) throws Exception {
		MulticastSocket ms = new MulticastSocket(9999);
		InetAddress ia = InetAddress.getByName("225.0.0.1");
		ms.joinGroup(ia);
		byte[] buffer = new byte[8192];
		DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
		Thread t1=new Thread() {
			public void run() {
				while (true)
					try {
						ms.receive(dp);
						String str = new String(buffer, 0, dp.getLength());
						System.out.println(str);
					} catch (IOException e) {
						e.printStackTrace();
					}
			}
		};
		t1.setDaemon(true);
		t1.start();

	}
}
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Date;

public class Send {
	public static void main(String[] args) throws Exception {
		MulticastSocket ms = new MulticastSocket(8000);
		for (int i = 0; i < 10; i++) {
			String msg = "达到王金西" + new Date();
			byte[] data = msg.getBytes();
			DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("225.0.0.1"), 9999);
			ms.send(dp);
			Thread.sleep(1000);
		}
		ms.close();
	}
}

 

## 代理服务器的使用

JDK1.5提供了Proxy和ProxySelector类来实现代理访问。

Proxy代表一个代理服务器,可以在打开URLConnection连接时指定代理,也可以在创建Socket连接时指定代理。

ProxySelector是一个代理选择器,提供了对代理服务器更加灵活的控制,可以对http\https\ftp\socket等进

行分别设置,还可以设置不需要通过代理服务器的主机和地址

代理服务器的功能

- 突破自身IP限制

- 提高访问速度

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值