我有一个简单的服务器,允许客户端注册/登录,然后玩游戏。但是,当有许多客户机连接到服务器时,服务器不会直接向请求的客户机发送消息,而是按顺序(向客户机1、客户机2和客户机3等)发送消息。如何将服务器的消息直接发送到请求的客户端?
这是我的密码:
服务器代码:
// Server class
public class ServerTCP {
//Vector to store active clients
static Vector<ClientHandler> ar = new Vector<>();
//Counter for clients
static int i = 0;
public static void main(String[] args) throws IOException {
System.out.println("SERVER IS ONLINE!");
//Server is listening on port 1234
ServerSocket serverSocket = new ServerSocket(1234);
System.out.println("Waiting for connections...");
Socket socket;
while (true) {
// Accept the incoming request
socket = serverSocket.accept();
System.out.println("New connection: " + socket);
//Obtain input and output streams
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
System.out.println("Creating a new handler for this client");
// Create a new handler object for handling this request.
ClientHandler request = new ClientHandler(socket,"client " + i, dis, dos);
// Create a new Thread with this object.
Thread t = new Thread(request);
System.out.println("Adding this client to active client list");
// add this client to active clients list
ar.add(request);
// start the thread.
t.start();
// increment i for new client.
// i is used for naming only, and can be replaced
// by any naming scheme
i++;
}
}
}
// ClientHandler class
class ClientHandler implements Runnable {
Scanner scn = new Scanner(System.in);
private String name;
final DataInputStream dis;
final DataOutputStream dos;
Socket s;
boolean isConnected, return_menu;
HashMap<String, User> usersList = new HashMap<>();
String username, password;
User user;
//Constructor
public ClientHandler(Socket s, String name, DataInputStream dis, DataOutputStream dos) {
this.dis = dis;
this.dos = dos;
this.name = name;
this.s = s;
this.isConnected =true;
}
@Override
public void run() {
String received = "";
while (true) {
try {
while (received.compareTo("x") !=0) {
//Get message from client
received = dis.readUTF().trim();
System.out.println("Client sent: " + received);
//////////////////////////
// Login
if (received.equals("1")){
boolean login_success = false;
while (!login_success && !return_menu){
for (ClientHandler mc : ServerTCP.ar)
{
mc.dos.writeUTF("\nLogging in. You can type 'return' in the 'Username' field to return to main menu.");
mc.dos.writeUTF("Username: ");
username = dis.readUTF().trim();
if (username.equals("return")) {
mc.dos.writeUTF("\nReturn to main menu!");
return_menu = true;
} else {
User userLogin = usersList.get(username);
mc.dos.writeUTF("Password: ");
password = dis.readUTF().trim();
if (userLogin != null) {
if (!password.equals(userLogin.password)) {
mc.dos.writeUTF("\nWrong username or password! Please try again! Or type 'return' to return to main menu.");
} else {
mc.dos.writeUTF("\nWelcome back, " + userLogin.name + "!");
this.name = username;
login_success = true;
}
} else {
mc.dos.writeUTF("\nWrong username or password! Please try again! Or type 'return' to return to main menu.");
}
}
}
}
if (login_success){
//Do somethings when logged in
}
}
//////////////////////////
// Register
if (received.equals("2")){
for (ClientHandler mc : ServerTCP.ar)
{
mc.dos.writeUTF("\nRegister new account. You can type 'return' to return to main menu.");
return_menu = false;
boolean register_success = false;
while (!register_success && !return_menu) {
while (!username_accepted) {
mc.dos.writeUTF("Enter new username: ");
username = dis.readUTF().trim();
}
while (usersList.containsKey(username)) {
mc.dos.writeUTF("Username already exists, please choose another username. Or type 'return' to return to menu.");
mc.dos.writeUTF("Enter new username: ");
username = dis.readUTF().trim();
}
if (username.equals("return")) {
mc.dos.writeUTF("\nReturn to main menu!");
return_menu = true;
} else {
mc.dos.writeUTF("Enter your password: ");
password = dis.readUTF().trim();
mc.dos.writeUTF("Enter your name: ");
name = dis.readUTF().trim().replaceAll(" +", " ");
user = new User(password,name);
usersList.put(username, user);
mc.dos.writeUTF("Thank you for register, " + name + ". Now you can login!");
register_success = true;
}
}
}
}
////////////////////////////
// Invalid input
if (!(received.equals("1") || received.equals("2"))) {
System.out.println("\nInvalid input, please try again!");
}
}
////////////////////////////////
//Exit
if(received.equals("x")){
this.isConnected =false;
for (ClientHandler mc : ServerTCP.ar)
{
mc.dos.writeUTF("Disconnected to server!");
}
this.s.close();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//Closing input and output streams
this.dis.close();
this.dos.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
客户代码:
public class ClientTCP
{
final static int ServerPort = 1234;
public static void main(String args[]) throws UnknownHostException, IOException
{
Scanner scn = new Scanner(System.in);
// Getting IP
String ip = InetAddress.getLocalHost().getHostAddress();
// Establish the connection
Socket socket = new Socket(ip, ServerPort);
System.out.println("Connected to server!");
System.out.println("Connection info: " + socket);
System.out.println("INFO: Enter 'x' to exit");
System.out.println("1. Login\n2. Register\nx. Exit");
// Obtaining input and out streams
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// sendMessage thread
Thread sendMessage = new Thread(new Runnable()
{
@Override
public void run() {
while (true) {
// read the message to deliver.
String msg = scn.nextLine();
try {
// write on the output stream
dos.writeUTF(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
// readMessage thread
Thread readMessage = new Thread(new Runnable()
{
@Override
public void run() {
while (true) {
try {
// read the message sent to this client
String msg = dis.readUTF();
System.out.println(msg);
if (msg.contains("Return to main menu!") || msg.startsWith("Thank you for register")) System.out.println("1. Login\n2. Register\nx. Exit");
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
sendMessage.start();
readMessage.start();
}
}
暂无答案!
目前还没有任何答案,快来回答吧!