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的更多相关文章

  1. 运输层协议——UDP

    UDP概述: UDP只是做了运输层协议能做的最少工作,仅做了复用/分解,少量的差错检验. UDP是无连接的. UDP优点: 关于何时.发送什么数据的应用层控制更为精细:TCP在拥堵时会遏制发送方的发送 ...

  2. 计算机网络基础笔记 运输层协议UDP/TCP

    目录 UDP 首部结构 主要特点 TCP 首部结构 主要特点 TCP 可靠性实现 停止等待ARQ协议 连续ARQ协议&滑动窗口协议 拥塞控制 TCP 运输连接管理 连接建立:三次握手 连接释放 ...

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

    TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...

  4. 运输层2——用户数据报协议UDP

    目录 1. UDP概述 2. UDP首部格式 3. UDP首部检验和计算方法 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议U ...

  5. 运输层协议TCP和UDP

    运输层协议TCP和UDP 一.用户数据报协议 UDP 1.1.UDP 概述 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能. 虽然 UDP 用户数据报只能提供不 ...

  6. 运输层协议:TCP和UDP

    运输层简介 运输层的通信实体不再是主机,而是主机中的进程.运输层的通信是一台主机的进程和另一台主机的进程进行数据交换. 运输层作用 运输层向上层的应用层提供通信服务 运输层为进程提供端到端的通信 运输 ...

  7. TCP/IP协议---UDP协议

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报.UDP数据报是要依赖IP数据报传送的.UDP协议并不可靠,它不能保证发出去的包会被目 ...

  8. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  9. java 网络通信传输层协议——UDP和TCP

    本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...

随机推荐

  1. 【转】Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方案)

    If you want to use version 3.1 you need to use the following schema: http://xmlns.jcp.org/xml/ns/jav ...

  2. HighCharts基本使用实例(入门)

    HighCharts 摘要 HighCharts是眼下最为流行的图表插件,应用范围广泛,眼下支持曲线图.区域图.3D图.柱状图.饼图.散列图.混合图等,而且还支持一些拓展的特殊图表,如:仪表图.极地图 ...

  3. c++使用mysql的api连接相关问题

    记录一下自己使用中的相关问题,方便有相同问题的同学解决. 关于在VS中的各种配置.看这里.只是须要注意一下,我如今用的mysql版本号是5.6的,已经没有[MySQL Server \lib\opt] ...

  4. GCC 编绎选项 转

    gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:           -Waddress -Warray-bounds (only with -O2) ...

  5. pnd3

    这两天重写了,消除后本身的下落计算还有问题,新产生的块下落和消除已经OK了.消除算法真的很要命.最后还是回归最开始的想法,用递归的方式不断的SPREAD来得到消除的数据.快到月底了,得勤写写了,要不找 ...

  6. hp惠普服务器监控硬盘

    惠普 hpssacli 工具使用 查看raid卡信息(包括控制器状态.Cache状态.电池状态) # hpssacli ctrl all show status 查看raid详细信息 # hpssac ...

  7. user.table.column, table.column 或列说明无效

    Oracle统计采用别名出错(user.table.column, table.column 或列说明无效) >>>>>>>>>>>& ...

  8. Java中的I/O流

    import java.io.*//生成代表输入流的对象fis=new FileInputStream("e:/src/from.txt") //生成代表输出流的对象 fos=ne ...

  9. 各种SQL类型

    一.SQL:通常我们说的sql指的是最古老运用最方法的结构化查询语言(Structured Query Language),大部分人接触最多的是数据库查询使用,关系型数据库基本都支持. 二.T-SQL ...

  10. Navicat 看历史执行SQL

    Navicat可以通过这个框口看手动操作所执行的代码操作