求教 Sokcet 链接复用问题

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


回答:

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

function send(val){

client.end(val)

}

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


回答:

if not data:

time.sleep(0.1)

continue


回答:

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

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

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


回答:

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

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

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

以上是 求教 Sokcet 链接复用问题 的全部内容, 来源链接: utcz.com/a/161423.html

回到顶部