按照《python核心编程》中实例进行练习,运行中发现报错,过程如下:
书上的代码:
----------------------------------------------------------------------------------------------
#服务端
from socket import *
from time import ctime
HOST =''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5000)
while True:
print ('等待连接。。。')
tcpCliSock, addr = tcpSerSock.accept()
print('连接源:',addr)
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print('[%s]:%s' %(addr,data))
tcpCliSock.send('[%s] %s' % (ctime(), data))
tcpCliSock.close()
tcpSerSock.close()
---------------------------------------------------------------------------------------------------
#客户端
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print(data)
tcpCliSock.close()
------------------------------------------------------------------------------------------------------
直接在shell中按F5运行,运行服务器正常,但运行客户端就出现如下错误:
====================== RESTART: G:/workspace/tsTserv.py ======================
等待连接。。。
====================== RESTART: G:/workspace/tsTclnt.py ======================
Traceback (most recent call last):
File "G:/workspace/tsTclnt.py", line 9, in <module>
tcpCliSock.connect(ADDR)
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
>>>
怀疑跟两个程序都运行在同一shell窗口有关,于是通过shell运行服务端,用dos命令运行客户端,果然可以正常运行:
====================== RESTART: G:/workspace/tsTserv.py ======================
等待连接。。。
连接源: ('127.0.0.1', 55428)
等待连接。。。
不过问题又来了,在客户端上进行发送内容是报错了:
>hi
Traceback (most recent call last):
File "tsTclnt.py", line 15, in <module>
tcpCliSock.send(data)
TypeError: a bytes-like object is required, not 'str'
*********************************************************************************************************************************************************************
检查了自己所敲的代码和书上代码,没发现问题,于是怀疑是不是我用的3.X的python,而书上是2.X的python,查了一下度娘,果然也有人遇到同样问题。
http://blog.csdn.net/chuanchuan608/article/details/17915959
原来是类型问题
套接字的成员函数send
socket.send(bytes[, flags]) 形参为字节类型
参照这位大神的解决方案,修改了代码,修正后的代码(红字部分)
------------------------------------------------------------------------------------------
服务器:
from socket import *
from time import ctime
HOST =''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5000)
while True:
print ('等待连接。。。')
tcpCliSock, addr = tcpSerSock.accept()
print('连接源:',addr)
while True:
data = tcpCliSock.recv(BUFSIZE).decode()
if not data:
break
print('[%s]:%s' %(addr,data))
tcpCliSock.send(('[%s] %s' % (ctime(), data)).encode())
tcpCliSock.close()
tcpSerSock.close()
------------------------------------------------------------------------------------
客户端:
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
tcpCliSock.send(data.encode())
data = tcpCliSock.recv(BUFSIZE).decode()
if not data:
break
print(data)
tcpCliSock.close()
--------------------------------------------------------------------------------------------------------------------------
====================== RESTART: G:/workspace/tsTserv.py ======================
等待连接。。。
连接源: ('127.0.0.1', 55982)
[('127.0.0.1', 55982)]:hi
Traceback (most recent call last):
File "G:/workspace/tsTserv.py", line 20, in <module>
data = tcpCliSock.recv(BUFSIZE).decode()
OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
*********************************************************************************************************************************************************************
哇塞,还是不行,怀疑自己还是改的有问题,把自己的代码和大神的代码对比来对比去,还是找不多原因,还是问度娘吧。果然也有人提出同样问题(度娘真是神通广大)。
原来是服务端tcpCliSock.close()不应该放到第二个while循环里,否则进行一次交互后就关闭连接了
再次对服务器代码进行修改:
----------------------------------------------------------------------
from socket import *
from time import ctime
HOST =''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5000)
while True:
print ('等待连接。。。')
tcpCliSock, addr = tcpSerSock.accept()
print('连接源:',addr)
while True:
data = tcpCliSock.recv(BUFSIZE).decode()
if not data:
break
print('[%s]:%s' %(addr,data))
tcpCliSock.send(('[%s] %s' % (ctime(), data)).encode())
tcpCliSock.close()
tcpSerSock.close()
再次运行正,常搞定。