You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:42:34