socket

来源:互联网 发布:淘宝购物哪个返利网好 编辑:程序博客网 时间:2024/06/18 09:50

下文由运行错误提示引出:

TypeError: a bytes-like object is required, not 'str'

首先介绍一下 python bytes和str两种类型转换的函数encode(),decode()

  • str通过encode()方法可以编码为指定的bytes
  • 反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

    python核心编程书中的2-1例子:

    TCP服务器::

#coding=utf-8#创建TCP服务器from socket import *from time import ctimeHOST=''PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)tcpSerSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字tcpSerSock.bind(ADDR) #套接字与地址绑定tcpSerSock.listen(5)  #监听连接,传入连接请求的最大数while True:    print('waiting for connection...')    tcpCliSock,addr =tcpSerSock.accept()    print('...connected from:',addr)    while True:        data =tcpCliSock.recv(BUFSIZ)        #print('date=',data)        if not data:            break        tcpCliSock.send(('[%s] %s' %(ctime(),data)))    tcpCliSock.close()tcpSerSock.close()

TCP客户端:

#coding=utf-8from socket import *HOST = 'localhost' #  or 'localhost'PORT = 21567BUFSIZ = 1024ADDR=(HOST,PORT)tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)while True:    data = input('> ')    print('data=',data);    if not data:        break    tcpCliSock.send(data)    data = tcpCliSock.recv(BUFSIZ)    if not data:        break    print(data)tcpCliSock.close() 

运行的结果:
这里写图片描述

意思是tcpCliSock.send(data)传入的参数是应该是bytes类型,而不是str类型。

修正后:

TCP服务器:

# coding=utf-8from socket import *host = ''port = 21567  # 端口号保持一致bufsiz = 1024addr= (host,port)tcpSerSock = socket(AF_INET, SOCK_STREAM) # 创建套接字tcpSerSock.bind(addr)   #绑定地址tcpSerSock.listen(5) #  #设置监听上限while True:    print('waiting for connection...')    (tcpCliSock,addr_cli) = tcpSerSock.accept()    print('...connected from: ',addr_cli)    while True:        data = tcpCliSock.recv(bufsiz).decode()        if not data:            break              print("From Client %s get %s "%(addr_cli,data))             message = input("Service>")        # 千万别写成了tcpCliSock.send(message).encode()        tcpCliSock.send(message.encode())tcpSerSock.close()

TCP客户端:

# coding=utf-8from socket import *host = '192.168.1.108' # 作为服务器端的ipport = 21567bufsiz = 1024addr = (host,port)tcpCliSock = socket(AF_INET,SOCK_STREAM)  #创建套接字tcpCliSock.connect(addr)  # 连接上的服务器(ip,端口)while True:    data = input("Client>")    if not data:        break    # 千万别写成了tcpCliSock.send(message).encode()        tcpCliSock.send(data.encode())    message = tcpCliSock.recv(bufsiz).decode()    if not data:        break    print("From Servier :",message)tcpCliSock.close()

运行结果:

服务端显示:
这里写图片描述

客户端:
这里写图片描述

由此看出可以实现通信,如果是在两台电脑上,把ip设为作为服务器的电脑即可,但windows在设置时需要注意电脑会出现防火墙的选项,要选择允许访问,最好用安装linux系统的电脑作为服务器端,亲测正常运行。

原创粉丝点击