TCP/IP计算机与网络设备如果两个恋人想要谈恋爱,想要互相交流,那么双方都必须要有规则。基于同样的方法,不同硬件和操作系统之间的通信需要一个规则。我们称此规则为协议。TCP/IP是与Internet相关的各种协议族的总称。TCP/IP是指TCP和IP这两种协议。TCP/IP是IP协议通信过程中使用的协议族的总称。TCP/IP协议族按层次分为应用层、传输层、网络层、数据链路层和物理层。根据型号不同可分为4层或7层。将TCP/IP分为5层,层数越低,离硬件越近。应用层:应用程序从传输层接收到数据后,下一步就是对其进行解释。解释首先要规定格式,应用层规定应用程序的数据格式。主要的协议有HTTP等。传输层:该层为两台主机上的应用程序提供端到端的通信。传输层有两种传输协议,TCP(传输控制协议)和UDP(用户数据报协议)。TCP是一种可靠的面向连接的协议,UDP是一种不可靠或无连接的协议。网络层:决定如何将数据从发送方移动到接收方,并建立主机到主机的通信。数据链路层:控制网络层和物理层之间的通信,其主要作用是保证数据在物理线路上的可靠传输。物理层:这一层负责物理传输,与链路有关,也与传输介质有关。客户端和服务端的具体HTTP图片来自书《图解HTTP》三次握手,四次挥手TCP三次握手,四次握手,润森不知道说什么,所以我把下面是网上最火的一张图,不然别看我很牛逼,牛逼的是做图的大佬。三次握手四次挥手图片来自公众号(程序员小希),更多的名词和概念可以参考公众号程序员小希的文章~[1]Socket网络编程有一个重要的概念socket(Sockets)应用程序可以通过它发送或接收数据,套接字允许应用程序将I/O插入网络并与网络上的其他应用程序进行通信。来窥探Python中的网络通信Socket,无意中偷窥了一张很不错的Socket图片。整理以上图片。Step1.建立连接:Server:socket--->address--->bind--->listen--->acceptclient:socket--->connect2。通信:接收和发送:recv(1024)<---send(byte)/sendall(byte)3.关闭连接:close()实现简单通信程序server,server.py#导入socket模块importsocket#创建socket或者使用server=socket.socket()server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#Define绑定的ip和端口,使用元组定义ip_port=('127.0.0.1',8888)#绑定监听:bind(address),在AF_INET下,以元组(ip,port)的形式表示地址server.bind(ip_port)#设置最大连接数,默认为1返回信息(注:python3.x以上,网络数据以byte类型发送和接收,发送和接收String类型数据时,需要对数据进行编码(发送:messages.enconde();接收后转成String类型:messages.deconde()),pyhon2.x不编码直接发送数据)'''messages="连接成功!"conn.send(messages.encode())#统计信息个数count=0#一个连接,不断接受客户端发来的数据whileTrue:data=conn.recv(1024)#打印数据infor客户端发送的mationprint(data.decode())#判断是否退出当前连接,等待下一次连接ifdata==b'exit':break#处理客户端数据(如:响应请求等)数数=count+1string="第一个"+str(count)+"消息:"+data.decode()conn.send(string.encode())#主动关闭连接conn.close()client,client.pyimportsocket#创建socketclient=socket.socket()#访问服务器的ip和端口,用元组定义ip_port=("127.0.0.1",8888)#连接服务器主机client.connect(ip_port)#在同一个链接中,继续向服务端生成数据或请求whileTrue:#接收服务端发送或响应的数据data=client.recv(1024)#打印接收到的数据;python3.x以上的数据必须经过编码(发送:data.enconde();接收后转换为String类型:data.deconde())print(data.decode())messages=input("请输入生成的数据或requested(exitexit):"client.send(messages.encode())ifmessages=='exit':break'''#接收服务器发送或响应的数据data=client.recv(1024)#打印收到的数据;python3.x以上数据需要编码,发送enconde();receivedeconde()print(data.decode())'''#关闭连接client.close()具体效果如下图所示。多线程通信TCP服务器同时与多个TCP客户端连续通信。只需要通过线程向上创建一个多线程任务handle_client。importsocketimportthreadingimportrandomdefhandle_client():#Acceptclientrequestlinkclient,address=server.accept()print("[*]Acceptconnectionfrom:%s:%d"%(address[0],address[1]))messages="HelloWorld!"client.send(messages.encode())#继续与当前连接的客户端通信whileTrue:#接受客户端数据请求=(client.recv(1024)).decode()#判断是否结束通信ifrequest=='exit':breakprint("[*]Receivedfrom%s:%d:%s"%(address[0],address[1],request))#向客户端发送响应信息client.send((str(random.randint(1,1000))+":"+"ACK!").encode())#关闭当前连接client.close()if__name__=="__main__":#创建socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定义绑定ip和端口ip='127.0.0.1'port=8888#绑定监听server.bind((ip,port))#设置最大连接数,默认为1server.listen(5)print("[*]Listeningon%s:%d"%(ip,port))#循环开启线程,接受多个客户端的链接通信whileTrue:#创建线程client_handler=threading.Thread(target=handle_client)#开启线程client_handler.start()python3.x及以上,网络数据报文以byte类型收发,如果要收发String类型数据,需要通过messages.enconde()对数据进行编码,接收后传给我如果将ssages.deconde()转换为String类型pyhon2.x,数据将不经过编码直接发送。本文已收录GitHub,传送门~[2],还有完整的大厂面试考点,欢迎Star。参考[1]参考公众号程序员小西的文章:https://mp.weixin.qq.com/s/KK1dnNoHrbjMyuhQptaBAQ[2]传送门~:https://github.com/MaoliRUNsen/runsenlearnpy100
