Mr_ranbow 2016-12-29 06:45 采纳率: 100%
浏览 1297
已采纳

新手关于python socket编程的一些疑问。。。。

先上代码
服务端代码

import socket
def start_server():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = ""
    port = 6666
    address = (host, port)
    s.bind(address)
    s.listen(3)
    conn, temp = s.accept()
    conn.send("welcome to my server")
    #问题在这里,如果客户端没有recv上边服务器发送的welcome to my server,再调用recv就会出错
    msg = conn.recv(1024)
    print "msg = ", msg
    conn.close()
    s.close()

if __name__ == "__main__":
    start_server()
服务端代码非常简单
然后上客户端代码(先上没问题的)
import socket
def start_client():
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 6666
    address = (host, port)
    conn.connect(address)
    print "-----------"
    print conn.recv(1024)   #############注释error#######
    conn.close()    

if __name__ == "__main__":
    start_client()
这样子先开服务端,再开客户端是没问题的。
这时问题来了。如果我把客户端的conn.recv(1024)注释掉,当客户端代码跑完,服务端就会有问题了。
服务端出错提示如下:

Traceback (most recent call last):

File "C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\dropins\pydev\plugins\org.python.pydev.debug_2.5.0.2012040618\pysrc\pydevd.py", line 1346, in
debugger.run(setup['file'], None, None)
File "C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\dropins\pydev\plugins\org.python.pydev.debug_2.5.0.2012040618\pysrc\pydevd.py", line 1060, in run
pydev_imports.execfile(file, globals, locals) #execute the script
File "E:\pythonCode\server.py", line 31, in
start_server()
File "E:\pythonCode\server.py", line 24, in start_server
msg = conn.recv(1024)
socket.error: [Errno 10053]

是什么问题呢?
我想了很久,也试过好多测试代码,发觉如果建立连接后,在一端A,先发送一些数据,如果B端没有recv,且当B端连接close的时候。A端因为阻塞在recv部分的代码不是如约的得到空字符串,而是出现了这个报错。我的问题是python写socket编程必须send,recv一一对应使用么???

刚开始学,各位大牛指导下啊

  • 写回答

2条回答 默认 最新

  • oyljerry 2016-12-29 07:51
    关注

    这是网络通信中的一个错误处理而已。需要你服务器端对它进行处理就可以了
    http://blog.csdn.net/tw7613781/article/details/7395190

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同