2018-7-22-Python全栈开发day30-socket原理与粘包-part1-TCP服务
1.服务端与客户端的循环收发消息
在之前的程序中,客户端和服务端执行完一次收发动作后,就会关闭连接,然而现实中客户端和服务端可以实现循环收发消息。
解决办法:在收发过程中执行一个循环来实现循环收发
服务端:
from socket import *#导入模块 tcp_server=socket(AF_INET,SOCK_STREAM)#建立socket对象 tcp_server.bind(('127.0.0.1',8080))#绑定地址 tcp_server.listen(5)#建立半连接池 conn,addr=tcp_server.accept()#准备和客户端进行连接 while 1:#建立死循环,可以无限进行收发 data=conn.recv(1024)#data为从客户端收到的数据 print(data) conn.send(data.upper()) tcp_server.close()
客户端:
from socket import * client_server=socket(AF_INET,SOCK_STREAM)#建立socket client_server.connect(('127.0.0.1',8080))#连接地址 while 1: msg=input('please input something and I will give the upper')#循环收发,循环输入内容 if msg=='quit':#判断推出循环条件 break client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码 data=client_server.recv(1024)#再从服务端收消息 print(data) client_server.close()
2.解决客户端断开连接,服务端持续收空的问题
当客户端断开连接时,服务端并没有退出循环,而是持续从服务端的内核态缓存中读取数据,但是由于客户端并没有发来消息,所以每次收的都是空
解决:
from socket import *#导入模块 tcp_server=socket(AF_INET,SOCK_STREAM)#建立socket对象 tcp_server.bind(('127.0.0.1',8080))#绑定地址 tcp_server.listen(5)#建立半连接池 conn,addr=tcp_server.accept()#准备和客户端进行连接 while 1:#建立死循环,可以无限进行收发 data=conn.recv(1024)#data为从客户端收到的数据 if not data:break#在这里加入,如果收不到消息,则断开 print(data) conn.send(data.upper()) tcp_server.close()
3.如果客户端输入的为空,则服务端和客户端陷入停滞等待阶段
原因:如果客户端发空,则从并没有数据从用户态转到内核态缓存中,服务端也就收不到数据,只要客户端数据输入后进行判断是否有数据进入内核态就可以
客户端;
from socket import * client_server=socket(AF_INET,SOCK_STREAM)#建立socket client_server.connect(('127.0.0.1',8080))#连接地址 while 1: msg=input('please input something and I will give the upper')#循环收发,循环输入内容 if not msg:continue if msg=='quit':#判断推出循环条件 break client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码 data=client_server.recv(1024)#再从服务端收消息 print(data) client_server.close()
4.基于tcp服务做一个时间服务器,带格式
服务端:
import time from socket import * tcp_server = socket(AF_INET, SOCK_STREAM) # 建立socket对象 tcp_server.bind(('127.0.0.1', 8080)) # 绑定地址 tcp_server.listen(5) # 建立半连接池 conn,addr=tcp_server.accept() while 1: data=conn.recv(1024)#输入的话那边encode if data =='quit':break conn.send(time.strftime(data.decode('utf-8'),time.localtime()).encode('utf-8')) conn.close() tcp_server.close()
客户端
from socket import * client_server=socket(AF_INET,SOCK_STREAM)#建立socket client_server.connect(('127.0.0.1',8080))#连接地址 while 1: msg=input('please input 格式')#循环收发,循环输入内容 if not msg:continue if msg=='quit':#判断推出循环条件 break client_server.send(msg.encode('utf-8'))#因为是手动输入的内容,所以要进行编码 data=client_server.recv(1024)#再从服务端收消息 print(data.decode('utf-8')) client_server.close()
5.TCP实现并发
后期利用socketserver

浙公网安备 33010602011771号