1

私は2つの小さなJavaプログラムを作成しました。txtファイルから多くの行のデータを送信するTCPクライアントと、接続を受け入れて行ごとに受信するTCPサーバーです。

動作しますが、送信が終了してクライアントがソケットを閉じると、サーバーはすべての回線をまとめて受信します。クライアントに送信される各行の後にフラッシュを使用しているため、理由がわかりません。これは、このような状況を回避するためであると常に考えていました。

test.txtファイルに123 ... 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()

など1つのAPIでの書き込みと、非対称APIでの読み取りは機能しません。

于 2012-06-28T11:05:51.283 に答える
0

問題は読み取りまたは書き込みではありません(または少なくとも明示的にではありません)。問題はあなたのひもです。input.readLine()を削除しend of lineます。これは、送信する文字列が単なる数字であることを意味します。サーバー側では、多くの文字列を受け取りますが、ストリームが閉じて。を送信するまで、文字列が到着しないinFromClient.readLine()まで待機します。end of lineend of file

end of line送信するすべての文字列にを追加するだけで、機能するはずです。

于 2012-06-28T11:44:00.583 に答える