网络编程原理:回显服务器与客户端通讯交互功能

打印 上一主题 下一主题

主题 759|帖子 759|积分 2277

路由器及网络概念

   网络发展是由单机时代->局域网时代->广域网时代->移动互联网时代
局域网:通过路由器的LAN为前言来链接差别电脑,使其举行互相通讯,而路由器通常为5个网口,1个WAN(用来连接上级的路由器)4个LAN。
当局域网连接的更多时,网络也会覆盖的更大。

  交换机概念
   交换机是因为路由器的LAN口过少,而必要连接到路由器的节点过多,这时候交换机的WAN通过连接路由器的LAN口,然后通过交换机的LAN口来连接其他的路由器的WAN或者电脑,来实现层层连接,构成更复杂的网络结构。
    而广域网是通过更多的局域网的来连接到一起,构成的更加庞大的网络结构,覆盖一个城市或者更大。
  
网络通讯基础

IP地点
   形貌一个设备,在网络中的地点,盘算机中利用32位的字节数字来表示地点。
点分十进制
盘算机地点由32位字节数构成,但是32位的byte字节过长,一样平常会表示为4个0~255之间的十进制数字,每个数字之间通过点举行分隔。

  
端标语
   端标语:区分一个主机中差别的应用程序。
端标语是一个整数0~65535(2个字节)差别的程序可以关联/绑定雷同的端标语,但是同一个主机上的应用程序,不能关联同一个端标语(一个端标语只能被一个程序绑定,而一个程序可以绑定多个端口)。
在现实的通讯过程中,IP和端口是相互绑定的。
  
协议
   在网络中,本质是通过光/电信号来传输数据,通过低电平表示1,高电平表示0 ,高频光信号表示1 ,低频光信号表示0。
协议就是通过一种约定,来约定通讯的两边以同样的方式举行传输数据。
  
  网络五元组
   源IP 、源端口、目标IP、目标端口 、协议的范例,是在通讯过程中必不可少的信息。
  
协议分层
   通过对协议的定位或者是作用举行分类,将定位/作用相似放到同一层,然后通过上层协议调用下层协议,下层协议给上层协议提供支持。
通过协议分层不但可以或许让多个层级直接交互配合,还可以对上层和下层相互之间举行封装,利用上层协议,不必关注上层,利用下层协议不必关注下层。
  
TCP/IP 五层协议

物理层:形貌网络通讯的硬件设备
数据链路层:两个相邻节点之间的数据传输环境
网络层:举行路径规划,规划出最合适的路径
传输层:关注起点和止境
应用层:应用程序如何利用数据


封装和分用

封装

   分装和分用形貌了在网络通讯中,基本的数据传输流程
1.应用层
开发者自定义通过设计数据报的格式,当用户通过输入举行传输,给打包成一个数据报来举行封装。
例如:当用户通过信息输入发送给另一个用户。
应用层协议(数据报格式):用户A(源头) 、 用户B(目标地)、时间 、发送的内容"hello"
转换为数据报:15239(源头)、 32643(目标地) 、2024-12-27 、hello

  
当应用层的数据报打包好后,可以通过调用下层协议,调用系统的API将数据传给数据层。
2.传输层
   当到达传输层后,继续对应用层传输的数据举行打包,“拼接”。
在应用层的基础上举行拼接传输层的报头
UDP报头的关键信息:源端口和目标端口

  
网络层
   网络层最主要的协议:IP协议,在原有的传输层的基础上举行拼接打包。
IP报头中包罗的最重要的熟悉:源IP和目标IP

  
数据链路层
   以太网:传输给数据链路层之后,通过以太网再次举行打包,通过拼接以太网报头来打包。
以太网包罗的最重要信息:源mac地点和目标mac地点(形貌一个设备在网络中的地点)
  

以下每一都是通过报头和载荷的形式举行封装,数据链路层通过报头和报尾来举行打包。每一次的传输都被封装成为一个载荷


物理层
   当传输到物理层后,将这些打包好的数据转换成2克制的0 1序列,通过光信号/电信号举行传输。
  
分用

   当数据在传输给目标地(用户B)的时候,会经历一系列的交换机和路由器的转发。
当我们的的数据通过一系列步调到达用户B后,这时候就必要举行分用解析这个包。
当吸收时通过由物理层到应用层的步调层层解析。
  1.物理层
   拿到光电信号后转换成二进制的数据,得到以太网的数据报。
  2.数据链路层
   通过以太网协议对物理层传输过来的数据报举行解析,得到报头和报尾和中心的载荷。
  3.网络层
   通过IP协议对数据对数据链路层传输过来的数据报举行解析,去掉IP报头得到载荷。
  4.传输层
   通过UDP协议,针对网络层传输的数据报举行解析,拿到载荷,去掉UDP报头,得到载荷。
  5.应用层
   根据端标语来负责将数据交给指定的应用程序,然后根据开发者自定义的应用层协议举行解析并显示。
  
网络编程(网络协议)

   在盘算机中,通过网络,可以让两个主机之间相互通讯,在实现相互通讯的过程时,必要我们开发者通过应用程序(应用层)通过系统的API与传输层举行交互。
Socket API这套协议,可以完成差别主机之间,差别系统之间的通讯。
    在传输层中,提供的网络协议主要由两个,UDP和TCP
  UDP和TCP的区别
   1.TCP可以举行连接,UPD不可以连接。
在盘算机中,通过与两边创建连接,各自保存两边的信息。
如果TCP必要通讯,必要创建连接,保存对方信息,才可以举行
UDP无需创建连接,就可以通讯(固然不必要创建连接,但是必要开发者通过socket API来举行对方信息作为参数举行传输)
    2.TCP时可靠传输的,UDP时不可依靠传输的
网络通讯中,A与B发送消息,消息有可能无法举行传输(传输的概率无法达成100%),可能存在物理干扰。
而可靠传输是当A与B发送消息时,如果发送失败,则必要接纳一定的调停步伐(重写发送等),这个可靠传输也无法保证肯定传达成功,只是尽力调停。
当举行可靠传输时,则肯定要付出一定的代价,这样的机制会复杂且传输的服从也会大大降低。
    3.TCP是面向字节省的,UDP时面向数据报的
TCP通过以字节为单位举行传输,UDP以数据报为单位举行传输。
    4.TCP和UDP都是全双工的
一个信道中,答应双向通讯的,就是全双工。
一个信道中,只能单向通讯的,就是半双工。
  UDP类 API利用

DatagramSocket类
   Socket是操作系统中的概念,是系统抽象出来的”文件“,本质Socket是属于网卡
当Socket在写数据时,相称于网卡在发送数据。
当Socket在读数据时,相称于网卡吸收数据。
  DatagramPacket类
   通过此类,表示一个UDP的数据报(UDP面向的是数据报)
每次传输以UDP数据报为基本单位。
  
实现回显通讯程序

   编写服务器和客户端的代码通过回显显示在屏幕上
上述内容形貌Socket本质是一个网卡,服务器则必要网卡中指定一个端口,但是客户端无须指定端口通过系统直接分配端口,防止程序端口辩论
  回显服务器代码

  1. package UDPECHO;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.SocketException;
  6. public class UdpEchoServer {
  7.     private DatagramSocket socket=null;//设置socket网卡
  8.     public UdpEchoServer(int port) throws SocketException {
  9.         socket=new DatagramSocket(port);//这里服务器需要指定端口
  10.     }
  11.     public void start() throws IOException {
  12.         System.out.println("Server is Running");
  13.         //这里receive接收客户端的请求,需要准备一个字节数组进行接收
  14.         //这里的while循环只要不倒闭,服务器一直在循环状态
  15.       while(true){
  16.           DatagramPacket requestPacket=new DatagramPacket(new byte[5080],5080);
  17.           socket.receive(requestPacket);
  18.           //这里接收到请求将请求转换为String类型的字符串
  19.           //这里的参数第一个是以字符串形式来获取字节数组,第二个参数表示下标,第三个表示最终的长度
  20.           String request=new String(requestPacket.getData(),0,requestPacket.getLength());
  21.           //对获取到的请求进行响应
  22.           String response=process(request);
  23.           //这里回应后开始准备继续返回给客户端影响的结果
  24.           //这里的参数,第一个将响应继续转换为字节
  25.           //参数2,因为是字符,所以需要转换为字节后在获取长度,如果是UTF-8的汉字则为三个字节
  26.           //参数3,是传送给客户的地址,系统随机推送的地址
  27.           DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
  28.           socket.send(responsePacket);//socket里面的参数就是响应的结果,需要使用一个Packet参数
  29.           //服务器打印的内容
  30.           System.out.printf("[%s:%d] request:%s response:%s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);
  31.       }
  32.     }
  33.     private String process(String request) {
  34.         //返回响应,我们在程序中大部分都在维护响应中的代码,这里是回显,我们请求是什么响应就是什么
  35.     return  request;
  36.     }
  37.     public static void main(String[] args) throws IOException {
  38.         UdpEchoServer server=new UdpEchoServer(8070);
  39.         server.start();
  40.     }
  41. }
复制代码

回显客户端代码

  1. package UDPECHO;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. import java.net.SocketException;
  7. import java.util.Scanner;
  8. public class UdpEchoClient {
  9.     private DatagramSocket socket=null;
  10.     private String serverIp=" ";
  11.     private int serverPort=0;
  12.     public  UdpEchoClient(String ip,int port) throws SocketException {
  13.         socket=new DatagramSocket();//默认随机指定端口
  14.         serverIp=ip;
  15.         serverPort=port;
  16.     }
  17.     public void start() throws IOException {
  18.         System.out.println("Client is Running");
  19. //            输入的内容
  20.         Scanner scanner=new Scanner(System.in);
  21.         while(true){
  22.             System.out.println("Please enter:>");
  23.             String request=scanner.next();//输入的内容
  24.             //这里发送给服务器数据然后服务器进行接收
  25.             //这里指定的是请求的内容长度,还有传送给服务器的IP地址和端口
  26.             DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIp),serverPort);
  27.             socket.send(requestPacket);
  28.             //客户端阻塞等待服务器传回来的数据,当服务器进行一系列操作后进行返回,接收服务器返回的
  29.             DatagramPacket responsePacket=new DatagramPacket(new byte[5080],5080);//申请一个字节数组进行接收
  30.             socket.receive(responsePacket);
  31.             //最后将字节数组转换成字符串
  32.             String response=new String(responsePacket.getData(),0,responsePacket.getLength());
  33.             //打印显示到屏幕中
  34.             System.out.println(response);
  35.         }
  36.     }
  37.     public static void main(String[] args) throws IOException {
  38.     UdpEchoClient client=new UdpEchoClient("127.0.0.1",8070);
  39.     client.start();
  40.     }
  41. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表