求教 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了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
accept
是阻塞的,收到数据才有返回, 怎么会不停的收空数据
呢,那是表示client断开了呀。你自己把连接关了完了问怎么保持不断开。。。
改成
client.write
试试客户端发送了空白字符给服务端,一般是代表链接断开了,这时候服务端和客户端能做的,也只能关闭在这个链接,重启新的链接;
而上述的代码在同时刻只能接受一个客户端的链接,然后处理该链接的事情,直到断开再 accept 新的;
这个信息可能可以解决你的问题:Python 的网络 IO 多路复用:https://www.jianshu.com/p/818...
但我添加上对 data 数据的判断后, conn 就被close了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。
你搞错了因果关系,是你的 client 先close了连接,服务端才会给你返回空数据,告诉你连接已关闭。这时,服务端也只能将连接关闭。
因此,你需要修改client代码,将conn做成永不主动关闭的长连接。另外,楼上指出你的server每次只能处理一个客户端连接,如果这个行为不是你预期内的,也需要改造。