Java - 客户端和服务器通信问题
Java - Client and Server communication issues
我正在尝试创建一个简单的 Java 聊天应用程序,但是 运行 遇到了一些问题。
下面是我的代码 类:
Serveur.java :
import java.io.*;
import java.net.*;
class Serveur{
private String msgClient, msgServeur;
private ServerSocket serverSocket;
private DataOutputStream out;
private Socket socket;
private int port;
private BufferedReader in;
public Serveur() throws IOException{
System.out.println("Serveur OK...");
this.port = 21;
this.serverSocket = new ServerSocket(this.port);
while(true){
this.socket = serverSocket.accept();
this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
this.out = new DataOutputStream(this.socket.getOutputStream());
this.msgClient = this.in.readLine();
System.out.println("Received: " + this.msgClient);
this.msgServeur = this.msgClient.toUpperCase() + '\n';
send(this.msgServeur);
}
}
public void send(String msg) throws IOException{
this.out.writeBytes(msg);
}
public static void main(String argv[]) throws Exception {
Serveur serveur = new Serveur();
}
}
Client.java :
import java.io.*;
import java.net.*;
class Client{
private String sentence;
private String modifiedSentence;
private int port;
private BufferedReader inUser;
private BufferedReader inServeur;
private Socket socket;
private DataOutputStream out;
public Client() throws UnknownHostException, IOException{
this.sentence = "";
this.modifiedSentence = "";
this.port = 21;
this.inUser = new BufferedReader(new InputStreamReader(System.in));
this.socket = new Socket("localhost", this.port);
this.out = new DataOutputStream(this.socket.getOutputStream());
this.inServeur = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
sentence = this.inUser.readLine();
this.out.writeBytes(sentence + '\n');
modifiedSentence = this.inServeur.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
this.socket.close();
}
public static void main(String argv[]) throws Exception{
Client client = new Client();
}
}
我有 2 个问题:
- 客户端发送消息,和服务器returns相同的大写消息。如何允许客户端发送消息而不立即关闭它的套接字连接?
- 服务器看起来不错,但是当我有多个客户端时,连接多个客户端会有什么变化吗?我如何向特定客户端广播消息和消息?
The client send a message, the server return the same message in
uppercase. How can i allow the client to send infinite message and
don't destroy itself after sending the first message ?
让客户使用循环
boolean quit = false;
while (!quit) {
sentence = this.inUser.readLine();
quit = sentence.trim().equals("quit");
this.out.writeBytes(sentence + '\n');
modifiedSentence = this.inServeur.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
}
this.socket.close();
The server looks ok, but when i will have multiple client, will it
make difference between multiple client ? How can i broadcast ? send
message to focused client ?
是的,此服务器阻止读取第一个客户端,因此任何其他客户端都必须等待。您可能希望将阻塞每个客户端的代码放在单独的线程中或将其提交给 ExecutiveService。并且所有特定于客户端的变量不能在单个服务器中 class 因为每个客户端都需要一组。
while (true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
boolean quit = false;
while (!quit) {
String msgClient = in.readLine();
quit = msgClient.trim().equals("quit");
System.out.println("Received: " + msgClient);
String msgServeur = msgClient.toUpperCase() + '\n';
out.writeBytes(msgServeur);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
我正在尝试创建一个简单的 Java 聊天应用程序,但是 运行 遇到了一些问题。
下面是我的代码 类:
Serveur.java :
import java.io.*;
import java.net.*;
class Serveur{
private String msgClient, msgServeur;
private ServerSocket serverSocket;
private DataOutputStream out;
private Socket socket;
private int port;
private BufferedReader in;
public Serveur() throws IOException{
System.out.println("Serveur OK...");
this.port = 21;
this.serverSocket = new ServerSocket(this.port);
while(true){
this.socket = serverSocket.accept();
this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
this.out = new DataOutputStream(this.socket.getOutputStream());
this.msgClient = this.in.readLine();
System.out.println("Received: " + this.msgClient);
this.msgServeur = this.msgClient.toUpperCase() + '\n';
send(this.msgServeur);
}
}
public void send(String msg) throws IOException{
this.out.writeBytes(msg);
}
public static void main(String argv[]) throws Exception {
Serveur serveur = new Serveur();
}
}
Client.java :
import java.io.*;
import java.net.*;
class Client{
private String sentence;
private String modifiedSentence;
private int port;
private BufferedReader inUser;
private BufferedReader inServeur;
private Socket socket;
private DataOutputStream out;
public Client() throws UnknownHostException, IOException{
this.sentence = "";
this.modifiedSentence = "";
this.port = 21;
this.inUser = new BufferedReader(new InputStreamReader(System.in));
this.socket = new Socket("localhost", this.port);
this.out = new DataOutputStream(this.socket.getOutputStream());
this.inServeur = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
sentence = this.inUser.readLine();
this.out.writeBytes(sentence + '\n');
modifiedSentence = this.inServeur.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
this.socket.close();
}
public static void main(String argv[]) throws Exception{
Client client = new Client();
}
}
我有 2 个问题:
- 客户端发送消息,和服务器returns相同的大写消息。如何允许客户端发送消息而不立即关闭它的套接字连接?
- 服务器看起来不错,但是当我有多个客户端时,连接多个客户端会有什么变化吗?我如何向特定客户端广播消息和消息?
The client send a message, the server return the same message in uppercase. How can i allow the client to send infinite message and don't destroy itself after sending the first message ?
让客户使用循环
boolean quit = false;
while (!quit) {
sentence = this.inUser.readLine();
quit = sentence.trim().equals("quit");
this.out.writeBytes(sentence + '\n');
modifiedSentence = this.inServeur.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
}
this.socket.close();
The server looks ok, but when i will have multiple client, will it make difference between multiple client ? How can i broadcast ? send message to focused client ?
是的,此服务器阻止读取第一个客户端,因此任何其他客户端都必须等待。您可能希望将阻塞每个客户端的代码放在单独的线程中或将其提交给 ExecutiveService。并且所有特定于客户端的变量不能在单个服务器中 class 因为每个客户端都需要一组。
while (true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
boolean quit = false;
while (!quit) {
String msgClient = in.readLine();
quit = msgClient.trim().equals("quit");
System.out.println("Received: " + msgClient);
String msgServeur = msgClient.toUpperCase() + '\n';
out.writeBytes(msgServeur);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}