python3中socket套接字的编码问题解决,,一、TCP1、tcp


一、TCP

1、tcp服务器创建

#创建服务器from socket import *from time import ctime  #导入ctimeHOST = ‘‘       #任意主机PORT = 21567    #随机提供个端口号BUFSIZ = 1024   # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量ADDR = (HOST, PORT)tcpSerSock = socket(AF_INET, SOCK_STREAM)   #分配了 TCP 服务器套接字tcpSerSock.bind(ADDR)   #绑定到服务器地址以及开启 TCP 监听器的调用。tcpSerSock.listen(5)    #listen()方法的参数是在连接被转接或拒绝之前,传入连接请求的最大数"""    一旦进入服务器的无限循环之中,我们就(被动地)等待客户端的连接。当一个连接请求出现时,我们进入对话循环中,在该循环中我们等待客户端发送的消息。如果消息是空白的,这意味着客户端已经退出,所以此时我们将跳出对话循环,关闭当前客户端连接,然后等待另一个客户端连接。如果确实得到了客户端发送的消息,就将其格式化并返回相同的数据,但是会在这些数据中加上当前时间戳的前缀。最后一行永远不会执行,它只是用来提醒读者,如果写了一个处理程序来考虑一个更加优雅的退出方式,正如前面讨论的,那么应该调用 close()方法。"""while True:    print("waiting for connection")    tcpCliSock, addr = tcpSerSock.accept()  # 接收客户端连接,返回客户端和地址    print("...connected from:", addr)    while True:        data =  tcpCliSock.recv(BUFSIZ).decode()  #对话(接收 / 发送) 接收客户端的data        if not data:            break        tcpCliSock.send((‘service:‘+ctime()+‘--‘+data).encode())   #发送时间戳 和data信息给客户端    tcpCliSock.close()tcpSerSock.close()

2、tcp客户端创建

from socket import *HOST = ‘localhost‘PORT = 21567           #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)BUFSIZ = 1024ADDR = (HOST, PORT)tcpCliSock = socket(AF_INET, SOCK_STREAM)   #分配 TCP 客户端套接字tcpCliSock.connect(ADDR)    #主动连接"""    我们必须解码来自服务器端的字符串(借助于distutils.log.warn()"""while True:    data = input("> ")    if not data:     #用户如果没有输入,则终止        break    tcpCliSock.send(data.encode())      #发送客户端的data给服务器    data = tcpCliSock.recv(BUFSIZ).decode()  #接收服务器的data    if not data:    #或者服务器终止且对 recv()方法的调用失败        break    print(‘返回:%s‘%data)tcpCliSock.close()

二、UDP

1、UDP服务器创建

"""    这个脚本创建一个 UDP 服务器,它接受客户端发来的消息,并将加了时间戳前缀的该消息返回给客户端。"""from socket import *from time import ctimeHOST = ""PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT)udpServer = socket(AF_INET, SOCK_DGRAM)udpServer.bind(ADDR)while True:    print("waiting for masssage")    data,addr = udpServer.recvfrom(BUFSIZ) #接收    data = data.decode()    udpServer.sendto((ctime()+"--"+ data).encode(),addr)    print("received from  and returned to ",addr)udpServer.close()

2、UDP客户端创建 

#这个脚本创建一个 UDP 客户端,它提示用户输入发送给服务器的消息,并接收服务器加了时间戳前缀的消息,然后将它们显示给用户。from socket import *HOST = ‘localhost‘PORT = 21567           #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)BUFSIZ = 1024ADDR = (HOST, PORT)udpCS = socket(AF_INET, SOCK_DGRAM)while True:    data = input("> ")    if not data:        break    udpCS.sendto(data.encode(),ADDR)    data,ADDR = udpCS.recvfrom(BUFSIZ)    if not data:        break    print(data)udpCS.close()

  其实道理都差不多,在python3中,利用套接字传输的内容都以byte形式传输,这时候传送时(send/sendto)需要encode,接收(recv)时需要decode。只要掌握这个重点,处理这个问题就很简单了。

python3中socket套接字的编码问题解决

评论关闭