您的位置:首页 > 编程语言 > Java开发

java UDP/IP

2013-12-03 16:19 253 查看
一、UDP概念:

UDP是在IP上发送数据的另一种协议。不可靠,无法知道数据是否到达,也无法知道数据的不同部分是否已发送时的数据到达。

UDP为什么有使用之地:在实时音频或视频中丢失或交换数据包只会出现噪声。噪声是可以容忍的。但是不可容忍停顿, 

UDP的实现分为两个类:DatagramPacket(将数据字节填充到数据报的UDP包中)和DatagramSocket(可以收发UDP数据报)。 

与TCP的ServerSocket和Socket不同之处:

1.UDP没有两台主机间唯一连接的概念,一个DatagramSocket可以从多个独立主机收发数据。此 处的socket并不专注于一个连接。 

2.TCP将网络视为流,通过socket获取输入输出流来收发数据,UDP以数据包形式发送 

DatagramPacketUDP数据报基于IP建立的,每台主机有65536个端口号可以使用。数据报中字节数限制为65536-8 个字节(首部要用8个字节) 
二、DatagramPacket类中函数

getInetAddress():返回一个包含远程主机地址的InetAddress对象。如果数据报是internet接收的,返回的地址是发送机器的地址。如果是客户端,则返回的是寻址地址。 

getPort():返回远程端口

SocketAddress getSocketAddress():返回一个包含远程主机和端口的SocketAddress对象。 

byte[] getData():返回一个字节数组,其中包含数据报中的数据 

getLength():返回数据报中数据的字节数。它与getData()返回的数组长度不一定相等, 

getLength()返回的值可能小于getData()返回的数组长度。 

setData(byte[] data):  

setData(byte[] data,int offset,int length)  

setLength(int length):会改变内部缓冲区中包含实际数据报数据的字节数,而不包含未填充数据的空间。 

TCP端口和UDP端口没有关联,TCP和UDP可以使用相同的端口号 

setSoTimeout(int timeout):默认0永不超时 

setReceiveBufferSize(int size)throws SocketException: 

建议对来自此socket的输入进行缓冲时使用的字符字节数,但是底层完全可以忽略此建议


 

  

示例一:
//服务器
public class Server {
private void start() throws Exception {
DatagramSocket socket = new DatagramSocket(8888);//服务器端口号为8888
byte[] receiveBuffer = new byte[1024];//服务器使用receiverBuffer来存储接收到的数据
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
socket.receive(receivePacket);//阻塞等待接收客户端数据,接收到后会保存在receiverBuffer中
/**把接收到的数据转换成字符串
* receivePacket.getData();//返回的对象就是receiveBuffer;
* 所以下面的一行代码可以改为
   * String s = new String(receivePacket.getData()).trim()
   */
String s = new String(receiveBuffer).trim();
System.out.println(s);
socket.close();
}
public static void main(String[] args) throws Exception {
new Server().start();
}
}
//客户端
public class Client {
private void start() throws Exception {
DatagramSocket socket = new DatagramSocket();
byte[] sendBuffer = "Hello".getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
//address代表服务器的ip,8888是服务器的端口号
DatagramPacket sendPacket =
  new DatagramPacket(sendBuffer, sendBuffer.length, address, 8888);
socket.send(sendPacket);//发送
socket.close();
}
public static void main(String[] args) throws Exception {
new Client().start();
}
}
示例二:
//服务器
public class Server {
private void start() throws Exception {
DatagramSocket socket = new DatagramSocket(8888);// 服务器端口号为8888
byte[] receiveBuffer = new byte[1024];// 服务器用receiverBuffer来存储接收的数据
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer,receiveBuffer.length);
socket.receive(receivePacket);// 阻塞等待接收客户端数据,接收到保存在receiverBuffer中
String s = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println(s);//Hello
byte[] sendBuffer = "OK".getBytes();
InetAddress clientAddress = receivePacket.getAddress();
int clientPort = receivePacket.getPort();
DatagramPacket sendPacket
= new DatagramPacket(sendBuffer,	sendBuffer.length,clientAddress, clientPort);
socket.send(sendPacket);
socket.close();
}
public static void main(String[] args) throws Exception {
new Server().start();
}
}
//客户端
public class Client {
private void start() throws Exception {
DatagramSocket socket = new DatagramSocket();
byte[] sendBuffer = "Hello".getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
// address代表服务器的ip,8888是服务器的端口号
DatagramPacket sendPacket
= new DatagramPacket(sendBuffer, sendBuffer.length, address, 8888);
socket.send(sendPacket);// 发送
byte[] receiveBuffer = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer , receiveBuffer.length);
socket.receive(receivePacket);
String recvStr = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println(recvStr);//OK
socket.close();
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
new Client().start();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java UPD IP DatagramPacket