如何在多线程聊天客户端中为客户端分配用户名

huangapple go评论103阅读模式
英文:

How to give a username to clients in a multi-threaded chat client

问题

My Problem: 当前,我不明白如何为我的聊天客户端分配每个客户端的用户名。因此,我的输出只是:"A user says: [用户的聊天内容]"

My Code:

Client.java(自说明)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;
  8. import java.util.Scanner;
  9. public class Client {
  10. public static void main(String[] args) {
  11. Client client = new Client("localhost", 9090);
  12. }
  13. private Socket clientConnection;
  14. private PrintWriter sender;
  15. private BufferedReader receiver;
  16. private Scanner scan = new Scanner(System.in);
  17. private String request;
  18. public static boolean firstMessage = true;
  19. public Client(String serverip, int port) {
  20. try {
  21. clientConnection = new Socket(serverip, port);
  22. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  23. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  24. } catch (UnknownHostException e) {
  25. e.printStackTrace();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. new Thread(new ChatHandler(clientConnection)).start();
  30. while (true) {
  31. if (request != null) {
  32. } else {
  33. System.out.println("欢迎来到聊天室!开始聊天吧!");
  34. }
  35. request = scan.nextLine();
  36. sender.println(request);
  37. if (request.equals("quit")) {
  38. System.exit(0);
  39. break;
  40. }
  41. }
  42. }
  43. }

Server.java(自说明)

  1. package chatroom;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.ArrayList;
  6. public class Server {
  7. public static void main(String[] args) {
  8. Server server = new Server(9090);
  9. }
  10. private ServerSocket serverSocket;
  11. private Socket clientConnection;
  12. private ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
  13. public Server(int port) {
  14. try {
  15. serverSocket = new ServerSocket(port);
  16. } catch (IOException e1) {
  17. e1.printStackTrace();
  18. }
  19. while (true) {
  20. System.out.println("[SERVER] 等待客户端连接...");
  21. try {
  22. clientConnection = serverSocket.accept();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. System.out.println("[SERVER] 客户端连接成功!");
  27. ClientHandler clientThread = new ClientHandler(clientConnection, clients);
  28. clients.add(clientThread);
  29. Thread t = new Thread(clientThread);
  30. t.start();
  31. }
  32. }
  33. }

ClientHandler.java(从用户接收输入并发送回客户端的可运行程序)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import java.util.ArrayList;
  8. public class ClientHandler implements Runnable {
  9. private Socket clientConnection;
  10. private BufferedReader receiver;
  11. private PrintWriter sender;
  12. private String clientRequest, clientUsername;
  13. private ArrayList<ClientHandler> clients;
  14. public ClientHandler(Socket clientConnection, ArrayList<ClientHandler> clients) {
  15. this.clientConnection = clientConnection;
  16. this.clients = clients;
  17. try {
  18. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  19. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. @Override
  25. public void run() {
  26. try {
  27. while (true) {
  28. String userInput = receiver.readLine();
  29. if (userInput.equals("quit")) {
  30. System.out.println("[SERVER] 收到强制用户关闭输入。现在退出...");
  31. System.exit(0);
  32. break;
  33. }
  34. System.out.println("[SERVER] 收到用户输入...");
  35. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  36. System.out.println("[SERVER] 正在尝试将消息发送给其他客户端...");
  37. for (ClientHandler aClient : clients) {
  38. String serverResponse = "一个用户说:" + userInput;
  39. aClient.sender.println(serverResponse);
  40. }
  41. }
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

ChatHandler.java(向客户端输出聊天内容,允许客户端在产生输出时进行输入)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. public class ChatHandler implements Runnable {
  7. private Socket clientConnection;
  8. private BufferedReader receiver;
  9. public ChatHandler(Socket clientConnection) {
  10. this.clientConnection = clientConnection;
  11. try {
  12. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. @Override
  18. public void run() {
  19. try {
  20. while (true) {
  21. String serverResponse = receiver.readLine();
  22. if (serverResponse == null) {
  23. break;
  24. }
  25. System.out.println("\n" + serverResponse);
  26. }
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
英文:

My Problem: Currently, I do not understand how to assign each Client a username for my chat client. Therefore, I just have the output as: "A user says: [user's chat]"

My Code:

Client.java (Self Explanatory)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;
  8. import java.util.Scanner;
  9. public class Client {
  10. public static void main(String[] args) {
  11. Client client = new Client(&quot;localhost&quot;, 9090);
  12. }
  13. private Socket clientConnection;
  14. private PrintWriter sender;
  15. private BufferedReader receiver;
  16. private Scanner scan = new Scanner(System.in);
  17. private String request;
  18. public static boolean firstMessage = true;
  19. public Client(String serverip, int port) {
  20. try {
  21. clientConnection = new Socket(serverip, port);
  22. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  23. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  24. } catch (UnknownHostException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31. new Thread(new ChatHandler(clientConnection)).start();
  32. while (true) {
  33. if (request != null) {
  34. } else {
  35. System.out.println(&quot;Welcome to the ChatRoom! Type to get started!&quot;);
  36. }
  37. request = scan.nextLine();
  38. sender.println(request);
  39. if (request.equals(&quot;quit&quot;)) {
  40. System.exit(0);
  41. break;
  42. }
  43. }
  44. }
  45. }

Server.java (Self Explanatory)

  1. package chatroom;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.ArrayList;
  6. public class Server {
  7. public static void main(String[] args) {
  8. Server server = new Server(9090);
  9. }
  10. private ServerSocket serverSocket;
  11. private Socket clientConnection;
  12. private ArrayList&lt;ClientHandler&gt; clients = new ArrayList&lt;ClientHandler&gt;();
  13. public Server(int port) {
  14. try {
  15. serverSocket = new ServerSocket(port);
  16. } catch (IOException e1) {
  17. // TODO Auto-generated catch block
  18. e1.printStackTrace();
  19. }
  20. while (true) {
  21. System.out.println(&quot;[SERVER] Waiting for Client Connection...&quot;);
  22. try {
  23. clientConnection = serverSocket.accept();
  24. } catch (IOException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. System.out.println(&quot;[SERVER] Client Connected Successfully!&quot;);
  29. ClientHandler clientThread = new ClientHandler(clientConnection, clients);
  30. clients.add(clientThread);
  31. Thread t = new Thread(clientThread);
  32. t.start();
  33. }
  34. }
  35. }

ClientHandler.java (Runnable that receieves input from user and sends it back to clients)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import java.util.ArrayList;
  8. public class ClientHandler implements Runnable {
  9. private Socket clientConnection;
  10. private BufferedReader receiver;
  11. private PrintWriter sender;
  12. private String clientRequest, clientUsername;
  13. private ArrayList&lt;ClientHandler&gt; clients;
  14. public ClientHandler(Socket clientConnection, ArrayList&lt;ClientHandler&gt; clients) {
  15. this.clientConnection = clientConnection;
  16. this.clients = clients;
  17. try {
  18. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  19. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  20. } catch (IOException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }
  24. }
  25. @Override
  26. public void run() {
  27. try {
  28. while (true) {
  29. String userInput = receiver.readLine();
  30. if (userInput.equals(&quot;quit&quot;)) {
  31. System.out.println(&quot;[SERVER] Received Forced User Shutdown Input. Now Exiting...&quot;);
  32. System.exit(0);
  33. break;
  34. }
  35. System.out.println(&quot;[SERVER] Received User Input... &quot;);
  36. sender = new PrintWriter(clientConnection.getOutputStream(), true);
  37. System.out.println(&quot;[SERVER] Attempting to Send the Message to the Other Clients...&quot;);
  38. for (ClientHandler aClient : clients) {
  39. String serverResponse = &quot;A user says: &quot; + userInput;
  40. aClient.sender.println(serverResponse);
  41. }
  42. }
  43. } catch (IOException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. }

ChatHandler.java (Runnable that outputs the chat to the client which allows the client to type while output is being produced)

  1. package chatroom;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. public class ChatHandler implements Runnable{
  7. private Socket clientConnection;
  8. private BufferedReader receiver;
  9. public ChatHandler(Socket clientConnection) {
  10. this.clientConnection = clientConnection;
  11. try {
  12. receiver = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
  13. } catch (IOException e) {
  14. // TODO Auto-generated catch block
  15. e.printStackTrace();
  16. }
  17. }
  18. @Override
  19. public void run() {
  20. try {
  21. while(true) {
  22. String serverResponse = receiver.readLine();
  23. if(serverResponse == null) {
  24. break;
  25. }
  26. System.out.println(&quot;\n&quot; + serverResponse);
  27. }
  28. } catch (IOException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. }
  33. }

Any help is appreciated! Thank you all so much!
~AbysssCoder

答案1

得分: 1

以下是翻译好的代码部分:

  1. 发送文本和用户名的一种方法是创建一个新的对象
  2. 可以像这样
  3. public class Message() implements Serializable {
  4. public String message_, username;
  5. private static final long serialVersionUID = 1L;
  6. public Message(String message, String Username){
  7. this.message_ = message;
  8. this.username = Username;
  9. }
  10. }
  11. 然后不使用普通的 DataInputStream而是使用 ObjectInputStream 来发送对象
  12. 像这样
  13. DataInputStream in = new DataInputStram(socket.getInputStream);
  14. ObjectInputStream input = new ObjectInputSream(in);
  15. Message message = (Message) input.readObject;
  16. System.out.println("From: " + message.username + ": " + message.message_);
  17. 并且你还必须使用 ObjectOutputStream我建议你研究一下如何通过套接字发送对象
英文:

A way that you can send the text and username is creating a new Object

It can be something like this:

  1. public class Message() implements Serializable {
  2. public String message_, username;
  3. private static final long serialVersionUID = 1L;
  4. public Message(String message, String Username){
  5. this.message_ = message;
  6. this.username = Username
  7. }
  8. }

Then instead of using the normal DataInputStream you use ObjectInputStream to send the object.
like this

  1. DataInputStream in = new DataInputStram(socket.getInputStream);
  2. ObjectInputStream input = new ObjectInputSream(in);
  3. Message message = (Message) input.readObject;
  4. System.out.println(&quot;From: &quot; + message.username + &quot;: &quot; + message.message_)

And you also have to use ObjectOutputStream y recomend you to investigate about sending objects trhough sockets

huangapple
  • 本文由 发表于 2020年10月13日 11:11:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/64327923.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定