问题描述
如何保持一个 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了, 客户端与服务端就断开了连接。
客户端如果想再发送数据,就必须重新建立连接。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…