【问题标题】:Want to start a thread on server for each client想为每个客户端在服务器上启动一个线程
【发布时间】:2014-04-02 09:55:30
【问题描述】:

基本上我想每当客户端连接它会发送一个字符串“连接”到服务器。作为响应,服务器应该为该客户端启动一个线程,该线程将在 5 秒后继续向客户端发送“唤醒”消息。

我在服务器上使用了 Timer 类,但它无法在同一个套接字上 ping 客户端。你能告诉我一些方法吗?示例代码将是有益的。

代码:-

import java.io.BufferedReader;

public class Server2 {
    public static void main(String[] args) {
        Server ob = new Server();
        ob.dt();
    }
}

class Server {

    public static Socket socket;

    public void dt() {
        try {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            // Server is running always. This is done using this while(true) loop
            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);
                String number = br.readLine();
                if (number.equals("2")) {
                    System.out.println("asda");
                    TimerExampleRepeating tr = new TimerExampleRepeating();
                    tr.heartbeat(this);
                } else if (number.equals("disconnect")) {
                } else {
                    System.out.println("Message received from client is " + number);

                    // Multiplying the number by 2 and forming the return message
                    String returnMessage;
                    try {
                        int numberInIntFormat = Integer.parseInt(number);
                        int returnValue = numberInIntFormat * 2;
                        returnMessage = String.valueOf(returnValue) + "\n";
                    } catch (NumberFormatException e) {
                        // Input was not a number. Sending proper message back to client.
                        returnMessage = "Please send a proper number\n";
                    }

                    // Sending the response back to the client.
                    OutputStream os = socket.getOutputStream();
                    OutputStreamWriter osw = new OutputStreamWriter(os);
                    BufferedWriter bw = new BufferedWriter(osw);
                    bw.write(returnMessage);
                    System.out.println("Message sent to the client is " + returnMessage);
                    bw.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (Exception e) {
            }
        }
    }

    public void clientsend(String message) {
        try {
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(message);
            System.out.println("Message sent to the client is " + message);
            bw.flush();
        } catch (Exception e) {
        }
    }
}

class TimerExampleRepeating {

    public void heartbeat(final Server srv) throws Exception {
        // Creating timer which executes once after five seconds
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            public void run() {
                try {
                    System.out.println("Message sent to the client is I am up1");
                    srv.clientsend("I am Up");
                    System.out.println("Message sent to the client is I am up3");
                } catch (Exception e) {
                }
                // System.out.println("Message sent to the client is I am up");
            }
        }, 5000, 5000);
    }
}

谢谢

【问题讨论】:

  • 你可能想看看Servlet 3.0 Server Push
  • "示例代码将是有益的" > 马上回来!请发布您当前的实现,以便我们尝试看看有什么问题。
  • @duncan 我已经更新了
  • 您尚未共享客户端代码。请分享。

标签: java sockets timer client-server


【解决方案1】:

我认为您的实现最简单的解决方案是拥有一个静态套接字列表(而不是单个静态套接字)。这样你就可以认识所有在那里连接的人。然后你必须改变其余的代码来处理列表,而不是单个实例。

【讨论】:

  • 但我上面的代码也不适用于单套接字连接。发送“2”时客户端无法接收消息,但如果发送任何其他数字,客户端将得到 2 的乘积作为答案。
  • 在计时器中,您提到了 5 秒的延迟。你可以这样试试timer.schedule(task,0,5000)吗?
【解决方案2】:

我建议研究Executor 框架和thread pools。在一个线程内你可以Thread.sleep(5000)。它应该适用于少量客户(

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多