Python服务器只从Java客户端接收一个字符?

Python服务器只从Java客户端接收一个字符?,java,python,macos,tcp,client-server,Java,Python,Macos,Tcp,Client Server,我试图实现一个简单的Python服务器来与一些简单的Java客户机代码通信,但是我得到了一些奇怪的行为。我正在运行MacOSX10.7.2 客户端代码: import java.io.*; import java.net.*; public class JavaClient { public static void main(String argv[]) throws Exception { String sentence; String modifie

我试图实现一个简单的Python服务器来与一些简单的Java客户机代码通信,但是我得到了一些奇怪的行为。我正在运行MacOSX10.7.2

客户端代码:

import java.io.*;
import java.net.*;

public class JavaClient {
    public static void main(String argv[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 9999);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        sentence = inFromUser.readLine() + '\n';
        outToServer.writeBytes(sentence);
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER: " + modifiedSentence);
        clientSocket.close();
    }
}
服务器代码:

导入SocketServer
类PythonServer(SocketServer.BaseRequestHandler):
def句柄(自身):
#self.request是连接到客户端的TCP套接字
self.data=self.request.recv(1024).strip()
打印“{}写入:”.format(self.client_地址[0])
打印自助数据
#只需发送回相同的数据,但大写
self.request.sendall(self.data.upper())
如果名称=“\uuuuu main\uuuuuuuu”:
主机,PORT=“localhost”,9999
#创建服务器,绑定到端口9999上的本地主机
server=SocketServer.TCPServer((主机,端口),MyTCPHandler)
#激活服务器;这将一直运行,直到您
#用Ctrl-C中断程序
服务器。永远为您服务()
奇怪的是,我第一次实例化服务器并从Java客户端发送请求时,一切都按预期进行:

Java控制台:

test

FROM SERVER: TEST
test

FROM SERVER: T
命令行:

127.0.0.1 wrote:
test
127.0.0.1 wrote:
t
但随后的请求会导致:

Java控制台:

test

FROM SERVER: TEST
test

FROM SERVER: T
命令行:

127.0.0.1 wrote:
test
127.0.0.1 wrote:
t
因此,看起来我的服务器只接收到我消息的第一个字符,尽管我的客户端认为它发送的是整个消息

为了使事情更加复杂,我创建了一个Java服务器和Python客户机,Java客户机/服务器组合和Python客户机/服务器组合没有这个问题,但Python客户机/Java服务器有这个问题

有什么想法吗?

在将套接字传递到
数据输出流之前,禁用客户端上的:

clientSocket.noTcpDelay(true);
这在网络带宽方面有些浪费,但如果这对您来说是个问题,我们也可以解决这个问题

还有一个潜在的问题,这一次在您的服务器代码中,这相当于一个重复的问题
的。

在将需要输出到服务器的数据写入后,尝试刷新
您的
outToServer
server@GETah在写入缓冲区后,我添加了一行刷新缓冲区,但这并没有改变其行为。还有其他想法吗?启用/禁用Nagle算法似乎不会影响我的输出,但是您的第二个链接解决了这个问题-谢谢!