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系统的电脑作为服务器端,亲测正常运行。
阅读全文
2 0
- socket
- socket
- Socket
- Socket
- Socket
- Socket
- Socket
- Socket
- socket
- Socket
- Socket
- Socket
- Socket
- socket
- socket
- socket
- socket
- socket
- Object.create
- 使用CSS实现上下左右居中
- 链表的基本操作
- NYOJ 585 取石子(六)(尼姆博弈)
- Linux备忘1
- socket
- 幂等实现思路和细节
- 第5章 存储Node程序中的数据
- 第10章 Diffuse Shading
- thinkPHP5-渲染模板的方式
- POJ
- JavaSE-3
- MyBatis动态 SQL
- http怎么做自动跳转https?(各种版本)