Java Echo服务器TCP*和UDP实现?
我刚刚开始socket编程,正在用Java开发一个Echo服务器。我想做的事情之一是在TCP和UDP中实现服务器,并允许客户端选择在运行时使用哪个协议 这是一个noob问题,但我如何允许用户使用此选项选择TCP或UDP协议?我尝试在开始时输入if-else,它从扫描仪输入的协议选择分支,但不管选择如何,它都跳过了这两个块 谢谢 我已经实现了TCP echo服务器:Java Echo服务器TCP*和UDP实现?,java,sockets,tcp,udp,echo-server,Java,Sockets,Tcp,Udp,Echo Server,我刚刚开始socket编程,正在用Java开发一个Echo服务器。我想做的事情之一是在TCP和UDP中实现服务器,并允许客户端选择在运行时使用哪个协议 这是一个noob问题,但我如何允许用户使用此选项选择TCP或UDP协议?我尝试在开始时输入if-else,它从扫描仪输入的协议选择分支,但不管选择如何,它都跳过了这两个块 谢谢 我已经实现了TCP echo服务器: public class EchoServer { public static void main(String[] args)
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();
}
}
据我所知,如果不使用If语句,就无法在Java中使用条件语句。如果你的else If不起作用,那么你检查的条件是错误的。要在java中比较字符串,请使用String.equals字符串,不能使用== 尝试在标准输入上再次使用它,但只需做一些简单的事情。 比如:
如果您想知道如何在套接字级别实现这一点,您应该能够将TCP serversocket和UDP serversocket绑定到同一端口。您必须有单独的线程来处理每个套接字。有关如何编写名为DatagramSocket的UDP服务器套接字的说明,请检查。您需要在应用程序中打开两个具有不同端口的单独套接字。 除此之外,在Java中还需要单独的线程,这一用法在很多操作指南和教程中都有描述 要创建套接字,请将DatagramSocket用于UDP,将ServerSocket用于TCP。我不知道,你想做什么,但你必须知道你必须自己处理UDP中的数据丢失。UDP通常用于流式音频或视频,在流式音频或视频中,会丢失一些数据,这是不重要的 验证您的应用程序需求。有关更多信息,请参阅
欢迎您。这太宽泛了,无法回答。这里属于“需要写一本书来回答常见问题”部分。如果问题出在客户端代码上,为什么不向我们展示服务器代码?我已经尝试过了。。。但是,当我把创建服务器套接字等的代码放在if分支中时,它只是跳过整个块并执行else分支?执行我发布的代码时会发生什么?我已经为客户端添加了代码。我的问题是:我是否可以为协议选择创建一个分支条件,然后在相应的分支中包含TCP和UDP协议的代码?是的,这通常是使用函数完成的。您将有一个名为doUDP int port的函数,它执行udp,另一个名为doTCPint port的函数执行tcp。然后根据if语句调用一个或另一个。我尝试了这个,但当我这样做时,它似乎只是跳过了doTCP函数的内容:使用tcp?如果不使用tcp,请改用udp?谢谢mkploeppner。问题是。。。我知道如何单独实现UDP,但我不知道如何设置客户端以选择任一协议并使其工作。iirc,UDP客户端将使用
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?");
}