我目前正在学习套接字,我的作业是创建一个聊天室,让多个客户可以自由交谈。老师给出的提示是,当客户端尝试发送消息时,聊天室服务器只接受客户端。这项功课应该在不使用线程的情况下完成。
根据提示,我尝试在客户端和服务器代码中创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的Socket,然后触发服务器连接未绑定的ServerSocket并接受客户端。
但是,当我运行代码时,服务器和客户端代码都在运行,他们声称所有连接都已建立,但我根本无法在客户端和服务器之间传输消息。
我试过在线寻找答案,但我找不到任何答案。我想询问我决定服务器何时接受客户端的方式是否正确。
我的ChatRoom服务器:
public class ChatRoom {
public static void main(String[] args) throws Exception {
int portNum = 4321;
ServerSocket serverSocket = new ServerSocket();
int count = 1;
while (true) {
// redeclare everything each round
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
BufferedReader stdIn = null;
String inputLine = null;
// accept each time round
serverSocket.bind(new InetSocketAddress(portNum));
socket = serverSocket.accept();
System.out.println("newly accepted!");
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
if (!((inputLine = in.readLine()).equals("Bye"))) {
System.out.println("Client says: " + inputLine);
out.println(stdIn.readLine());
out.flush();
System.out.println("Message Count: " + count);
count++;
}
else {
out.println(inputLine);
serverSocket.close();
socket.close();
out.close();
in.close();
}
}
}
}
我的ChatRoomClient:
public class ChatRoomClient {
public static void main(String[] args) throws Exception {
String hostName = "localhost";
int portNumber = 4321;
Socket echoSocket = new Socket(); // creates an unbound socket
PrintWriter out = null;
BufferedReader in = null;
BufferedReader stdIn = null;
String userInput;
do {
out = null;
in = null;
stdIn = null;
// each time round the unbound socket attempts to connect to send a message
echoSocket.connect(new InetSocketAddress(hostName, portNumber));
System.out.println("successfully connected");
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
userInput = stdIn.readLine();
out.flush();
System.out.println("Server says: " + in.readLine());
}
while (!userInput.equals("Bye"));
// close everything
echoSocket.close();
in.close();
stdIn.close();
}
}
谢谢!
答案 0 :(得分:0)
啊......没有为服务器使用线程,您将无法为多个客户端提供服务。无论如何,您当前的代码存在问题,而且您的逻辑不正确。
因此,我们的想法是在服务器和客户端之间建立连接(单一连接),这种连接可以双向通信(通过输入和输出流)。然后你可以循环和谈话开始与客户端,然后服务器接收,然后服务器谈话,然后客户端接收然后客户端谈话....直到客户说再见......
答案 1 :(得分:0)
老师提供的提示是聊天室服务器仅在客户端尝试发送消息时才接受客户端。这项功课应该在不使用线程的情况下完成。
老师给出的暗示没有意义。客户端必须连接,然后服务器接受。如果没有先连接,客户端就无法发送消息。也许老师真的意味着客户端在有东西发送之前不应该连接?
根据提示,我尝试在客户端和服务器代码中创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的Socket,然后触发服务器连接未绑定的ServerSocket并接受客户端。
但这不会发生。不可能。如果您尝试连接到未侦听的端口,您将获得ConnectException.
将端口置于侦听状态的唯一方法是绑定ServerSocket.
没有神奇的后门服务器可能知道客户端想要连接,所以它现在应该进行绑定。
这项功课应该在不使用线程的情况下完成。
除非您需要使用非阻塞I / O,或滥用available()
工具或使用每封邮件的连接,否则无法“创建一个多个客户端可以自由交谈的聊天室”但是我不知道如何将一个客户的消息传达给其他客户,除非你被允许批量处理。
你所描述的这项任务有太多无法估量的方面。提出的问题并不合理,而您提出的解决方案肯定不会。您应该继续以正常方式编写程序,包括连接,接受和一些I / O.在老师提出澄清的同时让它工作。
答案 2 :(得分:0)
以为我想更新,我设法在不使用线程的情况下解决了我的问题。只是套接字哈哈。认为发布我的答案以供参考是好的。
我的ChatRoom服务器:
public class ChatRoomServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(4321);
while(true) {
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader
(new InputStreamReader(clientSocket.getInputStream()));
String inputLine = in.readLine();
System.out.println("Client says: " + inputLine);
in.close();
clientSocket.close();
}
}
}
我的ChatRoom客户端:
public class ChatRoomClient {
public static void main(String[] args) throws Exception {
String hostName = "localhost";
int portNum = 4321;
BufferedReader stdIn = new BufferedReader
(new InputStreamReader(System.in));
while (true) {
String userInput;
userInput = stdIn.readLine();
Socket echoSocket = new Socket(hostName, portNum);
PrintWriter out = new PrintWriter
(echoSocket.getOutputStream(), true);
out.println(userInput);
out.flush();
out.close();
echoSocket.close();
if (userInput.equals("Bye")) {
stdIn.close();
break;
}
}
}
}