[英]Java Echo Server TCP *and* UDP implementation?
我刚刚开始套接字编程,并且正在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();
}
}
如果不使用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?");
}
如果您想知道套接字级别的可能性,则应该能够将TCP服务器套接字和UDP服务器套接字绑定到同一端口。 您将必须有单独的线程来处理每个套接字。 有关如何编写UDP服务器套接字(称为DatagramSocket)的说明,请参阅本教程 。
您需要在应用程序中打开两个具有不同端口的单独的套接字。 除此之外,您还需要Java中的单独线程,许多用法和教程中都介绍了用法。
对于套接字创建,对于UDP使用DatagramSocket,对于TCP使用ServerSocket。 我不知道要做什么,但是您必须知道必须自己处理UDP中的数据丢失。 UDP通常用于流音频或视频(不重要)以丢失一些数据。
验证您的应用程序需求。 有关更多信息,请参见http://en.wikipedia.org/wiki/User_Datagram_Protocol#Comparison_of_UDP_and_TCP 。
别客气。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.