无法通过套接字发送多个邮件
问题描述:
我正在尝试制作一个小聊天系统。我有一个控制台和一个客户端。现在只有客户端需要发送消息到控制台。我可以成功连接到服务器,并且我可以从客户端向控制台发送一条消息。发送第一条消息后,麻烦就开始了。当第一条消息我不能发送任何其他消息。无法通过套接字发送多个邮件
我不知道是否控制台不会读取消息或不会发送消息的客户端。在这种情况下,我如何解决这个问题?
public class ClientMainClass {
private static Socket socket;
public static void main(String args[]) {
try {
String host = "localhost";
int port = 25000;
InetAddress address = InetAddress.getByName(host);
socket = new Socket(address, port);
Scanner scanner = new Scanner(System.in);
System.out.println("Skriv dit username:");
String name = scanner.nextLine();
System.out.println("Du er logget ind som: " + name);
String input;
do{
input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("Du forlod serveren");
socket.close();
continue;
}else {
/*OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);*/
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
Date date = new Date();
String time = date.getDate()+"/"+date.getMonth()+":"+date.getHours()+":"+date.getMinutes();
//Send the message to the server
String message = time+ " - " + name + ": "+input;
printWriter.println(message);
System.out.println(message);
continue;
}
}while (!(input.equals("exit")));
} catch (Exception exception) {
exception.printStackTrace();
} finally {
//Closing the socket
try {
socket.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
我的服务器:
public class Main{
private static Socket socket;
public static void main(String[] args) {
try {
int port = 25000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server Started and listening to the port 25000");
while(true) {
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch(Exception e){}
}
}
}
予以明确。我可以连接到服务器。我可以从客户端向控制台发送一条消息,但只能发送一条消息。
答
你从不读第二行。您的服务器接受连接,从该连接读取一行,然后等待新连接,丢弃可能到达第一个连接的所有内容。
然而,您的客户使用第一个(也是唯一的)连接发送所有输入,这是绝对正确的。
这一特定问题可以解决这样的:
while(true) {
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while(true){
System.out.println(br.readLine());
}
}
这将导致你的程序打印所有到达的是第一个连接上,但它永远不会接受第二个连接。
为了处理多个客户端,您需要一个Thread
来处理每个客户端。
不错,谢谢。我在while循环之外移动了socket.accpet(),现在它工作。谢谢。 –
请记住,如果您不在循环中调用“accept”,那么您的服务器将只处理第一个连接,而不处理任何其他连接。 – f1sh
正确,但现在我只想要一对一的聊天。 –