【问题标题】:Java Echo Server TCP *and* UDP implementation?Java Echo Server TCP *和* UDP实现?
【发布时间】:2011-12-18 07:30:04
【问题描述】:

我刚刚开始进行套接字编程,并且正在使用 Java 开发 Echo 服务器。我想做的一件事是在 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();
}
}

【问题讨论】:

  • 这太宽泛了,无法在这里回答(属于常见问题解答的“需要写一本书来回答”部分)。
  • 如果问题出在客户端代码上,为什么不向我们展示服务器代码?

标签: java sockets tcp udp echo-server


【解决方案1】:

如果不使用 If 语句,就无法(据我所知)在 Java 中执行条件。如果您的 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?");
}

【讨论】:

  • 我试过这个......但是当我将创建服务器套接字的代码放入 if 分支时,它只是跳过整个块并执行 else 分支。
  • 你从什么地方运行代码?当你执行我发布的代码时会发生什么?
  • 我已经为客户端添加了代码。我的问题是:我可以为协议选择创建一个分支条件,然后在各自的分支中包含 TCP 和 UDP 协议的代码吗?
  • 是的,你可以,这通常是使用函数来完成的。您将有一个名为 doUDP( int port ) 之类的函数来执行 udp,而另一个名为 doTCP(int port) 的函数将执行 tcp。然后根据 if 语句调用其中一个或另一个。
  • 我试过这个,但似乎当我这样做时它只是跳过了 doTCP() 函数的内容:使用 tcp? y 不使用 tcp,改用 udp?
【解决方案2】:

如果您想知道在套接字级别是如何实现的,您应该能够将您的 TCP serversocket 和 UDP serversocket 绑定到同一个端口。您必须有单独的线程处理每个套接字。有关如何编写 UDP 服务器套接字的说明(称为 DatagramSocket 检查this tutorial

【讨论】:

    【解决方案3】:

    您需要在应用程序中打开两个具有不同端口的独立套接字。 除此之外,您还需要在 Java 中使用单独的线程,其用法在很多操作指南和教程中都有描述。

    对于 Socket 创建,对 UDP 使用 DatagramSocket,对 TCP 使用 ServerSocket。我不知道,你想做什么,但你必须知道你必须自己处理 UDP 中的数据丢失。 UDP 常用于流式传输音频或视频,在这种情况下丢失一些数据并不重要。

    验证您的应用程序需求。如需更多信息,请参阅http://en.wikipedia.org/wiki/User_Datagram_Protocol#Comparison_of_UDP_and_TCP

    欢迎您。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2019-08-20
    • 1970-01-01
    • 2014-07-13
    • 2011-07-16
    • 2016-11-14
    • 2015-11-12
    相关资源
    最近更新 更多