Socket网络编程
UDP和TCP:
UDP(User Datagram Protocol):用户数据报协议
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法
UDP的特点:
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。
吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。
UDP的一个简单实现:
服务端:
package com.wish; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpSocketServer { public static void main(String[] args) throws IOException { System.out.println("udp服务器端启动连接...."); DatagramSocket ds = new DatagramSocket(8090); byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 阻塞,等待接受客户端发送请求 ds.receive(dp); System.out.println("来源:"+dp.getAddress()+",端口号:"+dp.getPort()); // 获取客户端请求内容 String str=new String(dp.getData(),0,dp.getLength()); System.out.println("str:"+str); ds.close(); } }
客户端:
package com.wish; import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpClient { public static void main(String[] args) throws IOException { System.out.println("udp客户端启动连接...."); DatagramSocket ds = new DatagramSocket(); String str="123456789"; byte[] bytes= str.getBytes(); DatagramPacket dp= new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"),8080); ds.send(dp); ds.close(); } }
TCP(Transmission Control Protocol):传输控制协议
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP的特点:
package com.wish; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws IOException { System.out.println("socket tcp服务器端启动...."); ServerSocket serverSocket = new ServerSocket(8080); // 等待客户端请求 Socket accept = serverSocket.accept(); InputStream inputStream = accept.getInputStream(); // 转换成string类型 byte[] buf = new byte[1024]; int len = inputStream.read(buf); String str = new String(buf, 0, len); System.out.println("服务器接受客户端内容:" + str); } }
package com.wish; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class TcpClient { public static void main(String[] args) throws IOException { System.out.println("socket tcp 客户端启动...."); Socket socket = new Socket("192.168.60.29", 8080); OutputStream outputStream = socket.getOutputStream(); outputStream.write("黑夜就是你的面纱".getBytes()); socket.close(); } }
协议对比:
原文地址:https://www.cnblogs.com/wishsaber/p/12190670.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何实现四元数的运算
- 最牛一篇布隆过滤器详解
- 编写一个IDEA插件之:开发环境准备那些坑
- 编写一个IDEA插件之:使用PSI分析Java代码
- 编写一个IDEA插件之:自动生成Java代码
- 编写一个IDEA插件之:事件监听
- 重新加载故障节点上的 Ceph 卷
- 一个Spring Bean从诞生到逝去的九次人生转折!
- 原创 | 详解git rebase,让你走上git大神之路
- 启用chrome浏览器内置的二维码生成插件
- ZeroLogon漏洞(CVE-2020-1472)防御性指南
- 原创 | 随机数大家都会用,但是你知道生成随机数的算法吗?
- 原创 | codeforces 1425E,一万种情况的简单题
- 原创 | codeforces 1417C,逆向思考的数据结构题
- 原创 | 操作失误不要慌,这个命令给你的Git一次反悔的机会