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限制
- 提高访问速度