Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
206 views
in Technique[技术] by (71.8m points)

求教 Sokcet 链接复用问题

问题描述

如何保持一个 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了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...