1

我编写了两个小型 Java 程序:一个 TCP 客户端,它从一个 txt 文件发送多行数据,一个 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();
      }

    }

客户代码:

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

}

问题出在哪里?

编辑:我已按照建议编辑了代码。现在什么都收不到

4

2 回答 2

2

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

  1. DataOutputStream.writeUTF()和读DataInputStream.readUTF()

  2. println()(由多个 I/O 类提供)或write()print()(由多个 I/O 类提供)写入,后跟BufferedWriter.newline(), 或

  3. 用 写ObjectOutputStream.writeObject()和读ObjectInputStream.readObject()

等等。使用一个 API 编写和使用非对称 API 读取是行不通的。

于 2012-06-28T11:05:51.283 回答
0

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

只需在end of line您发送的每个字符串中添加一个,它应该可以工作。

于 2012-06-28T11:44:00.583 回答