所以这个问题让我头疼了好几天了。我正在制作一个多用户聊天应用程序。我的设计如下: 1.有一个登录窗口。 2.输入详细信息后,将打开客户端聊天窗口。 3.现在用户开始输入。 4.当他点击进入或点击发送按钮时,该消息将被发送到服务器。 5.服务器将其发送给所有客户端,包括向其发送原始消息的客户端。
问题:我无法接收从服务器到客户端的任何消息。
这是我的服务器类:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server implements Runnable {
static InetAddress address;
static ArrayList<Integer> clients=new ArrayList<Integer>();
static ArrayList<Socket> socs=new ArrayList<>();
static String message="";
static DataOutputStream toClient;
static ServerSocket socket;
static Socket socketNew;
static boolean running=false;
public static void main(String[] args) throws IOException
{
socket=new ServerSocket(8000);
System.out.println("Server started on port 8000");
running=true;
while(true)
{
socketNew=socket.accept();
socs.add(socketNew);
address=socketNew.getInetAddress();
System.out.println("connected to client at address: "+address);
Server server=new Server();
new Thread(server).start();
}
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
String message;
PrintWriter out;
while ((message = br.readLine()) != null) {
System.out.println(message);
for (Socket s : socs) // sending the above msg. to all clients
{
out = new PrintWriter(s.getOutputStream(), true);
out.write(message);
out.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
这是客户端类中的receive_message函数。注意这个方法,我运行在一个单独的线程上,一旦用户登录就会启动。
public void receive_data()
{while(true)
{
try {
BufferedReader in;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(in.readLine()!=null)
{
System.out.println(in.readLine());
console(in.readLine());
}
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
有什么建议吗?谢谢你的时间。 : - )
答案 0 :(得分:1)
当您的客户端正在等待readLine循环中的行结束字符时,您正在编写没有行结尾的消息。通过在服务器发送循环中放置out.write('\n')
,它还将发送换行符。
示例:
for (Socket s : socs) {
out = new PrintWriter(s.getOutputStream(), true);
out.write(message);
out.write('\n'); // added this line
out.flush();
}