2017-03-26 2 views
1

génies.BufferedReader et BufferedWriter avec socket

Je souhaite utiliser la socket en Java.

Voici une partie de mon code côté serveur:

ServerSocket ss = new ServerSocket(this.portNum); 
while (!ss.isClosed()) { 
    Socket socket = ss.accept(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 

    System.out.println("reading"); 
    StringBuffer sb = new StringBuffer(); 
    String line; 
    while ((line = br.readLine()) != null) { 
     sb.append(line); 
    } 
    System.out.println("read"); 

    System.out.println("writing"); 
    bw.write(this.wsp.parse(new String(sb.toString())).toJSONString()); 
    bw.newLine(); 
    bw.flush(); 
    System.out.println("wrote"); 

    bw.close(); 
    br.close(); 
    socket.close(); 
} 
ss.close(); 

Et mon côté client (test) code est:

Socket socket = new Socket("143.248.135.60", 44450); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

System.out.println("writing"); 
bw.write(str); 
bw.newLine(); 
bw.flush(); 
System.out.println("wrote"); 

System.out.println("reading"); 
StringBuffer sb = new StringBuffer(); 
String line; 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println("read"); 

br.close(); 
bw.close(); 
socket.close(); 

Les deux parties arrêter après l'impression "lecture".

Qu'est-ce qui ne va pas avec mes codes?

Nous vous remercions de votre aide à l'avance!

Répondre

1

Vos blocs d'application sur le site des serveurs à ce point:

while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 

Vos serveurs lignes de lecture jusqu'à ce que le flux source se ferme (br.readLine() retournera null lorsque la fin du cours d'eau a été atteint). Mais cela n'arrive pas. Il semble que Vous êtes en train attendant juste une seule ligne ici, donc essayer au lieu de la boucle du côté serveur:

System.out.println("reading"); 
String line = br.readLine(); 
System.out.println("read"); 

Maintenant sur la boucle de nom sur le côté client: Le serveur fermera les flux et la prise immédiatement après avoir écrit ses propres données. Donc, br.readLine() renverra null côté client après la lecture de la première ligne. Donc, il fera ce que vous attendez. Mais cela fonctionnera aussi si vous remplacez le code comme je l'ai suggéré pour le côté serveur.

Espérons que ça aide.


Modifier basé sur la clarification de la question (il faut lire plusieurs lignes):

La meilleure façon en fonction de votre travail est d'utiliser un caractère de contrôle comme « Fin de transmission » (0x04 sur ASCII).

Code client:

System.out.println("writing"); 
bw.write("Hello"); 
bw.newLine(); 
bw.write("World"); 
bw.newLine(); 
bw.write(0x04); // EOT control character 
bw.newLine(); // This is needed for BufferedReader/Writer - even if we've used a EOT 
bw.flush(); 
System.out.println("wrote"); 

Suite dans le prochain Commend ...

Code Serveur:

while ((line = br.readLine()) != null && !(line.length() > 0 && line.charAt(0) == 0x04)) { 
    sb.append(line).append(System.lineSeparator()); 
} 

Si vous ne l'utilisez ASCII ou UTF8 s'il vous plaît vérifier votre encodage utilisé pour choisir le bon caractère de contrôle.

+0

Et si j'ai besoin de lignes? Stanford analyseur peut analyser un document, une liste de lignes. –

+0

J'ai modifié ma réponse. – maxikg