如何在多线程聊天客户端中为客户端提供用户名



我的问题:目前,我不知道如何为我的聊天客户端为每个客户端分配用户名。因此,我的输出为:;用户说:[用户的聊天]";

我的代码:

Client.java(自我解释(

package chatroom;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Client client = new Client("localhost", 9090);
}
private Socket clientConnection;
private PrintWriter sender;
private BufferedReader receiver;
private Scanner scan = new Scanner(System.in);
private String request;
public static boolean firstMessage = true;
public Client(String serverip, int port) {
try {
clientConnection = new Socket(serverip, port);
sender = new PrintWriter(clientConnection.getOutputStream(), true);
receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new ChatHandler(clientConnection)).start();
while (true) {
if (request != null) {

} else {
System.out.println("Welcome to the ChatRoom! Type to get started!");
}
request = scan.nextLine();
sender.println(request);
if (request.equals("quit")) {
System.exit(0);
break;
}
}
}
}

Server.java(自我解释(

package chatroom;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
public static void main(String[] args) {
Server server = new Server(9090);
}
private ServerSocket serverSocket;
private Socket clientConnection;
private ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
public Server(int port) {
try {
serverSocket = new ServerSocket(port);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

while (true) {
System.out.println("[SERVER] Waiting for Client Connection...");
try {
clientConnection = serverSocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("[SERVER] Client Connected Successfully!");
ClientHandler clientThread = new ClientHandler(clientConnection, clients);
clients.add(clientThread);
Thread t = new Thread(clientThread);
t.start();
}

}
}

ClientHandler.java(可运行,接收用户输入并将其发送回客户端(

package chatroom;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
public class ClientHandler implements Runnable {
private Socket clientConnection;
private BufferedReader receiver;
private PrintWriter sender;
private String clientRequest, clientUsername;
private ArrayList<ClientHandler> clients;
public ClientHandler(Socket clientConnection, ArrayList<ClientHandler> clients) {
this.clientConnection = clientConnection;
this.clients = clients;
try {
receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
sender = new PrintWriter(clientConnection.getOutputStream(), true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
while (true) {
String userInput = receiver.readLine();
if (userInput.equals("quit")) {
System.out.println("[SERVER] Received Forced User Shutdown Input. Now Exiting...");
System.exit(0);
break;
}
System.out.println("[SERVER] Received User Input... ");
sender = new PrintWriter(clientConnection.getOutputStream(), true);
System.out.println("[SERVER] Attempting to Send the Message to the Other Clients...");
for (ClientHandler aClient : clients) {
String serverResponse = "A user says: " + userInput;
aClient.sender.println(serverResponse);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 

}
}

ChatHandler.java(可运行,将聊天输出到客户端,允许客户端在生成输出时键入(

package chatroom;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ChatHandler implements Runnable{
private Socket clientConnection;
private BufferedReader receiver;

public ChatHandler(Socket clientConnection) {
this.clientConnection = clientConnection;
try {
receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public void run() {
try {
while(true) {
String serverResponse = receiver.readLine();


if(serverResponse == null) {
break;
}

System.out.println("n" + serverResponse);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


}

感谢您的帮助!非常感谢大家!~深渊码

发送文本和用户名的一种方法是创建一个新的Object

它可以是这样的:

public class Message() implements Serializable {
public String message_, username;
private static final long serialVersionUID = 1L;
public Message(String message, String Username){
this.message_ = message;
this.username = Username
}
}

然后使用ObjectInputStream发送对象,而不是使用普通的DataInputStream。像这个

DataInputStream in = new DataInputStram(socket.getInputStream);
ObjectInputStream input = new ObjectInputSream(in);
Message message = (Message) input.readObject;
System.out.println("From: " + message.username + ": " + message.message_)

你还必须使用ObjectOutputStream来研究通过套接字发送对象

最新更新