萌新请教一个 Python socket 问题

2018-01-30 14:54:59 +08:00
 Mrzhang0320
python 写了一个简单的服务端和一个客户端,连接可以成功,但是发送数据时,服务端每次都报错“在一个非套接字上尝试了一个操作”,然后停止运行了。
************************
服务端:
import sys
from _thread import *

HOST = ''
PORT = 8888

s = socket(AF_INET, SOCK_STREAM)
print('Socket created')

try:
s.bind((HOST, PORT))
print('Socket bind complete')
except socket.error as msg:
print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()

s.listen(5)
print('Socket now listening')

while True:
conn, addr = s.accept()
print('Connected with ' + addr[0] + ':' + str(addr[1]))

conn.send(b"Welcome to the server.\n")
while True:
data = conn.recv(1024)
reply = b'OK...' + data
if len(data) == 0:
continue
conn.sendall(reply)
conn.close()
conn.close()

s.close()
********************
客户端:
********************
from socket import *

ip_port = ('192.168.1.95', 3600)
BUFSIZE = 1024
sk = socket(AF_INET, SOCK_STREAM)
sk.connect(ip_port)
while True:
msg = input('>>:').strip()
if len(msg) == 0: continue
sk.send(msg.encode('utf-8'))
feedback = sk.recv(BUFSIZE)
print(feedback.decode('utf-8'))
s.close()
4973 次点击
所在节点    Python
8 条回复
Mrzhang0320
2018-01-30 14:59:55 +08:00
Traceback <most recent call last>:
File "mysocket.py", line 27, in <module>
data = conn.recv(1024)
OSError: [WinError 10038] 在一个非套接字上尝试了一个操作
fangzq
2018-01-30 16:01:07 +08:00
老铁,你服务器的地址是 HOST = '' , PORT = 8888。而客户端连接的地址是 ip_port= ('192.168.1.95', 3600) 。如果是在同一台机器上,你服务器和客户端的 ip/port 都不一样,你确定能通信吗?
Mrzhang0320
2018-01-30 16:17:29 +08:00
@fangzq 不好意思,这里忘记说了,我用了 haproxy 转发。。。
Mrzhang0320
2018-01-30 16:18:28 +08:00
@fangzq 我用了三台电脑,一台跑 server,一台跑 client,一台跑 haproxy
Mrzhang0320
2018-01-30 16:21:38 +08:00
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000
上面的代码是网上随便下的,后面看了廖雪峰老师的 socket 代码,成功了,暂时不知道为什么。。。
fangzq
2018-01-30 17:41:58 +08:00
@Mrzhang0320 ,我之前整理过关于 socket 的笔记,感兴趣的话可以看看,希望对你有帮助。https://github.com/fangzqq/Learning-Notes/blob/master/network_programming/%E7%90%86%E8%A7%A3%20socket_v2.md#tcp-server-and-client
ycz0926
2018-01-30 17:51:09 +08:00
为什么不直接连 c/s 调试下
ysc3839
2018-01-30 19:40:55 +08:00
第二个 while True 里面,最后你 conn.close() 了,但又没退出循环,于是继续 conn.recv(),所以出错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/427110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX