求教 Sokcet 链接复用问题

发布于 2022-09-12 03:02:32 字数 1999 浏览 26 评论 0

问题描述

如何保持一个 socket 的连接不断开,并且能重复使用。

问题出现的环境背景及自己尝试过哪些方法

服务端是 python
客户端是 nodejs

相关代码

server

def create_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('127.0.0.1', 9080))  # 绑定要监听的端口
    server.listen(5)  # 开始监听
    while True:
        conn, addr = server.accept()  # 等待链接
        print(conn, addr)
        while True:
            try:
                data = conn.recv(1024)  # 接收数据
                if not data:
                    break
                dataStr = data.decode()
                print('recive:', dataStr)  # 打印接收到的数据
                conn.send(data.upper())  # 然后再发送数据
                if dataStr == "exit":
                    break
            except ConnectionResetError as e:
                print('关闭了正在占线的链接!')
                break
        conn.close()


def run():
    create_server()

client

var net = require('net')

var host = '127.0.0.1'
var port = 9080
var client = null


$("#conBtn").click(function(){
    getConn();
})

$("#sendBtn").click(()=>{
    let val = $("#content").val()
    send(val)
})

function getConn(){
    client = net.createConnection(port, host)

    client.on('connect', ()=>{
        console.log("已成功连接服务器")
    })
    
    client.on('data', (data)=>{
        console.log('收到服务器返回消息: ', data)
    })
    
    client.on('close', function(data){
        console.log('客户端:连接断开');
    });
    return client
}

function send(val){
    client.end(val)
}

你期待的结果是什么?实际看到的错误信息又是什么?

期望结果:
我希望客户端和服务端只需要建立一次连接, 每次我想要发送数据到服务端的时候,直接调用 send(val) 方法即可。

实际是:
如果我在 server 端不添加

if not data:
   break

client 端发送随意发送字符串 "a",server 接收到数据 "a" 后,就开始无限的读取空数据。

client 如果强行继续发送数据,报错:

Uncaught Error [ERR_STREAM_WRITE_AFTER_END]: write after end

但我添加上对 data 数据的判断后, conn 就被close了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

遥远的她 2022-09-19 03:02:32

accept是阻塞的,收到数据才有返回, 怎么会不停的收空数据呢,那是表示client断开了呀。

function send(val){
    client.end(val)
}

你自己把连接关了完了问怎么保持不断开。。。
改成client.write试试

也只是曾经 2022-09-19 03:02:32
if not data:
    time.sleep(0.1)
    continue
嘿看小鸭子会跑 2022-09-19 03:02:32

客户端发送了空白字符给服务端,一般是代表链接断开了,这时候服务端和客户端能做的,也只能关闭在这个链接,重启新的链接;

而上述的代码在同时刻只能接受一个客户端的链接,然后处理该链接的事情,直到断开再 accept 新的;

这个信息可能可以解决你的问题:Python 的网络 IO 多路复用:https://www.jianshu.com/p/818...

溇涏 2022-09-19 03:02:32

但我添加上对 data 数据的判断后, conn 就被close了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。

你搞错了因果关系,是你的 client 先close了连接,服务端才会给你返回空数据,告诉你连接已关闭。这时,服务端也只能将连接关闭。

因此,你需要修改client代码,将conn做成永不主动关闭的长连接。另外,楼上指出你的server每次只能处理一个客户端连接,如果这个行为不是你预期内的,也需要改造。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文