如何从Java端成功与Python Twisted服务器实现通信?
问题1:代码错误及阻塞原因
你的代码存在两个核心问题导致无法收到返回、出现阻塞:
- 发送数据后没有刷出缓冲区:
dOut.writeUTF(teststring)执行后,数据默认会暂存在JVM的输出缓冲区中,没有实际发送到服务器。你需要在writeUTF后添加dOut.flush()强制把缓冲区数据发出去,服务器才能收到你的请求。 DataInputStream.readUTF()是阻塞方法,且要求返回数据符合Java自定义的UTF传输格式:readUTF()会一直等待直到收到符合格式的数据(先收到2个字节表示内容长度,再收到对应长度的UTF-8内容)才会返回。而Twisted服务端如果没有专门适配Java的writeUTF格式处理逻辑,返回的内容不符合readUTF的解析要求,就会导致该方法一直阻塞不会向下执行。你可以改用普通的InputStream读取字节数组,自行解析为字符串,避免两端格式不匹配的问题。
补充说明:socket.isConnected返回true仅代表本地socket对象曾经完成过TCP三次握手,不能代表当前连接正常、也不能代表对方服务能够正常处理你发送的数据。
问题2:SocketFactory是否必须使用
不是必须的。普通TCP直连场景下,你直接调用val socket = Socket(host, port)创建Socket实例即可,和你用SocketFactory创建的效果完全一致。SocketFactory一般用于需要自定义Socket创建逻辑的场景,比如SSL加密连接、代理连接、自定义Socket实现等特殊场景才需要使用。
问题3:Java对接Twisted的相关库
不存在专门的Java对接Twisted的库。Twisted是Python生态的异步网络框架,只要它对外暴露的是标准TCP、HTTP、WebSocket这类通用网络协议接口,你用Java生态对应的通用网络库即可对接:
- 如果是自定义TCP协议,可使用Java标准Socket、Netty等开发
- 如果是HTTP协议,可使用OkHttp、Apache HttpClient等开发
- 如果是WebSocket协议,可使用Java-WebSocket、OkHttp等开发
内容的提问来源于stack exchange,提问作者Yurowitz
相关产品推荐
相关产品推荐

