运输层协议----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
这个情景不具有现实意义,当发送数据较大较快的时候,服务端的TCP连接是无法区分数据怎么分离的
这个设定是buffer足够大,client端发送不够快 如果将buffer设置为2
运输层协议----UDP的更多相关文章
- 运输层协议——UDP
UDP概述: UDP只是做了运输层协议能做的最少工作,仅做了复用/分解,少量的差错检验. UDP是无连接的. UDP优点: 关于何时.发送什么数据的应用层控制更为精细:TCP在拥堵时会遏制发送方的发送 ...
- 计算机网络基础笔记 运输层协议UDP/TCP
目录 UDP 首部结构 主要特点 TCP 首部结构 主要特点 TCP 可靠性实现 停止等待ARQ协议 连续ARQ协议&滑动窗口协议 拥塞控制 TCP 运输连接管理 连接建立:三次握手 连接释放 ...
- 运输层协议--TCP及UDP协议
TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...
- 运输层2——用户数据报协议UDP
目录 1. UDP概述 2. UDP首部格式 3. UDP首部检验和计算方法 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议U ...
- 运输层协议TCP和UDP
运输层协议TCP和UDP 一.用户数据报协议 UDP 1.1.UDP 概述 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能. 虽然 UDP 用户数据报只能提供不 ...
- 运输层协议:TCP和UDP
运输层简介 运输层的通信实体不再是主机,而是主机中的进程.运输层的通信是一台主机的进程和另一台主机的进程进行数据交换. 运输层作用 运输层向上层的应用层提供通信服务 运输层为进程提供端到端的通信 运输 ...
- TCP/IP协议---UDP协议
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报.UDP数据报是要依赖IP数据报传送的.UDP协议并不可靠,它不能保证发出去的包会被目 ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- java 网络通信传输层协议——UDP和TCP
本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...
随机推荐
- C#通过FTP账号上传、修改、删除文件 FTPClient
下面类文件中,主要做的工作是:从ftp服务器上下载文件把本地文件替换.添加.或删除功能,在替换本地文件时会先备份一下本地的文件,若整个操作都完成了就会发出commit命令,表示全部替换成功.若中间操作 ...
- SSH服务
基于Linux的服务器有多个网卡,其中一个网卡连接了网线,通过该网线链接了个人PC.PC上启动Vmware虚拟机,启动ubuntu系统.然后设置PC的网络为自动获取IP,在PC的Linux的Ubunt ...
- Quartz.NET simple_demo
Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和 ...
- linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏
1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...
- X86(32位)与X64(64位)有什么区别,如何选择对应的操作系统和应用程序?
X86就是我们一般用的32位的系统,指针长度为32位(386起):X64就是64位的系统,指针长度为64位. 选择硬件对应的软件,建议通过以下三条考虑:1.64位操作系统相对32位操作系统理论上性能会 ...
- HTML5本地化应用开发-HTML5 Web存储详解
文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的.我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chengxiaoxiao.com/)写作完成. ...
- wps批量使标题靠文档左边
- 关于Androdi中SQLITE 3采用GBK编码存储,数据库中文乱码问题。
1.最近开发一个项目,用SQLite Expert Personal打开数据库如下图,title会产生乱码,问题. 2.由于SQL lite默认是存储UTF-8格式,后来更改数据库编码类型为ANSI, ...
- while循环的跳出
今天在编码时突然产生一个疑问:程序中有一个while循环,循环体执行的是某个附带条件限制的操作.我现在想达到的目的是 => 条件成立,就执行操作,并跳出循环:条件不成立就跳出当次的while循环 ...
- UITextField 对输入金额的约束
[2016/1/18更新] -- 五个人辛辛苦苦干了一年的项目终于上线了,今天有空看了一下正则表达式教程,然后开始rebuild之前的种种对字符串的约束,首先就从这个金额输入框开始吧,修改后的代码如下 ...