Python Socket服务器与Ktor客户端连接成功但无消息打印问题
Python Socket服务器与Ktor客户端通信问题排查
我编写了如下Python Socket服务器:
import socket def server_program(): # get the hostname host = 'localhost' # socket.gethostname() port = 8091 # initiate port no above 1024 server_socket = socket.socket() # get instance # look closely. The bind() function takes tuple as argument server_socket.bind((host, port)) # bind host address and port together # configure how many client the server can listen simultaneously server_socket.listen(2) conn, address = server_socket.accept() # accept new connection print("Connection from: " + str(address)) while True: # receive data stream. it won't accept data packet greater than 1024 bytes data = conn.recv(1024).decode() if not data: # if data is not received break break print("from connected user: " + str(data)) data = input(' -> ') conn.send(data.encode()) # send data to the client conn.close() # close the connection if __name__ == '__main__': server_program()
该服务器可与以下Python客户端正常通信:
import socket clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientsocket.connect(('localhost', 8091)) clientsocket.send('hello'.encode())
但与以下Ktor客户端通信时出现问题:
fun send() { runBlocking { val selectorManager = SelectorManager(Dispatchers.IO) val socket = aSocket(selectorManager).tcp().connect("10.0.2.2", 8091) val receiveChannel = socket.openReadChannel() val sendChannel = socket.openWriteChannel(autoFlush = true) val myMessage = "this" // readln() sendChannel.writeStringUtf8("$myMessage\n") // ("$args\n") } }
客户端与服务器已成功建立连接,但服务器端无法打印接收到的字符串。
服务器输出对比
- Python客户端通信时服务器输出:
Connection from: ('127.0.0.1', 54012) from connected user: hello
- Ktor客户端通信时服务器输出:
Connection from: ('127.0.0.1', 53334)
排查思路
- 确认数据发送时机:Ktor客户端的
runBlocking块执行完毕后,socket会被立即销毁,即便设置了autoFlush = true,数据可能还未完成发送就被中断。可以在发送后添加delay(1000)延迟关闭连接,或手动调用sendChannel.flush()强制刷出数据。 - 统一连接地址:Ktor客户端使用
10.0.2.2,Python客户端用localhost,虽然部分环境下二者等价,但改为统一使用localhost可排除地址映射导致的隐性问题。 - 检查数据格式差异:Ktor客户端发送的内容带换行符
\n,而Python客户端没有。修改Ktor代码去掉换行符,或在Python服务器中打印原始字节(不直接decode),确认是否接收到了完整数据。 - 延长连接生命周期:在Ktor客户端的
runBlocking块末尾添加延迟,保持连接一段时间,观察服务器是否能接收到数据,排查连接提前关闭的问题。 - 调试原始字节流:修改Python服务器,将
recv得到的字节直接打印(如print("raw data:", data)),确认是否有数据被接收,排查编码或截断问题。
内容的提问来源于stack exchange,提问作者Special Muesli
相关产品推荐
相关产品推荐

