2011-10-30 4 views
0

방금 ​​소켓 프로그래밍을 시작했고 Java의 Echo 서버에서 작업하고 있습니다. 내가하고자하는 일 중 하나는 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

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 서버 소켓 작성 방법 (DatagramSocket 체크) this tutorial

0

이외에 Java에서 별도의 Threads가 필요합니다.이 사용법은 다음에서 설명합니다.

소켓 생성을 위해서는 UDP 용 DatagramSocket과 TCP 용 ServerSocket을 사용하십시오. 당신이 무엇을하고 싶은지는 모르겠지만 UDP에서 dataloss를 처리해야한다는 것을 알아야합니다. UDP는 오디오 또는 비디오를 스트리밍 할 때 일반적으로 사용되는 데이터로 손실되는 경우가 있습니다.

응용 프로그램의 유효성 확인 n 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을 사용합니다. –