いくつかの単純な Java クライアント コードと通信するために単純な Python サーバーを実装しようとしていますが、奇妙な動作が発生しています。Mac OSX 10.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();
}
}
サーバーコード:
import SocketServer
class PythonServer(SocketServer.BaseRequestHandler):
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
奇妙なことに、初めてサーバーをインスタンス化し、Java クライアントからリクエストを送信すると、すべてが期待どおりに動作します。
Java コンソール:
test
FROM SERVER: TEST
コマンドライン:
127.0.0.1 wrote:
test
ただし、後続のリクエストは次のようになります。
Java コンソール:
test
FROM SERVER: T
コマンドライン:
127.0.0.1 wrote:
t
したがって、クライアントはメッセージ全体を送信していると信じているにもかかわらず、サーバーはメッセージの最初の文字しか受信していないようです。
さらに複雑なことに、Java サーバーと Python クライアントを作成しました。Java クライアント/サーバーの組み合わせと Python クライアント/サーバーの組み合わせにはこの問題はありませんが、Python クライアント/Java サーバーには問題があります。
何か案は?