运输层协议----UDP

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

class UDPClient
{
	public static void main(String[] args) throws IOException
	{
		// 构造数据报套接字并将其绑定到本地主机上任何可用的端口
		DatagramSocket client = new DatagramSocket();
		// 在给定主机名的情况下确定主机的 IP 地址
		InetAddress addr = InetAddress.getByName("127.0.0.1");
		int port = 10021;
		for (int i = 0; i < 5; i++)
		{
			String sendStr = "Hello! I‘m Client" + i;
			byte[] sendBuf = sendStr.getBytes();

			// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
			// buf - 包数据 length - 包长度 address - 目的地址 port - 目的端口号
			DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);

			// 从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP
			// 地址和远程主机的端口号。
			client.send(sendPacket);

			byte[] recvBuf = new byte[100];

			// 构造 DatagramPacket,用来接收长度为 length 的数据包。 length 参数必须小于等于
			// buf.length。
			DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length);

			// 从此套接字接收数据报包。
			client.receive(recvPacket);
			String recvStr = new String(recvPacket.getData(), 0, recvPacket.getLength());
			System.out.println("recvMsg =" + recvStr +"; remotePort =" + recvPacket.getPort());
		}

		client.close();
	}
}

  

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

class UDPServer
{
	public static void main(String[] args) throws IOException
	{
		DatagramSocket server = new DatagramSocket(10021);
		byte[] recvBuf = new byte[100];
		for (int i = 0; i < 5; i++)
		{
			DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length);
			server.receive(recvPacket);
			String recvStr = new String(recvPacket.getData(), 0, recvPacket.getLength());
			int port = recvPacket.getPort();
			System.out.println("reveMsg = "+ recvStr + "; remote port =" + port);

			InetAddress addr = recvPacket.getAddress();
			String sendStr = "Hello ! I‘m Server" + i;

			byte[] sendBuf = sendStr.getBytes();
			DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);

			server.send(sendPacket);
		}

		server.close();
	}
}

client端输出:

recvMsg =Hello ! I‘m Server0; remotePort =10021
recvMsg =Hello ! I‘m Server1; remotePort =10021
recvMsg =Hello ! I‘m Server2; remotePort =10021
recvMsg =Hello ! I‘m Server3; remotePort =10021
recvMsg =Hello ! I‘m Server4; remotePort =10021

server端输出:

reveMsg = Hello! I‘m Client0; remote port =61226
reveMsg = Hello! I‘m Client1; remote port =61226
reveMsg = Hello! I‘m Client2; remote port =61226
reveMsg = Hello! I‘m Client3; remote port =61226
reveMsg = Hello! I‘m Client4; remote port =61226

UDP运输层协议:

(1)UDP是一种无连接的服务,即在两个进程间没有创建管道时的初始握手阶段。

(2)因为UDP没有管道,所以当一个进程需要向另一个进程发送一批字节时,该发送进程需要为这批字节附上目的进程地址(IP和port),并且,该过程对于每批由发送进程所发送的字节都必须重复做,见循环中五次发送UDP报文的操作。

由于UDP当中没有流与套接字相关联,事实上UDP也不是将字节送入与Socket相关的流,而是将一个个分组通过DataGramSocket对象直接发送出去。

而在TCP运输层协议中:

(1)TCP在客户机进程和服务机进程之间提供了可靠的字节流服务,一旦建立连接,两端就可以通过与Socket对象相关联的输入输出流来进行数据交互,而不用像UDP那样每次都要通过DataGramSocket对象指明远端IP和port来发送和接收

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

class TCPClient
{
	public static void main(String[] args) throws IOException
	{
		// 构造数据报套接字并将其绑定到本地主机上任何可用的端口
		Socket client = new Socket();
		// 在给定主机名的情况下确定主机的 IP 地址
		InetAddress addr = InetAddress.getByName("127.0.0.1");
		int port = 10021;
		client.connect(new InetSocketAddress(addr, port));
		OutputStream output = client.getOutputStream();
		InputStream input = client.getInputStream();
		for (int i = 0; i < 5; i++)
		{
			String sendStr = "Hello! I‘m Client" + i;

			output.write(sendStr.getBytes());

			byte[] recvBuf = new byte[100];

			int length = input.read(recvBuf);
			String str = new String(recvBuf);
			System.out.println("recvMsg =" + str.substring(0,length));
		}

		client.close();
	}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

class TCPServer
{
	public static void main(String[] args) throws IOException
	{
		ServerSocket server = new ServerSocket(10021);
		Socket socket = server.accept();
		OutputStream output = socket.getOutputStream();
		InputStream input = socket.getInputStream();
		byte[] recvBuf = new byte[100];
		for (int i = 0; i < 5; i++)
		{
			int len = input.read(recvBuf);
			String str = new String(recvBuf);

			System.out.println("reveMsg = "+ str.substring(0,len) + "; remote port =" + socket.getRemoteSocketAddress());

			String sendStr = "Hello ! I‘m Server" + i;

			output.write(sendStr.getBytes());
		}

		server.close();
	}
}

client端输出:

recvMsg =Hello ! I‘m Server0
recvMsg =Hello ! I‘m Server1
recvMsg =Hello ! I‘m Server2
recvMsg =Hello ! I‘m Server3
recvMsg =Hello ! I‘m Server4

server端输出:

reveMsg = Hello! I‘m Client0; remote port =/127.0.0.1:54233
reveMsg = Hello! I‘m Client1; remote port =/127.0.0.1:54233
reveMsg = Hello! I‘m Client2; remote port =/127.0.0.1:54233
reveMsg = Hello! I‘m Client3; remote port =/127.0.0.1:54233
reveMsg = Hello! I‘m Client4; remote port =/127.0.0.1:54233

  

  

时间: 2024-10-02 01:17:36

运输层协议----UDP的相关文章

运输层协议--TCP及UDP协议

TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 接受主机中的运输层实际上并没有直接将数据交给进程,而是通过一个中间的套接字来传递.由于在任何一个时刻接受主机上可能有多个套接字,所以每个套接字都已一个唯一的标识符. 主机如何将一个收到的运输层报文段定向到合适的套接字? 为达到这一目的,在每个运输层报文段中设置了几个字段,在接收端,运输层检查并标识

第五章 运输层(UDP和TCP三次握手,四次挥手分析)

序言   通过这章,可以知道其实三次握手和四次挥手其实真的好简单,通过这章的学习,我相信你也会同样的认为,以后在也不需要听到别人问三次握手的过程而自己一脸懵逼了,觉得人家好屌,其实也就是他懂你不懂,仅此而已,不懂就去学.学了你就会觉得其实也就那样,没有什么厉害的,这让我回想以前刚学习编程的时候,那时候刚学C,别人就说会写java的helloworld,真TM觉得屌啊,我连helloworld是什么度不知道.一直羡慕人家,怎么这么厉害,然后自己心里很虚,自己这么菜啊,其实不然,不懂的就去学习,学懂

网络协议UDP

------------------------------互联网协议与协议族------------------------------tcp/ip协议介绍:计算机网络协议,不同类型不同厂家之间的终端进行沟通,规范协议 . 互联网协议族:为tcp/ip协议族 大概有上百种协议,其中tcp协议.ip协议使用的比较 多所以大家默认成为tcp/ip IP地址:网络地址(ip地址与子网掩码进行与运算获得)和主机地址A类IP地址:由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0” (地

【tcp-ip学习总结】传输层协议UDP和TCP

互联网中任何两台主机之间通讯,都是从一端到另一端,又称端到端的通讯.端口又是什么?现代的操作系统都装有很多个应用程序,信息传到了我的电脑上我怎么知道这个信息就是传给我的QQ应用程序的呢?我的QQ程序有反应但是我的MSN怎么没有反应呢? 原因就是:我的系统有很多个端口号,每一个应用程序进程都绑定了本地一个独一无二端口号,这样每一个程序都与一个端口号绑定.比如QQ绑定了本地的6666端口号(假设都是UDP端口号),这个一个消息发来,消息报文头显示要发到6666这个端口号,上面的进程也就是QQ程序了,

计算机网络基础知识总结

一,最主要的三种网络 (1)电信网络(电话网),负责话音通信,也就是打电话.接听电话. (2)有线电视网络,主要提供视频服务. (3)计算机网络,主要是数据传输服务,也就是说是资源共享,其主要的服务就是因特网. 三种网络在各自的通信协议下传输信息,为用户提供通信服务. 二,计算机网络背景 20世纪40年代以来,人们就梦想能拥有一个世界性的信息库.在这个信息库中,信息不仅能被全球的人们存取,而且能轻松地链接到其他地方的信息,使用户可以方便快捷地获得重要的信息.因此,互联网应运而生. interne

理解TCP和UDP协议

目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 ·        Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号:用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接: ·        Sequence Number:用来标识从T

《TCP/IP详解卷2:实现》笔记--UDP:用户数据报协议

用户数据报协议,即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作只产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口,来访问UDP.该类型插口默认地称为无连接的.每次进程发送 数据时,必须指定目的IP地址和端口号.每次从插口上接收数据报时,进程可以从数据报中收到源IP地址和端口号. UDP插口也可以被连接到一个特殊的IP地址和端口,这样,所有写到该插口的数据报都被发往该目的地,而且只有来自该IP 地址和端口号的数据

TCP与UDP协议的区别

首先TCP和UDP协议都是运行在运输层的协议. UDP协议:用户数据包协议 1.UDP协议是无连接的.也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延. 2.UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表. 3.UDP是面向报文.发送方的UDP对于应用程序进程交下来的报文,即不合并,也不拆分,而是保留这些报文的边界.这也就是说,应用层交付给UDP多长的报文,UDP就照样发送,即一次发

【精】TCP/IP协议简介(四) 之 传输层UDP&amp;TCP

传输层:UDP 协议 一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地讲,通信双方不是主机,而是主机中的进程. 主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在于 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信. 两个主机的传