当前位置: 首页 > news >正文

住房和城乡建设部网站 事故安微省建设厅田网站

住房和城乡建设部网站 事故,安微省建设厅田网站,跨境购物网站建设,泰州网站建设传输层中UDP和TCP的api实现原理 1. UDP和TCP协议特点1.1 TCP1.2 UDP 2. UDP协议中socket api的使用2.1 服务器#xff1a;2.2 客户端2.3 整个流程 3. TCP协议中的api使用3.1 TCP服务器3.2 TCP客户端3.3 整个流程 1. UDP和TCP协议特点 1.1 TCP 有连接#xff1a;抽象#x… 传输层中UDP和TCP的api实现原理 1. UDP和TCP协议特点1.1 TCP1.2 UDP 2. UDP协议中socket api的使用2.1 服务器2.2 客户端2.3 整个流程 3. TCP协议中的api使用3.1 TCP服务器3.2 TCP客户端3.3 整个流程 1. UDP和TCP协议特点 1.1 TCP 有连接抽象虚拟的连接如打电话可靠传输尽可能的完成数据传输虽然无法确保数据到达对方至少可以知道当前数据是不是收到了面向字节流此处的字节流和文件中的字节流完全一致全双工一个通信可以双向通信。而半双工只能单向通信 1.2 UDP 无连接无论是否同意都会发送不可靠传输不确定数据是否能收到面向数据报每次传输的基本单位是一个数据报由一系列的字节构成的特定结构全双工 2. UDP协议中socket api的使用 操作系统中有一类文件就叫做socket文件抽象表示了 网卡 这样的硬件设备。进行网络通信最核心的硬件设备网卡通过网卡发送数据就是写socket文件通过网卡接收数据就是读socket文件。 核心的类有两个 DatagramSocket DatagramSocket()创建一个UDP数据报套接字的Socket绑定到本机任意一个随机接口一般用于客户端。 DatagramSocket(port)创建一个UDP数据报套接字的Socket绑定本机指定的端口一般用于服务器。 void receive(DatagramPacket p) 从此套接字接收数据报如果没有接收数据报该方法会阻塞等待。 void send(DatagramPacket p) 从此套接字发送数据报不会阻塞等待直接发送。 DatagramPacket UDP面向数据报每次发送数据报的基本单位就是UDP数据报。表示了一个UDP数据报。 2.1 服务器 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.Socket; import java.net.SocketException; import java.nio.charset.StandardCharsets;public class UdpEchoServer {//创建DatagramSocket对象private DatagramSocket socket null;public UdpEchoServer(int port) throws SocketException { // 网络编程中常见的异常通常表示socket创建失败比如端口号已经被其他进程占用了就会失败socket new DatagramSocket(port);}// 服务器启动逻辑public void start() throws IOException {System.out.println(服务器启动!);// 对于服务器来说需要不停的收到请求返回响应while (true) {// 每次循环就是处理一个请求-响应过程// 1. 读取请求并解析DatagramPacket requestPacket new DatagramPacket(new byte[4096],4096);// 通过这个字节数组保存收到的消息正文应用层数据包也就是UDP数据报载荷部分// receive接收从网卡读取到一个UDP数据报放入requestPacket对象中socket.receive(requestPacket);// 读到的字节数组转成String方便后续逻辑处理String request new String(requestPacket.getData(),0,requestPacket.getLength());// 2. 根据请求计算响应对于 回显服务器来说这一步啥也不做String response process(request);// 3. 把响应返回到客户端// 构建一个DatagramPacket 作为响应对象// requestPacket.getSocketAddress() 从requestPacket客户端来的数据报获得INetAddress对象这个对象就包含了ip和端口号(和服务器通信对端)DatagramPacket responsePacket new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//打印日志System.out.printf([%s:%d] req: %s,resp: %s\n,requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer udpEchoServer new UdpEchoServer(9090);udpEchoServer.start();} }2.2 客户端 import java.io.IOException; import java.net.*; import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket null;private String serverIp;private int serverPort;// 此处的IP使用的字符串点分十进制”192.168.2.100“ 不能直接使用serverIp要InetAddress.getByName(serverIp)public UdpEchoClient(String serverIP,int serverPort) throws SocketException {this.serverIp serverIP;this.serverPort serverPort;// 客户端一般不要手动指定端口号系统会自动分配一个空闲的端口号socket new DatagramSocket();}public void start() throws IOException {System.out.println(启动客户端);Scanner scanner new Scanner(System.in);while (true) {System.out.print(- );// 1. 从控制台读取要发送的请求数据if (!scanner.hasNext()) {break;}String request scanner.next();// 2. 构造请求并发送 把string里面的内容作为请求DatagramPacket requestPacket new DatagramPacket(request.getBytes(),0,request.getBytes().length, InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);// 3 获取服务器响应DatagramPacket responsePacket new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);// 4. 把响应显示到控制台上String response new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client new UdpEchoClient(127.0.0.1,9090);client.start();} }2.3 整个流程 服务器启动启动之后立即进入while循环执行到receive进入阻塞等待客户端的请求客户端启动之后阻塞在hasNext等待用户在控制台输入用户在客户端输入之后客户端就拿到字符串构造出一个requestPacket请求send发送请求然后创建responsePacket来执行receive接收操作并且等待响应返回。服务器收到请求之后就会从receive的阻塞中返回之后就会根据读到的DatagramPacket对象构造String request通过process方法构造一个String response再根据response构建一个DatagramPacket表示响应对象再通过send来进行发送给客户端。这个过程中客户端在阻塞等待。客户端从receive中返回执行就能得到服务器返回的响应并且打印到控制台上与此同时服务器进入下一次循环也要进入到第二次的receive阻塞。等待下一个请求。 3. TCP协议中的api使用 ServerSocket这个socket类对应到网卡但是这个类只能给服务器进行使用Socket对应到网卡既可以给服务器使用也可以给客户端使用。 TCP是面向字节流的传输的基本单位是字节是有连接的通过accept来完成连接accept也是可能会产生阻塞的操作如果当前客户端还没有连接过来此时accept就会阻塞。 3.1 TCP服务器 // ServerSocket 这是Socket类对应到网卡但是这个类只能给服务器使用 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;public class TcpEchoServer {private ServerSocket serverSocket null;public TcpEchoServer(int port) throws IOException {serverSocket new ServerSocket(port);}public void start() throws IOException {System.out.println(服务器启动);while (true) {// 通过accept方法来”接听电话“然后才能进行Socket clientSocket serverSocket.accept();// 和客户端的交互processConnection(clientSocket);}}// 通过这个方法开处理一次连接连接建立的过程中就会涉及到多次的请求响应交互private void processConnection(Socket clientSocket) {System.out.printf([%s:%d] 客户端上线\n,clientSocket.getInetAddress(),clientSocket.getPort());// 循环的读取客户端的请求并返回响应// 从网卡读/写数据tcp是面向字节流和文件中的字节流完全一致try (InputStream inputStream clientSocket.getInputStream();OutputStream outputStream clientSocket.getOutputStream()) {while (true) {Scanner scanner new Scanner(inputStream);if (!scanner.hasNext()) {// 读取完毕客户端断开连接就会产生读取完毕System.out.printf([%s:%d] 客户端下线\n,clientSocket.getInetAddress(),clientSocket.getPort());break;}// 1. 读取请求并解析,这里注意隐的约定next读的时候要读到空白符才会结束// 因此就要求客户端发来的请求必须带有空白符结尾比如 \n 或空格String request scanner.next();// 2. 根据请求计算响应String response process(request);// 3. 把响应返回给客户端// 通过这种方式可以写回但是这种方式不方便给返回的响应添加 \n//outputStream.write(response.getBytes(),0,response.getBytes().length);// 也可以把outputStream 套上一层完成更方便的写入PrintWriter printWriter new PrintWriter(outputStream);printWriter.println(response);// PrintWriter 内置的缓冲区需要冲刷刷新// 冲刷缓冲区printWriter.flush();System.out.printf([%s:%d] req:%s,resp: %s\n,clientSocket.getInetAddress(),clientSocket.getPort(),request,response);}} catch (IOException e) {throw new RuntimeException(e);}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer new TcpEchoServer(9090);tcpEchoServer.start();} }3.2 TCP客户端 // Socket 对应到网卡既可以给服务器使用又可以给客户端使用 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;public class TcpEchoClient {private Socket socket null;public TcpEchoClient(String serverIP,int serverPort) throws IOException {// 此处可以把这里的ip和port直接传给socket对象// 由于tcp是有连接的因此socket里面就会保存好这俩信息因此此处TcpEchoClient类就不必保存socket new Socket(serverIP,serverPort);}public void start() {System.out.println(客户端启动\n);try (InputStream inputStream socket.getInputStream();OutputStream outputStream socket.getOutputStream()) {Scanner scannerConsole new Scanner(System.in);Scanner scannerNetwork new Scanner(inputStream);PrintWriter writer new PrintWriter(outputStream);while (true) {// 1. 从控制台读取输入的字符串System.out.print(- );if (!scannerConsole.hasNext()) {// 没有下一个break;}// 有下一个接着读取String request scannerConsole.next();// 2. 把请求发给服务器 使用println 来发送的请求末尾带有\n// 这里是和服务器的scanner.next 呼应的writer.println(request);// 通过flush 主动刷新缓冲区确保数据真的发出去了writer.flush();// 3.从服务器读取响应String response scannerNetwork.next();// 4. 把响应显示出来System.out.println(response);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpEchoClient client new TcpEchoClient(127.0.0.1,9090);client.start();} }3.3 整个流程 服务器启动阻塞在accept等待客户端连接客户端启动new Socket(ServerIP,ServerPort)操作会触发和服务器之间的建立连接的操作此时服务器就会从accept中返回服务器从accept返回进入到processConnection方法执行到hasNext这里产生阻塞此时虽然连接建立了但是客户端还没有发送任何的请求hasNext阻塞等待请求到达。客户端继续执行到hasNext等待用户向控制台写入内容。用户输入之后此时hasNext就返回了继续执行这里的发送请求的逻辑这里就会把请求真的发出去同时客户端等待服务器的响应返回next也会产生阻塞。服务器从hasNext返回读取到请求内容进行处理读取到请求构造出响应把响应写回到客户端。服务器结束这次循环继续阻塞在hasNext等待下一个请求。客户端读取响应并且显示出来。结束这次循环进行下一次循环继续阻塞在hasNext等待用户输入第二个数据。
http://www.pierceye.com/news/812849/

相关文章:

  • 瑶海区网站建设公司中铁建设集团有限公司基础设施事业部
  • wordpress 用js网站备案 seo
  • 网站一级域名和二级域名区别自己怎么做外贸英文网站
  • 南京网站定制南京wordpress安装提示500错误
  • 网站图片优化免费网站建设凡科
  • 网站开发项目团队网页设计图片与文字的研究
  • 百度网站建设策划书范文做暧在线网站
  • 松江新城做网站公司国产成年做视频网站
  • 杭州网站推广服务网站单页面怎么做
  • 房地产网站建设案例wordpress 判断移动端
  • 网站开发过程文档网站代码需要注意什么问题
  • 怎么选一个适合自己的网站wordpress怎么修改后台登录地址
  • 网页制作与网站建设自考西安千秋网络科技有限公司
  • 建设网站的费用入什么科目永久免费google搜索引擎
  • 拍卖网站怎么做梧州网页设计师招聘
  • 炫酷网站源码下载网站建设副业
  • 做dw和ps的网站教学做网站属于什么费用
  • 秦皇岛网站制作小程序开发wordpress调用分类标签
  • 网站绑定别名好吗台州品牌网站设计
  • 安徽省住房和城乡建设厅网站域名东莞松山湖华为小镇
  • 购物网站开发教程中文版做一个自己的免费网站吗
  • 网站建设网络推广平台湖北省级建设主管部门网站
  • 手机网站建设口碑好google海外版
  • 网站加视频播放设计怎么做的oa系统管理平台
  • 湛江有网站的公司名称秘密入口3秒自动进入
  • 网站建设需要租用什么北京网站设计制作过程
  • 设计高端网站建设电子商务平台的建设步骤
  • 对外网站ipv6建设方案模板网站提交地址
  • 网站优化包括哪些内容哪一个网站做专栏作家好点
  • 网站外包 博客网络广告的优势有哪些