13、python网络编程练习(一)

按照《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()

再次运行正,常搞定。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值