socket编程TCP之服务器和客户端

服务端和客户端就像银行出纳员和客户样,一个银行出纳员(服务器),不吃不睡的服务排队的客户,每个客户都会有要解决的问题,一旦完成,客户就会走开,出纳员等待下一个客户的到来。

面向连接的套接字:在进行通讯之前必须建立连接,主要协议是传输控制协议,简称TCP,TCP套接字的名字是SOCK_STREAM

服务器端:

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
 
原文地址:https://www.cnblogs.com/Zhu-Xueming/p/8432662.html