请选择 进入手机版|继续访问电脑版
发新帖

萌新请教一个 Python socket 问题

[复制链接]
3547 8

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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()

举报 使用道具

回复

精彩评论8

mrzhang0320  新手上路  发表于 2018-1-31 14:35:03 | 显示全部楼层
Traceback <most recent call last>:
    File "mysocket.py", line 27, in <module>
        data = conn.recv(1024)
OSError: [WinError 10038] 在一个非套接字上尝试了一个操作

举报 使用道具

回复
fangzq  新手上路  发表于 2018-1-31 15:28:18 | 显示全部楼层
老铁,你服务器的地址是 HOST = '' , PORT = 8888。而客户端连接的地址是 ip_port= ('192.168.1.95', 3600) 。如果是在同一台机器上,你服务器和客户端的 ip/port 都不一样,你确定能通信吗?

举报 使用道具

回复
mrzhang0320  新手上路  发表于 2018-1-31 15:37:28 | 显示全部楼层
@fangzq 不好意思,这里忘记说了,我用了 haproxy 转发。。。

举报 使用道具

回复
mrzhang0320  新手上路  发表于 2018-1-31 15:58:17 | 显示全部楼层
@fangzq 我用了三台电脑,一台跑 server,一台跑 client,一台跑 haproxy

举报 使用道具

回复
mrzhang0320  新手上路  发表于 2018-1-31 16:36:15 | 显示全部楼层
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000
上面的代码是网上随便下的,后面看了廖雪峰老师的 socket 代码,成功了,暂时不知道为什么。。。

举报 使用道具

回复
fangzq  新手上路  发表于 2018-1-31 16:37:31 | 显示全部楼层
@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-1-31 16:41:40 | 显示全部楼层
为什么不直接连 c/s 调试下

举报 使用道具

回复
ysc3839  新手上路  发表于 2018-1-31 16:50:42 | 显示全部楼层
第二个 while True 里面,最后你 conn.close() 了,但又没退出循环,于是继续 conn.recv(),所以出错了。

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表