我正在使用Java IO/NIO。我爲TCP和UDP(Java IO)實現了許多服務器/客戶端應用程序,並且最近開始使用NIO。Java IO/NIO:服務器可以在多個端口上偵聽嗎?
我想寫一個服務器(TCP或UDP),它執行多個任務,同時收聽多個端口。我一直實現服務器一次收聽單個端口,而我的問題可能違背了最佳實踐。但有什麼辦法可以讓服務器在多個端口上接受客戶端?像單個服務器中的多臺服務器一樣?
我不是在尋找代碼,只是程序的概念/設計,如果可能的話。
服務器:
public class ServerAll implements Runnable {
private Socket connection;
ServerAll(Socket s) {
this.connection = s;
}
public static void main(String[] args) {
int port1 = 7777;
int port2 = 8888;
int port3 = 9999;
int count = 0;
try{
ServerSocket server1 = new ServerSocket(port1);
ServerSocket server2 = new ServerSocket(port2);
ServerSocket server3 = new ServerSocket(port3);
System.out.println("Server Initialized");
while (true) {
Socket con1 = server1.accept();
Runnable runnable1 = new ServerAll(con1);
Thread thread1 = new Thread(runnable1);
thread1.start();
Socket con2 = server2.accept();
Runnable runnable2 = new ServerAll(con2);
Thread thread2 = new Thread(runnable2);
thread2.start();
Socket con3 = server3.accept();
Runnable runnable3 = new ServerAll(con3);
Thread thread3 = new Thread(runnable3);
thread3.start();
}
}
catch (Exception e) {}
}
public void run() {
try {
DataInputStream in = new DataInputStream(connection.getInputStream());
String clientMsg = in.readUTF();
String replyMsg = null;
if(clientMsg.equalsIgnoreCase("1")){
String msg = "Server Reply on 1";
replyMsg=msg;
}
if(clientMsg.equalsIgnoreCase("2")){
String msg = "Server Reply on 2";
replyMsg=msg;
}
if(clientMsg.equalsIgnoreCase("3")){
String msg = "Server Reply on 3";
replyMsg=msg;
}
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeUTF(replyMsg);
}
catch (Exception e) {
System.out.println(e);
}
finally {
try {
connection.close();
}
catch (IOException e){}
}
}
客戶:
public class ClientTcpE {
public static void main(String[] args) {
String host = "localhost";
int port = 7777;
System.out.println("SocketClient initialized");
try {
InetAddress address = InetAddress.getByName(host);
Socket client = new Socket(address, port);
System.out.println("Just connected to "+ client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("1");
System.out.println("Just sent msg to server");
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
String serverMsg = in.readUTF();
System.out.println("server says : "+serverMsg);
client.close();
}catch(IOException e){
e.printStackTrace();
}
}
NIO什麼?什麼UDP?除了TCP和java.net這裏什麼都沒有。 – EJP
代碼稍後添加,基本上問題不限於TCP(在提供的代碼中使用)。 –