2011-10-30 18 views
0

私はちょうどソケットプログラミングを始めました。私はJavaのEchoサーバで作業しています。私がしたいことの1つは、TCPとUDPの両方でサーバーを実装することです。クライアントは、実行時に使用するプロトコルをで選択できるようにします。Java Echo Server 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(); 
} 
} 
+0

http://stackoverflow.com/questions/2819274/listening-for-tcp-and-udp-requests-on-the-same-port –

+0

これはあまりにも広範で、ここでは答えられませんFAQの「回答する本を書く」を参照)。 –

+0

クライアントコードに問題がある場合は、サーバーコードを教えてください。 –

答えて

0

使用せずにJavaで条件分岐を行うには(私が知っている)方法はありませんifステートメント。あなたのelse-ifが動作していなかった場合は、条件を間違って確認していました。 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?"); 
} 
+0

私はこれを試してみました...しかし、サーバーソケットを作成するコードを置くと、ブランチの場合はブロック全体をスキップしてelseブランチを実行します。 – LearnHK

+0

あなたは何からコードを実行していますか?投稿したコードを実行するとどうなりますか? – VolatileDream

+0

私はクライアント側のコードを追加しました。私の質問は:私は、プロトコルの選択肢の分岐条件を作成し、それぞれのブランチにTCPとUDPプロトコルのコードを含めることができますか? – LearnHK

0

、あなたは同じポートにあなたのTCPのServerSocketとUDPのServerSocketをバインドすることができるはずです。それぞれのソケットを扱う別々のスレッドを持つ必要があります。 UDPサーバーソケットの記述方法については、this tutorial

0

さらに、別のポートのアプリケーションで2つの別個のソケットを開く必要があります。

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

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

お客様の歓迎です。

+0

ありがとうmkploeppner。問題は...私はUDPを個別に実装する方法を知っていますが、どちらのプロトコルを選択して動作させるかをクライアント側で設定する方法はわかりません。 – LearnHK

+0

iirc、udpクライアントは代わりにhttp://download.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.htmlを使用します。 –

関連する問題