2012-06-28 1 views
1

Я написал две небольшие программы Java: клиент TCP, который отправляет много строк данных из файла txt, и TCP-сервер, который принимает соединение и получает строку за строкой ,Java-сервер TCP получил каждую строку от Клиента, когда все они отправлены

Он работает, но сервер получает все линии вместе, когда передача завершена, и клиент закрывает сокет. Я не понимаю, почему, потому что я использую флеш после каждой строки, отправленной в Клиент, и я всегда думал, что это должно избежать такой ситуации.

Если файл test.txt содержит номера 1 2 3 ... 10, каждый в новой строке, вывод сервера: «12345678910», а затем в новой строке он записывает в консоли «null».

Серверный код:

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

class ServidorTCP { 

    private String HOST; 
    static final int PUERTO = 20001; 

     public ServidorTCP() { 
     try{ 
      ServerSocket skServidor = new ServerSocket(PUERTO); 
       Socket skCliente = skServidor.accept(); 
      DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(skCliente.getInputStream())); 

      while(true){ 
       String lineaLeida = inFromClient.readUTF(); 
       if(lineaLeida.equals("END")) break; 
       System.out.println(lineaLeida); 
      } 
       inFromClient.close(); 
       skCliente.close(); 
      skServidor.close(); 
      System.out.println("Transmission ended"); 
     } catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 
     } 


     public static void main(String[] arg) { 
     new ServidorTCP(); 
     } 

    } 

Cliente код:

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

class ClienteTCP { 

    static final String HOST = "192.168.1.201"; 
    static final int PUERTO = 20001; 

    public ClienteTCP() { 
    try{ 
     Socket skCliente = new Socket(HOST, PUERTO); 
     if(skCliente.isConnected()) System.out.println("Connected!"); 
     DataOutputStream outToServer = new DataOutputStream(skCliente.getOutputStream()); 

     File testFile = new File("test.txt"); 
     BufferedReader input = new BufferedReader(new FileReader(testFile)); 
     String line; 
     while((line=input.readLine())!=null) { 
     if(!line.endsWith("\n")) line = line + "\n"; 
     System.out.println("Sending: " + line); 
     outToServer.writeBytes(line); 
     outToServer.flush(); 
     Thread.currentThread().sleep(1000); 
     } 
     outToServer.writeBytes("END"); 
     input.close(); 
     outToServer.close(); 
     skCliente.close(); 
    } catch(Exception e) { 
     System.out.println(e.getMessage()); 
    } 
    } 


    public static void main(String[] arg) { 
    new ClienteTCP(); 
    } 

} 

Где проблема?

EDIT: Я отредактировал код, как было предложено. Теперь не получает nohing

ответ

2

Дело в том, что ваш код не работает вообще, не говоря уже о до или после закрытия сокета. Вы пишете writeUTF() и читаете readLine(). Это не работает. Вам нужно:

  1. записи с DataOutputStream.writeUTF() и читать с DataInputStream.readUTF()

  2. записи с println() (поставляется несколько классов ввода/вывода), или write() или print() (поставляется несколько классов ввода/вывода), затем BufferedWriter.newline(), или

  3. написать письмо с ObjectOutputStream.writeObject() и прочитать с ObjectInputStream.readObject().

И т.д. Запись на один API и чтение с несимметричным API не работает.

+1

Причина в том, что я попытался использовать «DataInputStream in = new DataInputStream (socket.getInputStream())», а при компиляции он говорит, что он устарел: | Что следует использовать тогда? –

+0

@RomanRdgz См. Пункты (1), (2) или (3) в моем ответе. – EJP

+0

Я использую теперь «DataInputStream inFromClient = новый DataInputStream (новый BufferedInputStream (skCliente.getInputStream())), а затем« String lineaLeida = inFromClient.readUTF() ». Проблема все еще происходит –

0

Проблема не в чтении или записи (или, по крайней мере, не в явном виде). Проблема заключается в вашей строке. input.readLine() удаляет end of line, что означает, что строка, которую вы отправляете, - это просто номер. На стороне сервера вы получаете много строк, но inFromClient.readLine() ждет, пока не получит end of line, который никогда не прибывает до тех пор, пока поток не закроется и не отправит end of file.

Просто добавьте end of line в каждую строку, которую вы отправляете, и она должна работать.

+0

Я попытался добавить \ n в конец каждой строки, которую я отправляю, но все равно происходит то же самое в принимающей стороне –