Java 套接字 - 如何从客户端 c1 向服务器 s 发送消息,然后从 s 向客户端 c2 发送消息
Java sockets - How to send a message from client c1 to server s, and then from s to client c2
我有这种情况:
2 个客户:c1,c2
1 个服务器:s
我需要从c1向s发送一条消息m,然后我需要s向c2发送一条通知消息。
我正在使用 Java 套接字。
我的代码非常简单,可以从 c1 向 s 发送消息:
Server
try {
ServerSocket listener = new ServerSocket(9090);
System.out.println("Server ready to accept connections");
while (true) {
Socket socket = listener.accept();
try {
BufferedReader in =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
Scanner x = new Scanner(in);
System.out.println("Client has sent :");
while (x.hasNextLine()){
System.out.println(x.nextLine());
}
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println("OK");
out.flush();
} catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
finally
{
socket.close();
}
}
}catch (Exception ex){
System.out.println(ex.getLocalizedMessage());
}
Client
Socket s = null;
try {
s = new Socket("localhost", 9090);
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
try {
PrintWriter out =
new PrintWriter(s.getOutputStream(), true);
out.println("Random Text");
out.flush();
s.shutdownOutput();
//out.close();
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
BufferedReader input = null;
try {
input = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
Scanner y = new Scanner(input);
String answer = "";
while (y.hasNextLine()) {
answer = answer.concat(y.nextLine());
}
System.out.println("Answer :");
System.out.println(answer);
System.out.println(answer);
现在,我如何编辑我的代码来执行我所说的?
非常感谢!
由于您试图在客户端之间进行通信,因此您必须使用线程来进行通信。所以它的工作方式是你必须捕获两个客户端并将它们放在同一个线程中。
public static void startServer() {
ExecutorService executorService = Executors.newFixedThreadPool(2);
ServerSocket server = new ServerSocket(9090);
executorService.execute(() -> {
Socket client1 = server.accept();
Socket client2 = server.accept();
executorService.execute(new ServerConnection(client1, client2));
});
}
ServerConnection class 将采用两个客户端 (Socket),您可以使用它们在客户端到服务器到客户端之间进行通信。将 ServerConnection 视为来自客户端的数据,服务器将做出相应的反应。
我有这种情况:
2 个客户:c1,c2
1 个服务器:s
我需要从c1向s发送一条消息m,然后我需要s向c2发送一条通知消息。 我正在使用 Java 套接字。 我的代码非常简单,可以从 c1 向 s 发送消息:
Server
try {
ServerSocket listener = new ServerSocket(9090);
System.out.println("Server ready to accept connections");
while (true) {
Socket socket = listener.accept();
try {
BufferedReader in =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
Scanner x = new Scanner(in);
System.out.println("Client has sent :");
while (x.hasNextLine()){
System.out.println(x.nextLine());
}
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println("OK");
out.flush();
} catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
finally
{
socket.close();
}
}
}catch (Exception ex){
System.out.println(ex.getLocalizedMessage());
}
Client
Socket s = null;
try {
s = new Socket("localhost", 9090);
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
try {
PrintWriter out =
new PrintWriter(s.getOutputStream(), true);
out.println("Random Text");
out.flush();
s.shutdownOutput();
//out.close();
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
BufferedReader input = null;
try {
input = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
Scanner y = new Scanner(input);
String answer = "";
while (y.hasNextLine()) {
answer = answer.concat(y.nextLine());
}
System.out.println("Answer :");
System.out.println(answer);
System.out.println(answer);
现在,我如何编辑我的代码来执行我所说的? 非常感谢!
由于您试图在客户端之间进行通信,因此您必须使用线程来进行通信。所以它的工作方式是你必须捕获两个客户端并将它们放在同一个线程中。
public static void startServer() {
ExecutorService executorService = Executors.newFixedThreadPool(2);
ServerSocket server = new ServerSocket(9090);
executorService.execute(() -> {
Socket client1 = server.accept();
Socket client2 = server.accept();
executorService.execute(new ServerConnection(client1, client2));
});
}
ServerConnection class 将采用两个客户端 (Socket),您可以使用它们在客户端到服务器到客户端之间进行通信。将 ServerConnection 视为来自客户端的数据,服务器将做出相应的反应。