工业互联网@程序员的术与道:术——编程基本功之网络编程( 二 )


与TCP服务器相比 , 少了 listen 和 accept 两个过程 , 即建立连接的两个步骤 。

  • UDP client
a.创建套接字 (socket)
b.数据通讯 (读recvfrom / 写sendto)
四、java网络编程Java的网络编程主要涉及到的内容是Socket编程 , 那么什么是Socket呢?简单地说 , Socket , 套接字 , 就是两台主机之间逻辑连接的端点 。 TPC/IP协议是传输层协议 , 主要解决数据如何在网络中传输 , 而HTTP是应用层协议 , 主要解决如何包装数据 。 Socket , 本质上就是一组接口 , 是对TCP/IP协议的封装和应用(程序员层面上) 。
Socket编程主要涉及到客户端和服务器端两个方面 , 首先是在服务器端创建一个服务器套接字(ServerSocket) , 并把它附加到一个端口上 , 服务器从这个端口监听连接 。 端口号的范围是0到65536 , 但是0到1024是为特权服务保留的端口号 , 我们可以选择任意一个当前没有被其他进程使用的端口 。
客户端请求与服务器进行连接的时候 , 根据服务器的域名或者IP地址 , 加上端口号 , 打开一个套接字 。 当服务器接受连接后 , 服务器和客户端之间的通信就像输入输出流一样进行操作 。
4.1.1 创建连接Java为TCP协议提供了两个类:Socket类和ServerSocket类 。
一个Socket实例代表了TCP连接的一个客户端 , 而一个ServerSocket实例代表了TCP连接的一个服务器端 , 一般在TCP Socket编程中 , 客户端有多个 , 而服务器端只有一个 , 客户端TCP向服务器端TCP发送链接请求 , 服务器端的ServerSocket实例则监听来自客户端的TCP连接请求 , 并为每个请求创建新的Socket实例 , 由于服务端在调用accept()等待客户端的连接请求时会阻塞 , 直到收到客户端发送的连接请求才会继续往下执行代码 , 因此要为每个Socket连接开启一个线程 。
服务器端要同时处理ServerSocket实例和Socket实例 , 而客户端只需要使用Socket实例 。 另外 , 每个Socket实例会关联一个InputStream和OutputStream对象 , 我们通过将字节写入套接字的OutputStream来发送数据 , 并通过从InputStream来接收数据 。
4.1.2 使用ServerSocket创建TCP服务器
Java中能接收其他通信实体连接请求的类是ServerSocket , ServerSocket对象用于监听来自客户端Socket连接 , 如果没有连接 , 它将一直处于等待状态 。
ServerSocket包含一个监听来自客户端连接请求的方法 。
  • Socket accpet()
如果接收到一个客户端Socket的连接请求 , 该方法将返回一个与客户端Socket对应的Socket;否则该方法将一直处于等待状态 , 线程也被阻塞 。
  • ServerSocket(int port)
用指定的端口port来创建一个ServerSocket 。 该端口应该有一个有效的端口整数值 , 即0~65535 。
  • ServerSocket(int port int backlog)
增加一个用来改变连接队列长度的参数backlog 。
  • ServerSocket(int port int backlog IntetAddress localAddr)
在机器存在多个IP地址的情况下 , 允许通过localAddr参数来指定将ServerSocket绑定到指定的IP地址 。
服务端的工作是建立一个通信终端 , 并被动地等待客户端的连接 。 典型的TCP服务端执行如下两步操作:
1.创建一个ServerSocket实例并指定本地端口 , 用来监听客户端在该端口发送的TCP连接请求
2.重复执行
1)调用ServerSocket的accept()方法以获取客户端连接 , 并通过其返回值创建一个Socket实例;
2)为返回的Socket实例开启新的线程 , 并使用返回的Socket实例的I/O流与客户端通信;