2016-03-29 67 views
1

我有一个Java服务器和Python客户端之间的TCP连接。 当'q'从任何到其他连接发送时必须关闭。 它发挥作用,当我从Python发送'q'到Java。然而,当我从java发送'q'到python时,它不起作用。我尝试了类型转换但没用。TCP Java服务器,Python客户端字符串不等于

Java服务器:

公共类发件人{

public static void main(String[] args) throws IOException { 
    String fromclient; 

    ServerSocket Server = new ServerSocket(25000); 

    System.out.println("TCPServer Waiting for client on port 25000"); 

    while (true) { 
     Socket connected = Server.accept(); 
     System.out.println(
       " THE CLIENT" + " " + connected.getInetAddress() + ":" + connected.getPort() + " IS CONNECTED "); 

     PrintWriter out = new PrintWriter(connected.getOutputStream(), true); 
     Scanner sc = new Scanner(System.in); 


     while (true) { 
      String input = sc.nextLine(); 
      out.println(input); 
     } 
    } 

} 

}

Python客户端:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(("localhost", 25000)) 
while True: 
    r, _, _ = select.select([client_socket], [], []) 
    if r: 
     data = client_socket.recv(4096) 
     string_data = data.decode('utf-8') 
     print str(string_data) == 'q' 
     if str(string_data) == 'q' or string_data == 'Q': 
      print ('Connection closed') 
      client_socket.close() 
      break 
     else: 
      print (string_data) 

声明打印STR(string_data)== 'Q' 总是返回假

回答

2

您需要将您的Java服务器代码从out.println(input)更改为out.print(input)。还要添加一个out.flush()以强制数据在缓冲区填满后立即发送。

println - 也将派断行给客户

随着print它按预期工作。

编辑一些额外的。在这种情况下,它可以帮助Python客户端打印出data中的字节。

修改Python客户端代码

data = client_socket.recv(4096) 
for i in bytearray(data): 
    sys.stdout.write(hex(i) + " ") 
print 
上的Java

假定输入是q+ENTER。请参阅下面的Pathon客户端的输出。

使用Java的服务器端out.println

0x71 0xd 0xa 
False 
q 

使用Java的服务器端out.print

0x71 
True 
Connection closed 

这样很容易被发现的附加字节,被发送到客户端(0xd 0xa)。

-1

我认为编码是问题。只需注释编码部分和代码应该工作。

+0

仍然是同样的问题 –

+0

找出java端使用Charset.defaultCharset()或系统属性或InputStreamReader.getEncoding编码并使用相同的python端 – Shiva

+0

的编码是UTF-8 –