多个同时也是客户端的服务器 - JAVA 中的通信
multiple servers that are also clients - communacation in JAVA
我在 JAVA 中使用套接字,我有 3 个同时作为客户端的服务器。我想让他们交换一些信息。
这就是我想要创建的:
输入应该是这样的:
服务器启动于:/172.16.2.22:8080
首先的信息,
第二个信息,
第三的信息,
服务器启动于:/172.16.2.22:8081
首先的信息,
第二个信息,
第三的信息,
服务器启动于:/172.16.2.22:8082
首先的信息,
第二个信息,
第三的信息,
但由于某种原因,它只显示当前也是服务器的客户端的信息。
所以我得到了这个结果:
服务器启动于:/172.16.2.22:8080
第一个信息
服务器启动于:/172.16.2.22:8081
第二个
的信息
服务器启动于:/172.16.2.22:8082
第三名的信息
这就是我启动代码的方式,服务器:
private void startServer() {
ServerSocket providerSocket = null;
BufferedReader in = null;
try {
InetAddress addr = InetAddress.getByName(this.serv.getIP());
providerSocket = new ServerSocket(this.serv.getPort(), 50, addr);
System.out.println("ServThread started at:" + addr + ":" + this.serv.getPort());
// create a new thread object
Thread t = new ClientHandler(providerSocket);
// Invoking the start() method
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
这是我用于 threads 的 ClientHandler:
class ClientHandler extends Thread {
final ServerSocket s;
// Constructor
public ClientHandler(ServerSocket s) {
this.s = s;
}
public void run() {
Socket s = null;
try {
s = this.s.accept();
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
// receive the answer from client
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最后是我的 客户端 ,它们也是服务器。我正在使用 for 循环读取包含我服务器的所有 IP、PORTS 的 txt:
private void startSender() {
for (MyServers servs : ServersTXT.fetchTXTofServers()) {
BufferedWriter out;
try (Socket s = new Socket(servs .getIP(), servs .getPort())) {
out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write(servs.info());
out.newLine();
out.flush();
} catch (ConnectException err) {
// Connection failed because not all servers on the txt are up
} catch (IOException e) {
e.printStackTrace();
}
}
}
我花了一些时间来了解您的架构,并设法找出问题所在。 ClientHandler 确实是错误的,因为 connection.accept() 部分在 while 循环之外并且连接丢失。您试图实现的架构具有以下规则。获得连接后,生成一个线程来处理此连接,不仅一次,而且连续不断。只要将上面的代码放在 inside 运行 函数的 ClientHandler thread.
ServerSocket providerSocket;
Socket connection;
InetAddress addr;
try {
addr = InetAddress.getByName(this.broker.getIP());
providerSocket = new ServerSocket(this.broker.getPort(), 50, addr);
while (true) {
connection = providerSocket.accept();
ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
System.out.println(n.readUTF());
in.close();
out.close();
connection.close();
}
} catch (Exception err) {
err.printStackTrace();
}
另外,在sender部分,在try块,你尝试执行括号里的代码,通常try块没有括号,在我的代码中我删除了它。
我在 JAVA 中使用套接字,我有 3 个同时作为客户端的服务器。我想让他们交换一些信息。
这就是我想要创建的:
输入应该是这样的:
服务器启动于:/172.16.2.22:8080 首先的信息, 第二个信息, 第三的信息,
服务器启动于:/172.16.2.22:8081 首先的信息, 第二个信息, 第三的信息,
服务器启动于:/172.16.2.22:8082 首先的信息, 第二个信息, 第三的信息,
但由于某种原因,它只显示当前也是服务器的客户端的信息。
所以我得到了这个结果:
服务器启动于:/172.16.2.22:8080 第一个信息
服务器启动于:/172.16.2.22:8081 第二个
的信息服务器启动于:/172.16.2.22:8082 第三名的信息
这就是我启动代码的方式,服务器:
private void startServer() {
ServerSocket providerSocket = null;
BufferedReader in = null;
try {
InetAddress addr = InetAddress.getByName(this.serv.getIP());
providerSocket = new ServerSocket(this.serv.getPort(), 50, addr);
System.out.println("ServThread started at:" + addr + ":" + this.serv.getPort());
// create a new thread object
Thread t = new ClientHandler(providerSocket);
// Invoking the start() method
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
这是我用于 threads 的 ClientHandler:
class ClientHandler extends Thread {
final ServerSocket s;
// Constructor
public ClientHandler(ServerSocket s) {
this.s = s;
}
public void run() {
Socket s = null;
try {
s = this.s.accept();
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
// receive the answer from client
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最后是我的 客户端 ,它们也是服务器。我正在使用 for 循环读取包含我服务器的所有 IP、PORTS 的 txt:
private void startSender() {
for (MyServers servs : ServersTXT.fetchTXTofServers()) {
BufferedWriter out;
try (Socket s = new Socket(servs .getIP(), servs .getPort())) {
out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write(servs.info());
out.newLine();
out.flush();
} catch (ConnectException err) {
// Connection failed because not all servers on the txt are up
} catch (IOException e) {
e.printStackTrace();
}
}
}
我花了一些时间来了解您的架构,并设法找出问题所在。 ClientHandler 确实是错误的,因为 connection.accept() 部分在 while 循环之外并且连接丢失。您试图实现的架构具有以下规则。获得连接后,生成一个线程来处理此连接,不仅一次,而且连续不断。只要将上面的代码放在 inside 运行 函数的 ClientHandler thread.
ServerSocket providerSocket;
Socket connection;
InetAddress addr;
try {
addr = InetAddress.getByName(this.broker.getIP());
providerSocket = new ServerSocket(this.broker.getPort(), 50, addr);
while (true) {
connection = providerSocket.accept();
ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
System.out.println(n.readUTF());
in.close();
out.close();
connection.close();
}
} catch (Exception err) {
err.printStackTrace();
}
另外,在sender部分,在try块,你尝试执行括号里的代码,通常try块没有括号,在我的代码中我删除了它。