Java客户端套接字:无法从服务器接收消息到客户端

时间:2016-02-16 12:31:32

标签: java sockets networking client-server chat

所以这个问题让我头疼了好几天了。我正在制作一个多用户聊天应用程序。我的设计如下: 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();
   }

  }
 }



}

有什么建议吗?谢谢你的时间。 : - )

1 个答案:

答案 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();
}