在java服务器套接字中接受客户端后会发生什么

时间:2015-10-18 20:24:14

标签: java multithreading sockets

我有服务器套接字代码,在内部线程我这样做:

MySqlCommand cmd = cnn.CreateCommand();
cmd.CommandText = "SELECT first_name, last_name, street, city, state, zip, phone, email From address_book ORDER BY last_name, first_name";
try
{
    cnn.Open();
    MySqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        lblFirstName.Text = reader.GetString("first_name") + " " + reader.GetString("last_name");
        lblStreet.Text = reader.GetString("street");
        lblCityStateZip.Text = reader.GetString("city") + ", " + reader.GetString("state") + " " + reader.GetString("zip");
        lblPhone.Text = reader.GetString("phone");
        lblEmail.Text = reader.GetString("email");
    }        
    cnn.Close();
}

这里重要的地方是我打印“hi”的代码。我感兴趣的是如何接受工作。我的服务器是否因为socket.close()行而向客户端和关闭套接字发送“hi”,或者连接是否会在其他某个线程中保持连接。我希望很清楚,很难解释我的问题。

我需要的是打开连接然后在服务器代码内(她在while循环或其他地方)从队列中读取数据(即静态公共)并在可用时将数据发送到客户端。当数据不可用时等待,只要数据在队列中发送它。这是生产者消费者的问题,并尝试如下:

new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {

                Socket socket = my_serverSocket.accept();
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                out.println("hi");
                BufferedReader in = new BufferedReader(new InputStreamReader(socket
                        .getInputStream()));
                String msg = in.readLine();
                System.out.println("message is: " + msg);

                in.close();
                socket.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (SecurityException se) {
                se.printStackTrace();
            }
        }
    }
}).start();

我首先声明BlockedQueue。然后,而不是打印“hi”我想要一些while循环或其他什么。我可以这样做:

protected static BlockingQueue<String> q;
q = new LinkedBlockingQueue<String>();

我认为被阻止的队列本身会处理竞争条件。

1 个答案:

答案 0 :(得分:0)

我不确定为什么你不能让多个客户端获取消息,但是你需要在accept()之后忽略或拒绝其他客户端。每个accept都会创建一个新的套接字连接,我想你可以关闭它。只是不要关闭第一个。

就你的公共静态队列而言,我总是希望有一个类型为Runnable的socket worker,并从accept()返回它的构造函数。

此外,您将在此套接字工作程序中使用诸如queueMessage(消息消息)之类的公共方法创建一个队列,任何其他线程都可以将该队列添加到该对象的消息队列中。 run()方法将不断循环并使用此消息队列(使用同步访问),因为消息进入并通过连接的套接字传递它们。您可以在连接套接字时循环。

同样,多个连接没有问题 - 每个工作线程都有自己的消息队列。