目前我正在學習有關插座和我的家庭作業是創建一個聊天室,多個客戶端可以自由交談控制。老師給出的提示是聊天室服務器只在客戶端試圖發送消息時才接受客戶端。這個作業應該不用線程完成。(客戶端 - 服務器)的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