0

ソケット プログラミングを始めたばかりで、Java で Echo サーバーに取り組んでいます。私がやりたいことの 1 つは、サーバーを TCP と UDP の両方で実装しクライアントが実行時に使用するプロトコルを選択できるようにすることです。

これは初心者の質問ですが、ユーザーがこのオプションでTCP または UDP プロトコルを選択できるようにするにはどうすればよいですか? スキャナー入力からのプロトコル選択に分岐する if-else を最初に入れてみましたが、選択に関係なく両方のブロックをスキップするだけですか?

ありがとう。

TCP エコー サーバーを実装しました。

public class EchoServer 
{ 
public static void main(String[] args) throws IOException 
   { 
      ServerSocket serverSocket = null; 

      try{ 
         serverSocket = new ServerSocket(10007); 
         } 
      catch (IOException e) 
      { 
      System.err.println("Could not listen on port: 10007."); 
      System.exit(1); 
      } 

     Socket clientSocket = null; 
     System.out.println ("Waiting for connection.....");

     try { 
         clientSocket = serverSocket.accept(); 
     } 
     catch (IOException e) 
     { 
         System.err.println("Accept failed."); 
         System.exit(1); 
     } 

    System.out.println ("Connection successful");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
                                  true); 

    BufferedReader in = new BufferedReader( 
        new InputStreamReader( clientSocket.getInputStream())); 

   String cAddress = "";
   String inputLine; 

   cAddress = clientSocket.getInetAddress().toString();

   while ((inputLine = in.readLine()) != null) 
       { 
        System.out.println ("Server: " + inputLine + "  " + cAddress + " "); 
        out.println(inputLine + " " + cAddress); 

        if (inputLine.equals("bye"))            
            break;  
       } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 
  } 
} 

そしてクライアント側:

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class EchoClient {
    public static void main(String[] args) throws IOException {

    Scanner s = new Scanner(System.in);  
    String serverHostname;
    System.out.println("Enter an IP value: ");
    serverHostname = s.next();

    //String serverHostname = new String ("127.0.0.1");

    if (args.length > 0)
       serverHostname = args[0];
    System.out.println ("Attemping to connect to host " +
    serverHostname + " on port 10007.");

    Socket echoSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;

    try {
        echoSocket = new Socket(serverHostname, 10007);
        out = new PrintWriter(echoSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                                    echoSocket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: " + serverHostname);
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for "
                           + "the connection to: " + serverHostname);
        System.exit(1);
    }

BufferedReader stdIn = new BufferedReader(
                               new InputStreamReader(System.in));
String userInput;

    System.out.print ("input: ");
while ((userInput = stdIn.readLine()) != null) {
    out.println(userInput);
    System.out.println("echo: " + in.readLine());
        System.out.print ("input: ");
}

out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
4

3 に答える 3

0

Ifステートメントを使用せずにJavaで条件を実行する方法(私が知っている)はありません。あなたの他の場合-もし機能していなかったら、あなたは状態を間違ってチェックしていました。Javaで文字列を比較するには、String.equals(String)を使用しますが、==は使用できません。

標準入力でもう一度使用してみてください。ただし、簡単なことをしてください。好き:

Scanner scan = new Scanner( System.in );
System.out.println( "use tcp?" );
String in = scan.nextLine();
if( in.indexOf( "y" ) >= 0 || in.indexOf( "Y" ) >= 0 ){
    System.out.println("using tcp");
}else{
    System.out.println("not using tcp, use udp instead?");
}
于 2011-10-30T18:38:51.903 に答える
0

ソケットレベルでそれがどのように可能かを知りたい場合は、TCP サーバーソケットと UDP サーバーソケットを同じポートにバインドできる必要があります。各ソケットを処理する個別のスレッドが必要になります。UDP サーバーソケット (DatagramSocket と呼ばれる) の書き方については、このチュートリアルを確認してください。

于 2011-10-30T18:43:24.540 に答える
0

アプリケーションで、ポートが異なる 2 つの別個のソケットを開く必要があります。それに加えて、Java では個別のスレッドが必要です。その使用法は、多くのハウツーやチュートリアルで説明されています。

ソケットの作成には、UDP には DatagramSocket を、TCP には ServerSocket を使用します。何をしたいのかわかりませんが、UDP でのデータ損失を自分で処理する必要があることを知っておく必要があります。UDP は、ストリーミング オーディオまたはビデオで一般的に使用されます。

アプリケーションのニーズを検証します。詳細については、http://en.wikipedia.org/wiki/User_Datagram_Protocol#Comparison_of_UDP_and_TCPを参照してください。

どういたしまして。

于 2011-10-30T19:20:29.867 に答える