Java Echo Server TCP * и * UDP реализация?
Я только начал программирование сокетов, и я работаю на сервере Echo в Java. Одна из вещей, которые я хотел бы сделать, - реализовать сервер в 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();
}
}
3 ответа
Нет способа (который я знаю) выполнять условные выражения в Java без использования оператора 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, использование которых описано во многих инструкциях и руководствах.
Для создания сокета используйте DatagramSocket для UDP и ServerSocket для TCP. Я не знаю, что вы хотите сделать, но вы должны знать, что вы должны обрабатывать потери данных в UDP для себя. UDP обычно используется для потоковой передачи аудио или видео, где это не критично, для потери некоторых данных.
Проверьте ваши потребности приложения. Для получения дополнительной информации см. http://en.wikipedia.org/wiki/User_Datagram_Protocol.
Пожалуйста.