目前我正在学习有关插座和我的家庭作业是创建一个聊天室,多个客户端可以自由交谈控制。老师给出的提示是聊天室服务器只在客户端试图发送消息时才接受客户端。这个作业应该不用线程完成。(客户端 - 服务器)的Java服务器时的的ServerSocket接受客户机不能正常工作
下面给出的提示,我试图在客户端和服务器代码都创建未绑定的ServerSocket和Socket。关键的想法是,当客户端尝试向服务器发送消息时,客户端代码将连接未绑定的套接字,然后该套接字将触发服务器连接未绑定的ServerSocket并接受客户端。
然而,当我运行的代码,同时在服务器和客户端代码运行,他们要求所有的连接完成,但我无法传输客户端和服务器都之间的消息。
我尝试过在网上找到答案,但找不到任何答案。我想问一下,如果我决定服务器何时接受客户端的方式是正确的。
我的聊天室服务器:
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();
}
}
谢谢!
有一些事情是错的/不在你的代码中有很多意义。也许[Oracle教程显示如何做到这一点](http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html)将是一个很好的开始。 –
谢谢!这是一个很好的教程,我会翻阅。但是,是否有可能不使用线程呢? – Imma
@Imma线程是迄今为止最方便的方法。有可能*不使用线程。如果您一次有数百个连接,您将遇到线程的性能问题,并且必须以其他方式执行此操作,但是如果您没有多个连接,则只需使用线程即可。 – immibis