Python socket 简单编程小结
首先创建服务器端的socket
#socket server
import socket
#定义变量
HOST ="localhost"
PORT = #是数字类型,不是字符串类型
BUFSIZE = #一次接收字节数多少个bytes
ADDR = (HOST,PORT) #之所以组成元组,是因为bind()函数需要一个包含两个参数的元组。
#创建套接字
tcpSerSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定在本机特定端口,等待客户端的访问,客户端要访问的端口要和服务器绑定的端口号要一样
tcpSerSock.bind(ADDR)
#坐在端口号上开始监听来自客户端的连接请求
tcpSerSock.listen(5) #监听的客户端的数量
while True:
#如果有客户端的connect()连接,向服务器发送套接字对象,客户端地址。
#服务器端被动接收
tcpClisock,addr = tcpSerSock.accept()
print("connected from",addr)
data =tcpClisock.recv(BUFSIZE)
while True:
if not data:
print('no data from client') #如果tcpClisock关闭,则报异常
break
print(data.decode()) ## 需要对bytes类型进行转化为str类型,才能输出,使用解码操作
tcpClisock.send(data)
tcpClisock.close()
tcpSerSock.close()
客户端:
#客户端
from socket import *
HOST ='172.22.160.1'
PORT = 51567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
#将str通过编码转换为bytes类型
tcpCliSock.send(data.encode())
# 将接收到的bytes类型数据data解码为str类型数据
data = tcpCliSock.recv(BUFSIZE).decode('utf-8')
if not data:
break
print(data)
tcpCliSock.close()
编程中出现的问题:
- 本机实验时候,客户端连接到服务器的地址,可能会报错,提示“[WinError 10061] 由于目标计算机积极拒绝,无法连接。”
解决方法:
import socket
hostname1 = socket.gethostname() #查看本机名
socket.gethostbyname("hostname1") #获得本机IP地址,客户端HOST中添入本地址即可。
- 字符串的数据类型转化问题,python3中默认socket传输的是bytes数据类型,所以在传输和显示时,要转换类型,例如:
#传输的时候需要数据是bytes类型,要将字符串类型编码为bytes类型,使用encode()
data = input('>') # data 是接收输入的字符串类型
if not data:
break
tcpCliSock.send(data.encode()) #将str通过编码转换为bytes类型,然后send给对方。
#在输出显示的时候需要将bytes类型数据转化为字符串类型编码,使用decode()解码。
data = tcpCliSock.recv(BUFSIZE).decode('utf-8')
print(data)
- "[WinError 10038] 在一个非套接字上尝试了一个操作。"问题。
原因:关闭了socket对象,在接收时会报错。
解决方案:将socket对象的关闭操作写在循环的外部。