Java是否将开放套接字传递给类?

Java是否将开放套接字传递给类?,java,networking,Java,Networking,我这里有一个简单的服务器程序,我正在尝试设计一些东西来处理接收到的数据包 代码如下: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSo

我这里有一个简单的服务器程序,我正在尝试设计一些东西来处理接收到的数据包

代码如下:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Listener implements Runnable {
    ServerSocket listenerSocket;
    Socket connection = null;
    OutputStream out;
    InputStream in;
    String packet;
    @Override
    public void run()
    {
        try{
            listenerSocket = new ServerSocket(7331); //General socket setup
            System.out.println("Waiting for connection");
            connection = listenerSocket.accept();
            System.out.println("Connection received from " + connection.getInetAddress());
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            DataOutputStream out = new DataOutputStream(connection.getOutputStream()); 
            do{
                try{
                    packet = (String)in.readLine(); // Get packet data
                    System.out.println("Data:" + packet);
                    Thread handler = new Thread(new Handler(packet)); // Handler class will take / parse packet data.
                    handler.start(); 
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }while(!packet.equals("shutdown"));
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            try{
                in.close();
                out.close();
                listenerSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
}
正如您所看到的,我使用一个单独的处理程序线程来处理每个数据包。不过,我想做的是在处理程序完成其流程时向客户端发送“更新”。例如,处理程序复制完一个文件,将数据发送回客户端,告诉它,然后开始复制另一个文件,并让客户端知道这一点。显然,处理程序线程无法访问套接字。我有什么建议或改进吗?

两个选项:

  • 将套接字传递给构造函数中的
    处理程序
    ;确保同步对套接字的访问
  • 设置一个响应队列,
    Handler
    实例将响应数据放入其中;创建另一个线程,负责将响应从队列中取出并发送回套接字

  • 确保同步对套接字的访问。
    我将如何执行此操作。即使它开着,我还能通过吗?你也可以