2016-03-29 6 views
1

Ich habe eine TCP-Verbindung zwischen einem Java-Server und Python-Client. Wenn 'q' von einem anderen zum anderen gesendet wird, muss die Verbindung geschlossen sein. Es funktioniert, wenn ich 'q' von Python nach Java sende. Wenn ich jedoch 'q' von Java zu Python sende, funktioniert es nicht. Ich habe versucht, zu tippen, aber keine Verwendung.TCP-Java-Server, Python-Client String nicht gleich

Java Server:

public class Sender {

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 Auftraggeber:

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) 

Die Aussage Druck str (string_data) == 'q' immer gibt false zurück

Antwort

2

Sie müssen Ihren Java-Server-Code von out.println(input) zu out.print(input) ändern. Fügen Sie auch eine out.flush() hinzu, um zu erzwingen, dass die Daten nicht sofort gesendet werden, nicht erst nachdem der Puffer gefüllt ist.

println - würde auch die Zeilenumbrüche an den Client

Mit print es wie erwartet funktioniert senden.

bearbeiten Einige zusätzliche. In diesem Fall hilft es dem Python-Client, die Bytes in data auszudrucken.

den Client-Code Python Ändern

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

Angenommene Eingang auf Java ist q+ENTER. Siehe unten die Ausgabe auf der Seite des Pathon-Clients.

auf Java Server-Seite mit out.println

0x71 0xd 0xa 
False 
q 

auf Java Server-Seite mit out.print

0x71 
True 
Connection closed 

Auf diese Weise ist es einfach, das zusätzliche Bytes (0xd 0xa) zu erkennen, die an den Client gesendet wurden.

-1

Ich denke, die Codierung ist das Problem. Einfach den Codierungsteil auskommentieren und der Code sollte funktionieren.

+0

noch das gleiche Problem der Codierung der Java-Seite findout –

+0

die Charset.defaultCharset() oder Systemeigenschaft oder InputStreamReader.getEncoding und verwendet dasselbe auf Python Seite unter Verwendung – Shiva

+0

die Codierung UTF-8 –