Java传递开放套接字到类?

时间:2013-12-01 04:02:57

标签: 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.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线程处理每个数据包,如您所见。我想做的是在处理程序完成其进程时向客户端发送“更新”。例如,处理程序完成复制文件,将数据发送回客户端以告知它,然后它开始复制另一个文件,并让客户端知道。显然,处理程序线程无法访问套接字。我可以提出任何建议或改进吗?

1 个答案:

答案 0 :(得分:0)

两个选项:

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