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