【问题标题】:Java client-serverJava客户端-服务器
【发布时间】:2016-02-14 19:26:04
【问题描述】:

这个问题困扰了我一天多,我找不到解决办法。我正在用 Java 编写一个聊天应用程序。问题是服务器无法向客户端发送消息,但只能接收它。这是我的课程:

服务器类:

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 Server(InetAddress address){
    this.address=address;

}
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(address);
        new Thread(server).start();


    }
}


public void run() {

    {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
        String message=br.readLine();
        System.out.println(message);
        for(Socket s:socs)      //sending the above msg. to all clients
        {
            OutputStream os=os = s.getOutputStream();
            PrintWriter pw = new PrintWriter(os, true);
            pw.write(message);
            pw.flush();

        }
    } catch (IOException e) {

        e.printStackTrace();
    }
    }

    }
private void message() {


}       


}

这是我的客户端类的相关函数:

private void receive_data()
    {
        BufferedReader br;
        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message=br.readLine();
            console(message);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }
private void send_data() {

    OutputStream os;
    try {
        os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os, true);
        pw.println(this.name+": "+textField.getText());
        pw.flush();
        textField.setText("");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

此外,服务器在收到第一条消息后停止从客户端接收任何消息。我认为可以通过将 run() 方法的内容包含在 while 循环中的服务器类中来解决这个问题。但是它会抛出异常way.上述问题有什么解决办法吗?

【问题讨论】:

  • 是的,您需要用循环将其括起来。请更改它并在您的问题中包含它抛出的异常(完整堆栈跟踪)。
  • 这个方法的问题是当我杀死客户端的窗口时,有很多异常,而且是无限的。次。我尝试了类似 while(running) 的方法,其中 running 最初为 true。如果捕获到任何异常,我将 running 设置为 false。但是这样,其他客户端也无法向服务器发送-接收任何消息。并且你能帮我解决我的第一个问题吗?为什么客户端无法收到来自服务器的任何消息?
  • 他们能收到来自其他客户端的消息吗?
  • 消息流只是从客户端到服务端。
  • run() 方法中没有循环来保持它运行。所以你只执行一次,线程就关闭了。

标签: java sockets networking client-server


【解决方案1】:
public void run() {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
        String message;
        PrintWriter out;

        while ((message = br.readLine()) != null) {
            for (Socket s : socs) // sending the above msg. to all clients
            {
                out = new PrintWriter(s.getOutputStream(), true);
                out.println(message);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

你去。用我自己快速编写的一个小客户对其进行了测试,它可以工作。

而且您绝对应该处理您的代码格式。 (主要是那些无缘无故的范围括号。)

【讨论】:

  • 谢谢伙计。它奏效了。对格式化部分感到抱歉。这个问题让我非常头疼,我只是发布它而不关心缩进。
猜你喜欢
  • 2017-06-19
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多