java UDP/IP

原创 2013年12月03日 16:19:57

一、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 TCP/IP协议笔记之UDP 套接字

UDP 协议提供了一种不同于 TCP协议的端到端服务,实际上 UDP 协议只实现两个功能:        1)在 IP协议的基础上添加了另一层地址(端口)        2)对数据传输过程中可能产...

【Java TCP/IP Socket】UDP Socket(含代码)

UDP协议提供的服务不同于TCP协议的端到端服务,它是面向非连接的,属不可靠协议,UDP套接字在使用前不需要进行连接。实际上,UDP协议只实现了两个功能:     1)在IP协议的基础上添加了端口; ...

java中基于UDP_IP协议的网络

UDP网络通信 >类DatagramSocket

[分布式java]基于JavaAPI实现消息方式的系统间通信:UDP/IP+BIO

基于JavaAPI实现消息方式的系统间通信: UDP/IP+BIO  * UDP是一个不可靠无连接协议,数据直接发往接收端后不管是否成功。  * JavaAPI中,DatagramSocket...
  • mjjmjc
  • mjjmjc
  • 2015年08月27日 16:27
  • 276

【Java TCP/IP Soket】— UDP套接字的基本使用

【Java TCP/IP Soket】— UDP套接字的基本使用 一.UDP套接字 二.UDP套接字与TCP套接字的区别 三.UDP套接字的基本使用...

(java)在两台已知Ip的电脑间,使用UDP协议进行通讯

发送的代码:import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; ...

Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】

一、简单的网络知识 1、网络模型: ①、OSI/RM(Open System Interconnection Reference Model开放式系统互连基本参考模型),是由ISO(Int...

java TCP/IP Socket编程-----基本套接字-----UDP通讯-----笔记6

概述: UDP协议提供了一种不同于TCP协议的端到端服务。实际上UDP协议只实现两个功能: 1)在IP协议的基础上添加了另一层地址(端口), 2)对数据传输过程中可能产生的数据错误进行了检测,并...

19. JAVA 网络编程 Part 1 (IP与InetAddress类、URL与URLConnection类、URLEncoder与URLDecoder类、TCP&UDP)---- 学习笔记

本章目标: 了解IP地址与InetAddress类的关系了解如何使用URL
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java UDP/IP
举报原因:
原因补充:

(最多只允许输入30个字)