服务端和客户端就像银行出纳员和客户样,一个银行出纳员(服务器),不吃不睡的服务排队的客户,每个客户都会有要解决的问题,一旦完成,客户就会走开,出纳员等待下一个客户的到来。
服务器端:
from socket import * from time import ctime HOST = ‘‘ #空白,是对bind方法的标识,可以使用任何可用的地址 PORT = 21567 BUFSIZ = 1024 #缓冲区大小设为1kb ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配tcp协议套接字 tcpSerSock.bind(ADDR) #将套接字绑定到服务器地址 tcpSerSock.listen(5) #开启tcp监听器的调用 while True: #无限的循环,不断的监听 print(‘waitting for connect‘) tcpCliSock, addr = tcpSerSock.accept() #等待客户端的连接 print(‘...connect from: ‘, addr) while True: data = tcpCliSock.recv(BUFSIZ)#接受客户端数据 if not data:#如果消息为空,跳出本会话循环,等待另一个客户端连接 break tcpCliSock.send(b‘[%s] %s‘ %(bytes(ctime(), ‘utf-8‘),data))#必须加b‘’否则还是str #如果得到消息则格式化返回数据并加上时间戳 tcpCliSock.close()#并不会执行 tcpSerSock.close()#并不会执行
>>>
waitting for connect
客户端:
from socket import * HOST = ‘127.0.0.1‘ PORT = 21567 #应与服务端相同 BUFSIZ = 1024 #大小也应该相同 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM)#分配tcp客户端套接字 tcpCliSock.connect(ADDR)#主动调用并连接到服务器 while True:#无限循环, data = input(‘>‘)#输入数据 if not data:#如果输入为空,则跳出循环 break tcpCliSock.send(bytes(data, encoding = "utf8") )#发送的数据只能是bytes,用bytes(s, encoding=‘utf-8‘)将输入的str转为bytes #发送到服务器进行数据处理 data = tcpCliSock.recv(BUFSIZ)#接受到服务器加工过的信息 if not data:#如果调用失败则退出循环 break print(data.decode(‘utf-8‘))#将bytes转为str #输出到屏幕 tcpCliSock.close()
>>>
[Thu Feb 8 16:51:49 2018] h >hello lily [Thu Feb 8 16:52:56 2018] hello lily >你好 [Thu Feb 8 16:53:43 2018] 你好 >as long as you were happy [Thu Feb 8 17:27:39 2018] as long as you were happy