2014-02-10 5 views
0

привет Я использую этот метод, чтобы прочитать сообщение:Java читает сообщение из сокета не посылает полное сообщение

public String readMessage() { 
    int read = -1; 
    byte[] buffer = new byte[5*1024]; 
    byte[] redData; 
    try { 
     while ((read = this.session.getInputStream().read(buffer)) > -1) { 
      redData = new byte[read]; 
      System.arraycopy(buffer, 0, redData, 0, read); 
      return new String(redData,"UTF-8"); 

     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

И когда я что-то вроде писать «? Привет, как ты сегодня»

Response (Точный формат, в том числе новых линий):

[/127.0.0.1:54930]:  
[/127.0.0.1:54930]: are 

[/127.0.0.1:54930]: you 

[/127.0.0.1:54930]: today? 

То, как я читал сообщения чата, первый проверить, какой пакет было предложено, если тип пакета был 0, то я получаю экземпляр packethandler и передать объект клиента к обработке пакета чата, который будет читать сообщение здесь, как это:

public void startClientService() throws IOException { 
    while(true) { 
     int packetType = this.in.read(); 
     packets.getPacket(packetType); 
    } 
} 
public void getPacket(int packetType) { 
    switch (packetType) { 
    case 0: 
     chat.processPacket(this.client); 
     break; 
    } 
} 

и пакет чата:

@Override 
public void processPacket(Session c) { 
    String clientMessage = c.readMessage(); 
    System.out.println("[" + c.getStream().getRemoteSocketAddress() + "]: " + clientMessage.toString()); 
} 

И там происходит сообщение печати.

Почему он печатает части сообщений в новых строках? даже полное сообщение.

Это мой клиент:

public static void main(String[] args) throws UnknownHostException, IOException { 
    Socket socket = new Socket("127.0.0.1", 43594); 
    Scanner r = new Scanner(System.in); 
    PrintWriter out = new PrintWriter(socket.getOutputStream()); 
    String input; 
    while(true) { 
     input = r.next(); 
     if (input != null) { 
      sendMessage(input, out); 
     } 
    } 

} 

public static void sendMessage(String message, PrintWriter out) { 
    out.write(0); 
    out.flush(); 
    out.write(message + "\n"); 
    out.flush(); 
} 

Спасибо.

Сессия:

public class Session extends Thread implements Runnable { 

    private Socket session; 
    private Client client; 
    private PrintWriter out; 
    private BufferedReader in; 
    private PacketHandler packets; 

    public Session(Socket session) { 
     this.session = session; 
     this.client = new Client(this); 
     try { 
      this.setStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     this.packets = new PacketHandler(this); 
     System.out.println("[New session created]: " + session.getRemoteSocketAddress()); 
    } 

    public void run() { 
     try { 
      this.startClientService(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Socket getStream() { 
     return this.session; 
    } 

    public void setStream() throws IOException { 
     this.out = new PrintWriter(this.session.getOutputStream()); 
     this.in = new BufferedReader(new InputStreamReader(this.session.getInputStream())); 
    } 

    public Client getClient() { 
     return this.client; 
    } 

    public String readMessage() { 
     int read = -1; 
     byte[] buffer = new byte[5*1024]; 
     byte[] redData; 
     try { 
      while ((read = this.session.getInputStream().read(buffer)) > -1) { 
       redData = new byte[read]; 
       System.arraycopy(buffer, 0, redData, 0, read); 
       return new String(redData,"UTF-8"); 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public void startClientService() throws IOException { 
     while(true) { 
      int packetType = this.in.read(); 
      packets.getPacket(packetType); 
     } 
    } 

    public void destruct() throws IOException { 
     this.session.close(); 
     System.out.println("Session killed"); 
    } 

} 
+0

Какой у вас объект сеанса? – UVM

+0

@UVM Добавлен класс для сеанса. – Artemkller545

ответ

1

выглядит, как вы возвращаетесь, как только вы получите некоторые данные из потока.

while ((read = this.session.getInputStream().read(buffer)) > -1) { 
      redData = new byte[read]; 
      System.arraycopy(buffer, 0, redData, 0, read); 
      return new String(redData,"UTF-8"); 

     } 

Считывание данных полностью и сделать строковый объект из него и вернуть его

BufferedReader br = new BufferedReader(new InputStreamReader(this.session.getInputStream())); 
String msg = br.readLine(); 
br.close(); 
    return msg; 

попробовать этот путь. Это даст вам целые данные в буфер и может вернуться в виде строки строки. Нет необходимости в цикле

+0

Ну теперь он даже не получил сообщение (ничего не печатает) – Artemkller545

+0

Я прочитал ваше редактирование, теперь он отправляет его по строкам. – Artemkller545

+0

хорошо !!! удачи.... – UVM

0

Объем данных, возвращаемых с одного вызова на чтение, не имеет отношения к тому, как данные делятся при отправке. Одна передача может привести к любому количеству чтений, а несколько отправлений могут быть объединены в одно чтение.

Смежные вопросы