Java套接字侦听器

Java套接字侦听器,java,multithreading,concurrency,network-programming,queue,Java,Multithreading,Concurrency,Network Programming,Queue,使用线程获取套接字的InputStream接收到的对象,然后将它们添加到ConcurrentLinkedQueue中,这样就可以从主线程访问它们,而不会在轮询输入循环中阻塞,这样是否合适 private Queue<Packet> packetQueue = new ConcurrentLinkedQueue<Packet>(); private ObjectInputStream fromServer; //this is the input stream of the

使用线程获取套接字的InputStream接收到的对象,然后将它们添加到ConcurrentLinkedQueue中,这样就可以从主线程访问它们,而不会在轮询输入循环中阻塞,这样是否合适

private Queue<Packet> packetQueue = new ConcurrentLinkedQueue<Packet>();
private ObjectInputStream fromServer; //this is the input stream of the server
public void startListening()
{
    Thread listeningThread = new Thread()
    {
        public void run()
        {
            while(isConnected())    //check if the socket is connected to anything
            {
                try {
                    packetQueue.offer((Packet) fromServer.readObject());  //add packet to queue
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    listeningThread.start();  //start the thread 
}

public Packet getNextPacket()
{
    return packetQueue.poll();  //get the next packet in the queue
}

这取决于您需要在主线程中使用这个对象做什么

如果需要处理它,或者如果它将被多次使用,那么您可以将它放入队列或另一个为您保存此对象的类中,但是如果您需要处理它的时间较短,并且在处理后您不需要进一步使用此对象,那么您实际上不需要使用队列

关于使用ConcurrentQueue也取决于,您需要订单吗?您需要保证读写之间的同步吗

您也可以使用异步套接字来处理同一线程中的多个客户端和进程,甚至可以从它们那里获取对象,并将其放入队列以进一步处理


但是“适当”很难回答,因为这取决于您需要对该对象执行什么操作以及如何处理它。

您需要捕获EOFEException并在获得它时中断读取循环,除SocketTimeoutException之外的所有其他IOException也是致命的。您的join调用也不会工作:它只会尝试加入自身,这将永远阻止,因为线程在join中被阻止时不会死亡。我真的不明白你的建议有什么意义。它不断地从服务器上读取数据,直到客户端断开连接,即:接收到多个对象,更精确的是一个任意数字。我可以看到你的代码的作用,我已经对它做了大量的评论。我看不出你关于排队的建议有什么意义。你对“适当”的定义是什么?如果不说明您的需求,这个问题实际上是无法回答的。这是一种避免使用此循环阻塞主线程并允许主线程异步访问下一个未读对象的方法。我在问这样做是否可以接受,或者是否有更好的方法。在任意时间异步表示。但是为什么呢?当队列中没有任何对象时,主线程还将做什么?对象需要按照接收顺序进行访问,并且每个对象都有明显的处理时间。同步队列是因为我有第二个线程,它将添加到队列中,而主线程将访问它们。