当所有这些服务器都被发送时,Java TCP服务器从客户端收到每一行

时间:2012-06-28 10:58:59

标签: java sockets tcp flush

我写了两个小的java程序:一个TCP客户端,它从一个txt文件发送许多行数据,一个TCP服务器接受连接并逐行接收。

它可以工作,但是当传输结束并且客户端关闭套接字时,服务器会一起接收所有线路。我不明白为什么,因为我在每一行发送到客户端之后都使用了flush,我一直认为这是为了避免这种情况。

如果我的test.txt文件内容为数字1 2 3 ... 10,每一行都在新行中,Server的输出为:“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();
      }

    }

客户代码:

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();
  }

}

问题出在哪里?

编辑:我已根据建议编辑了代码。现在没有收到任何感谢

2 个答案:

答案 0 :(得分:2)

事实是你的代码根本不起作用,更不用说套接字关闭之前或之后了。您正在撰写writeUTF()并使用readLine().阅读这不起作用。你需要:

  1. 使用DataOutputStream.writeUTF()撰写并使用DataInputStream.readUTF()

  2. 阅读
  3. 使用println()(由多个I / O类提供)或write()print()(由多个I / O类提供),然后是{{1 },或

  4. 使用BufferedWriter.newline()撰写,并使用ObjectOutputStream.writeObject()阅读。

  5. 等。使用一个API编写并使用非对称API进行读取并不起作用。

答案 1 :(得分:0)

问题不在于阅读或写作(或至少没有明确说明)。问题是你的字符串。 input.readLine()删除end of line,这意味着您发送的字符串只是数字。在服务器端,您会收到很多字符串,但是inFromClient.readLine()等待直到它获得end of line,它永远不会到达,直到流关闭并发送end of file

只需在您发送的每个字符串中添加end of line即可。