文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 一、如何在庞大的计算机网络中如何精准的定位通信双方以及如何确定通信所使用的应用进程
- 二、通信协议规范以及基于协议实现网络编程
- 1.网络编程是基于哪些协议实现的,以及这些协议制定了哪些网络通信规范
- 2.Java是如何基于通信协议实现网络编程的
- 总结
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、如何实现精准定位?近代计算机网络通信模型自定向下分别为应用层,传输层,网络层,数据链路层以及物理层
而"Everything over ip"则说明IP地址可以唯一定位一台主机在计算机网络中的位置,浅析一下网络通信过程
通信数据在经过应用层,传输层两层封装后通过接口向下交付至网络层,网络层将其再次封装为ip数据报,在向下移交;ip数据报中携带的ip地址便可以唯一确定通信双方的主机,至此已经确定了源/目标主机,除ip地址外,ip数据报中还携带着源/目标端口号
什么是端口号?
如果说ip地址是计算机网络中每台主机的身份证,那么端口号便是部署在网络层之上所有应用进程以及系统进程的身份证,每个应用进程以及系统进程都有自己的端口号,并且这个端口号是唯一的,端口号从1-65535标识了所有已部署的进程。
通过ip地址+端口号便完成了'精准定位',即通过IP地址确定通信双方主机,通过端口号具体确定了部署在主机上的所使用的通信进程,至此精准定位就完成了。
二、使用步骤 1.通信协议与协议规范传输层两大通信协议——TCP与UDP协议
(1)TCP协议也称为面向连接协议,部署在传输层上为网络通信提供安全可靠的服务,这是相对于UDP协议而言的;安全可靠指的是TCP协议为通信提供差错检测,出错重传机制,这在很大程度上提高了通信的可靠性和数据传输的安全性,而RDT(可靠数据传输协议)为TCP协议提供的安全可靠服务提供了保证。
众所周知,应用进程之间的通信需要借助服务器才能够完成,即应用进程即客户端通过服务器的接收转发功能完成不同客户端之间的通信,而TCP协议对C/S通信模式做了一定的规范。
以"三次握手四次挥手为例"该过程如图
该过程为三次挥手,该过程即为TCP协议下客户端与服务器建立连接的过程,可将该过程简述为:
服务器率先开启,等待着来自客户端的连接建立请求,客户端向服务器发送连接建立请求,服务器在接收到客户端的连接建立请求后,对该连接建立请求进行确认,即同意与客户端建立连接,客户端在接收到服务器的连接建立确认后,即客户端收到的回复中ACK=1,ACK有两种状态,1代表服务器同意该请求,客户端对服务器的确认进行再次确认,即告诉服务器接收到服务器的连接建立确认信息,该过程结束后,客户端与服务器便可以进行数据传输,资源共享。
上图所示为四次挥手过程,该图简单描述了客户端与服务器拆除连接的过程
当客户端要求主动关闭连接时,与三次挥手过程类似,客户端同样需要主动向服务器发送连接拆除请求,服务器在接收到来自客户端的连接拆除请求后,对该请求进行确认,确认完成后同时告知客户端即将释放资源,在收到客户端对资源释放的确认后,服务器关闭与客户端的资源传输通道,同时拆除连接。
从三次挥手四次挥手过程可以看出客户端与服务器通信过程中双方需要反复对传输的数据报文进行确认,以便在文件传输发生差错时及时检测到传输错误并进行重传,但双方在通信需要建立连接,每次通信结束后需要拆除连接,该过程在提高通信可靠性与安全性的同时也降低了传输效率,以牺牲通信效率换取了通信可靠性与安全性,TCP协议常服务于对安全可靠性要求较高的应用程序,如文件传输等应用程序。
(2)UDP协议也称无连接协议,与TCP协议相比,UDP协议下的通信过程要简单许多,使用UDP协议进行通信时不需要连接建立与连接拆除过程,在确定了目标主机ip地址与端口号之后,只需要将报文交付出去,UDP协议不提供检错,重传等机制,因此UDP协议提供的服务是无连接的,同时也是不可靠,不安全的服务,将源/目标以及数据封装在数据包中直接进行发送,因此无法检测到在传输过程是否出现错误,但由于UDP协议提供的是无连接的服务,所以比起TCP协议,UDP协议提供的服务是实时性强,高效的服务,以牺牲通信可靠性提高通信效率,因此UDP协议常服务于对通信效率要求较高的实时性事务,例如流媒体服务。
2.Java实现网络编程
网络编程需要借助Socket来实现,Socket也被称为套接字,因此网络通信实质上就是不同Socket之间的通信,我们可以将连接两个Socket的网络当做流,数据通过两个Socket之间的流进行IO传递
TCP协议下的网络编程的通信方式依然遵循C/S通信模式,在该模式下用ServerSocket套接字代表服务器,而用Socket套接字代表客户端。
客户端即Socket的工作可分为如下四个四个步骤:
(1)创建Socket对象,在创建该对象时有两个参数是必不可缺的,第一个参数为local host,该参数代表为建立连接的目标ip,第二个参数是port,端口号,该参数标识了通信双方所使用的应用进程。
需要注意的是,Socket对象一经创建,便会尝试与ServerSocket端建立连接,此时应确保服务器端套接字处于开启状态!
(2)开启已经连接到的Socket的输入与输出流,即getInputStream()与getOutputStream(),这两种方法可分别返回连接到的Socket的字节输入/输出流,为数据的IO传输提供打开流通道
(3)对Socket进行IO操作,即借助输入流读取服务器端发送至管道中的数据信息,以及通过输出流将要传输给服务器的数据信息写入管道中进行传输。
(4)在双方通信结束后关闭Socket,关闭Socket之后相应的输入输出流都会关闭,这一步至关重要,如果没有及时关闭Socket通道将导致该线路一直出于被占用状态,极大地浪费了资源同时将导致部分正常操作无法使用
代码如下(示例):
//寻找服务器对象
Socket socket=new Socket("192.168.31.12",9999);
//获取输出流
OutputStream ops=socket.getOutputStream();
//输入消息向服务器发送
Scanner sc=new Scanner(System.in);
System.out.println("你想对服务器说什么?");
String info=sc.next();
ops.write(info.getBytes(StandardCharsets.UTF_8));
socket.close();
上述代码初步完成了与服务器建立连接,并通过IO管道进行通信,在通信结束后关闭Socket这一完整通信过程。
服务器端即ServerSocket的工作过程与客户端类似可分为一下几个步骤
(1)创建ServerSocket对象,该对象只有一个参数port,该参数代表服务器所在进程的端口号,在指定端口号后ServerSocket会向操作系统申请使用该端口号,如果该端口号上没有正在运行的进程,ServerSocket即可暂时使用该端口号,即服务器端套接字创建成功.
(2)调用accept()方法接收来自客户端的连接,注意该accept()会阻塞当前线程,即一旦调用该方法后,一直到有客户端与服务器建立连接,该方法才会执行结束,该方法会返回一个Socket对象,该Socket对象代表与服务器建立连接的客户端.
(3)通过接收到的Socket开启输入输出流,即getInputStream与getOutputStream.
(4)通过流管道对Socket对象进行读写操作,从管道中读取来自客户端传输的数据,或将数据写入管道流中传输至客户端.
(5)在双方完成通信后关闭服务器端,此时调用close().
ServerSocket serverSocket=new ServerSocket(10033);
System.out.println("等待客户端连接");
//创建监听,等待客户端连接
Socket socket=serverSocket.accept();
System.out.println("客户端连接成功");
//创建输入流对象读取客户端发来的信息
InputStream in=socket.getInputStream();
//读取信息
byte[] bytes=new byte[30];
int size=in.read(bytes);
String info=new String(bytes,0,size,"utf-8");
System.out.println("来自客户端的消息:");
System.out.println(info);
上述一段代码即可初步完成开启服务器与客户端建立连接并通过管道流与客户端完成数据传输到关闭服务器这一完整过程。
总结
Java实现网络编程完全基于通信协议并符合协议规范,本文简要展示了两大网络通信协议工作机制以及通信协议规范,在代码部分简单提及基于基于TCP协议C/S模式下客户端与服务器通信的代码实现大体步骤,需要注意的是进行在创建客户端服务器套接字时需要保证端口号一致,同时需保证使用相同编码集进行接收与解析,否则可能接收到的信息可能会乱码,同时需要注意必须在已经开启服务器的情况下开启客户单连接服务器.



