2016-04-05 3 views
1

Ich habe einen Python-Server und einen Java-Client. Wenn eine Zeichenfolge von Java an Python gesendet wird, ist sie nicht vollständig. Beispiel:Python-Server erhält keine vollständige Zeichenfolge von Java-Client

Java-Code gesendet: Helloooooooooo

Recieved in Python als:

he 

lloooooooo 

oo 

hier sind die Codes

Python-Server:

import socket 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server_address = ("localhost", 10000) 
print 'starting up on %s port %s' % server_address 
sock.bind(server_address) 

sock.listen(5) 

while True: 
    print 'waiting for a connection' 
    connection, client_address = sock.accept() 

    try: 
     print 'connection from', client_address 

     while True: 
      data = connection.recv(1024) 
      print 'received: ' + data 
      print type(data) 
      if data: 
       print 'sending data back to the client' 
       connection.sendall(data) 
      else: 
       print 'no more data from', client_address 
       break 

    finally: 
     connection.close() 

Java Client:

package server; 

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

class Reciever_test { 
public static void main(String args[]) throws Exception { 
     String sentence; 
     String modifiedSentence; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 10000); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    while(true) 
    { 
     sentence = inFromUser.readLine(); 
     outToServer.writeBytes(sentence + "\n"); 
     modifiedSentence = inFromServer.readLine(); 
     System.out.println("FROM SERVER:" + modifiedSentence); 
    } 

    //clientSocket.close(); 
} 

}

+0

Um zu klären, haben Sie die Python-Seite wollen auf einmal die gesamte Zeichenfolge zu drucken, und nicht Teile davon? – craigsparks

+0

ja, genau. Ich will die ganze Zeichenfolge, weil ich es später als Bezeichner für welche Operation ich verwenden werde –

+0

Dann müssen Sie die Daten aus dem Socket sammeln, bis es abgeschlossen ist, vielleicht bis enthält '\ n'. –

Antwort

0

Java-Client stürzt ab: einfach geändert die Art, wie ich Daten an den Server sende.

public static void main(String args[]) throws Exception { 
    String sentence; 
    String modifiedSentence; 
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 10000); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
    Scanner sc = new Scanner(System.in); 
    while(true) 
    { 


     while (true) { 
      String input = sc.nextLine(); 
      out.print(input); 
      out.flush(); 
      modifiedSentence = inFromServer.readLine(); 
      System.out.println("FROM SERVER:" + modifiedSentence); 
     } 
    } 

Python Server: Die Art, wie ich reagieren werden musste geändert (statt sendall mit senden)

while True: 
print 'waiting for a connection' 
connection, client_address = sock.accept() 

try: 
    print 'connection from', client_address 

    while True: 
     data = connection.recv(4096) 
     print data 
     print type(data) 
     if data: 
      print 'sending data back to the client' 
      connection.send(data + "\n") 
     else: 
      print 'no more data from', client_address 
      break 

finally: 
    connection.close() 
0

Vergebens von dem, was Klaus D.is sagen, die recv Garantien, wie viele Daten höchstens für wartet, könnte sich entscheiden, damit umzugehen, was es hat, bevor die Größe erreicht ist. Ich benutzte einen einfachen Puffer, obwohl ich sicher bin, könnte es bessere Möglichkeiten sein:

import socket 
import atexit 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = ("localhost", 10000) 
print ('starting up on %s port %s' % server_address) 
sock.bind(server_address) 

sock.listen(5) 

def close(connection): 
    connection.close() 

while True: 
    print ('waiting for a connection') 
    connection, client_address = sock.accept() 
    atexit.register(close, connection) 

    try: 
     print ('connection from', client_address) 

     buffer=[] 
     while True: 

      data = connection.recv(1024) 
      for b in data: 
       buffer.append(b) 
      print ('received: ' + str(data)) 
      print (type(data)) 

      if str(buffer[-1]) == '\n': #if changed to use the buffer to decide when done receiving, the newline is the terminator 
       print ('sending data back to the client') 
       connection.sendall(''.join(buffer)) 
       buffer = [] 
      # else: 
      #  print ('no more data from', client_address) 
      #  break 

    finally: 
     close(connection) 

Die atexit ist die Steckdose ordnungsgemäß in Fall schließen Ihr Programm

Verwandte Themen