APP下载

关于Socket 的编程研究

2021-03-05徐洪丽杨传栋王秀丽

科技创新导报 2021年27期
关键词:端口号应用层服务器端

徐洪丽 杨传栋 王秀丽

摘 要:Socket是网络通信中的常用技术,有着广泛的应用前景和意义。本文首先给出了Socket含义,然后关注了Socket通信过程中的注意事项,Socket常用方法及多线程Socket通讯,最后研究了套接字心跳机制,设计思路及其注意事项,Socket长连接及其常用步骤,为套接字的应用提供了理论和实践支持。

关键字:Socket通信  多线程Socket  心跳机制  长连接

中文分类号:TP39文献标识码: A           文章编号

Research on Socket Programming

XU Hongli 1  YANG Chuandong 1   WANG Xiuli

(1. College of Information Science and Engineering, Shandong Agricultural University, Taian, Shandong Province, 271018China)

Abstract: Socket is a common technology in network communication and has a wide prospect and significance in application. This paper first introduces the meaning of Socket, then pays attention to the precautions in the process of Socket communication, common Socket methods and multi-threaded Socket communication, and finally studies the Socket heartbeat mechanism, design ideas and precautions, Socket long connection and common steps, which provides theoretical and practical support for the application of Socket.

Key Words: Socket communication; MultithreadingSocket; Heartbeat mechanism; Long connection

1 什么是socket

Socket直译为“插座,灯座”,又称为“套接字”或“套接口”,最早由加州大学伯克利分校为UNIX系统开发出来,目前是互联网连接的标准接口[1]。它是网络通信中应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。网络中,两个进程通过一个双向的通信连接实现数据交换,这个双向连接的一端称为一个socket。socket遵循着“打开—读/写—关闭”模式,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。Os会分配一个独一无二的号给每个本地Socket,一个完整的Socket需要给出以下几个方面的信息:协议、本地地址和远程地址、本地端口和远程端口。

目前,套接字分为SOCK_STREAM、SOCK_DGRAM及SOCK-ORIGINAL。需要注意的是在网络通信中,两个需要通讯的进程最基本的一个前提是能够唯一的标志进程,在本地进程通讯中使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大。需要其他的辅助标注信息。由于网络中IP层的IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,因此利用“IP地址+协议+端口号”能够唯一标示网络中的一个进程。另外,还提供心跳机制来判断网络连接是否类实时有效。能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了,常用的有多线程Socket通讯和心跳机制。

2 Socket常用方法和多线程Socket编程

2.1 Socket 常用方法:

在.net中与socket编程有关的命名空间有System::Net,她为当前网络中使用的多种协议提供了簡单的变成接口。System::Net:Sockets命名空间提供了需要严格掌控网络通信的编程接口。常用的相关类:IPAddress类:包含一个IP地址。IPEndPoint类:包含了一对IP地址和端口号。常用方法:Socket()方法创建一个Socket。Bind():绑定一个本地的IP和端口号。Listen():让Socket侦听传入的连接尝试。Connect()初始化与另一个Socket的连接。Accept():接收连接并返回一个新的Socket。Send():输出数据到Socket。Receive():从Socket中读取数据。Close():关闭Socket,销毁连接。

2.1多线程socket编程

对于同一个程序,它又可以分成若干个独立的执行流,即线程,线程提供了多任务处理的能力。利用多线程Socket编程可以在局域网内实现多个IP的信息通信[2]。此时,服务器端接收所有局域网内客户端发来的信息,并将此信息转发给其他所有的客户端。采用多线程实现局域网内每个在线客户端的信息监听。客户端接收服务器发来的信息,或发送信息给服务器,再有服务器转发给其他在线客户端。具体实现时,多线程socket常使用createthread创建n个线程,然后每个线程体创建使用单独的socket。关于多线程编程,涉及的内容很多,如线程间的通讯、线程间的同步等,注意事项如下。(1)与N个客户端相连的话;服务器都有一个对应的socket;也就是N个。(2)TCP的C/S应用中,server端程序要先于client端程序执行,原因是客户端要连接服务器之前需要获得服务器的IP地址和端口号,这两个信息是出于监听状态的,如果服务器不先启动,也不可能绑定这个端口号,因此客户端根本连接不上。(3)各个线程可以访问进程中的公共变量,需要做数据保护,以免损坏数据。保证各个线程在一起适当协调工作称为线程之间的同步。即要处理数据的并发控制和同步问题[3]。Visual C++提供多线程同步类:同步对象(CsyncObject、Csemaphore、Cmutex、CcriticalSection和Cevent)和同步访问对象(CmultiLock和CsingleLock),保证程序运行安全性和数据有效性。

3 套接字心跳机制和长连接

3.1 心跳机制设计思路

网络通信,当客户端连接服务器,服务器会維持一个跟客户端相关的Socket。心跳包是为了服务器和客户端获知对方是否处于在线状态的数据包,一般按照设定的时间间隔发送,像心跳,因此称为心跳包[4]。为节省服务器端资源,客户端停止程序之前,会发“停止”通知到服务器端,以便释放相应内存资源。但由于网络环境的复杂,会出现客户端已中断,服务器端还未获知的情况,如病毒、防火墙、未知的网络故障等,因此采用心跳机制判断服务器和客户端否掉线,之所以不直接判断Socket内容,是因为网络上有很多缓存设备,缓存的时间不等(从几秒到几分钟不等),不易直接采用[5]。

需要注意的是,TCP协议中的SO_KEEPALIVE选项,可以设置心跳频率,默认为2h,如果通过此选项更改心跳频率,则约束所有的网络通信。因此,通常在应用层项目的应用程序中编写“心跳包”来完成此功能,设计思想如下。(1)客户端每隔一定时间间隔(如30s)发送心跳包给服务器端,并累加计数1次,服务器收到心跳包后把信息返回给客户端。(2)若服务器将心跳信息正常发回,则客户端计数清零。(3)发生网络不畅时,要么规定时间内(如30s)客户端收不到服务器端发回的消息,则客户端关闭相应的连接;要么服务器端检查所有的连接商定时间内是否收到心跳包,若无则说明客户端出现问题,关闭相应的socket。(4)如必要,可以自定义structure为心跳包或心跳帧,使对方获悉本方的online状态,以延续连接的有效性。其内容有些无关紧要,可以很小,甚至可以是一个空包,仅仅包含包头部分。

3.2Socket长连接

Socket长连接建立在心跳机制之上,即建立长连接一般需要设置心跳机制做其Prepare工作,长连接的保活(KeepAlive)性需要应用层的心跳机制的保证[6]。长连接是相对短连而言,根据通信时发送的数据包多少和连接保持的在线长短及连接数等确定。一般用于操作多,保持在线时间长的情况。比如数据库的连接一般使用长连接更高效,因为每次TCP的连接都需要按照流程中的三步走执行,对数据库进行频繁的连接会降低效率并增加网络通信的占用时间,浪费通信资源的同时大大拉低数据库的工作速度,数据库连接一般是长连接,第一个数据包传送后,连接不断开,接着进行后续包的传递。

TCP连接保持期间,需要注意无内容传送时,为延续此连接,两方需要有检测包(心跳包)的通信。即通常情况下长连接的步骤为“connection→data transmission→keep connection(Transmit heartbeat package)→data transmission→keep connection(transmit heartbeat package)→……→shutdown the connection”。心跳机制与服务器和客户端是同步还是异步的收发方式无关,即无论是双方同步通信还是异步通信,上述长连接和心跳包处理策略都适应。

3.3 WebSocket技术

网络技术的飞速发展,对实时通信的需求越来越高,WebSocket技术应运而生[7]。与Socket不同,它处于应用层,从根上来说是基于TCP协议的,从这点上与HTTP相同,是对TCP协议的封装。WebSocket依赖于HTTP协议首次握手,成功后,数据从TCP通道进行全双工通信传送,即服务器端能够主动推送数据到客户端,简化了通信过程,握手成功后就不再依赖于HTTP。与Socket相比,WebSocket在具体使用中更加便捷、易用,因为它是完整的处于应用层的协议,带有保准的API部分,而Socket是应用从和TCP/IP协议的中间接口,从而屏蔽TCP/IP协议的复杂性,灵活性上,Socket优于WebSocket,但严格意义上,Socket不是协议,是应用层与TCP/IP的中间层软件抽象。它易于按照既定协议组织数据。

4 总结

Socket只是对TCP/IP协议栈操作的抽象,实际应用中,套接字在网络通信中占有重要的地位,在网络应用方面有着广泛的应用前景和意义。本文研究了几种不同的Socket理论和编程,包括多线程Socket通信、套接字心跳机制、Socket长连接、WebSocket等,并给出了Socket编程过程中的注意事项,特别是心跳机制和Socket长连接的设计思想和实践中的注意问题,从而为套接字的应用提供技术支持。

参考文献

[1] 孙龙,温建新,马凯.基于海洋网络信息体系的自适应接口技术[J]中国电子科学研究院学报.2021,16(9):7-39

[2]李浩浩.基于深度学习的可回收垃圾视觉分拣系统[D].西安:西安理工大学,2021

[3] 王宏旭,吴小欣,黄杰.SOCKET编程实现局域网计算机监控管理分析[J].计算机光盘软件与应用,2012(8):206-20

[4] Amit Arvind Agrawal. Fate of root shell after pontic/socket shield techniques,is it better to extract the whole tooth?[J] World Journal of Meta-Analysis.2021,9(4):333-341

[5]苏俊维.OpenWrt智能路由器在中小型规模智慧农业中的应用[J].科学技术创新,2021(11):96-97

[6] 胡长鹏,马海霞,林思敏,等.一种基于WiFi无线通讯的智能插座设计与实现[J].机电工程技术,2021,50(8):70-73

[7]梁静.微服务框架下敏感信息的交叉跨域安全通信技术研究[D].成都:四川师范大学,2020

2747501186386

猜你喜欢

端口号应用层服务器端
Linux环境下基于Socket的数据传输软件设计
在Docker容器中安装应用程序
浅析异步通信层的架构在ASP.NET 程序中的应用
浅谈以java为基础的Socket通信简介及实现
基于分级保护的OA系统应用层访问控制研究
基于Qt的安全即时通讯软件服务器端设计
新一代双向互动电力线通信技术的应用层协议研究
物联网技术在信息机房制冷系统中的应用
Winsock编程在《计算机网络基础》教学中的应用
基于Android系统的互动展示APP的研究与设计