繁体   English   中英

如何在Java服务器上接受多个套接字连接

[英]How to accept multiple socket connection at Java server

我正在尝试使用标准Java套接字在Android中实现客户端/服务器对。 到目前为止,我已经成功实现了一对一的客户端-服务器连接。 现在,我正在修改服务器端代码以接受多个客户端连接。 我从这里得到了帮助。 我正在创建一个serverSocket,并在无限的while循环中等待客户端连接。 一旦接受了客户端存储,我将运行一个新线程来处理该客户端,然后再次等待新的连接。 不幸的是,由于某些未知原因,该程序不断崩溃! logcat只是说-“打开跟踪文件出错:没有这样的文件或目录”。 文件路径正确(在较旧的实现中运行正常)。 谁能暗示我在做什么错? 这与缺少清单许可有关吗? 到目前为止,这是我所做的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent launchFileManager = new Intent(getBaseContext(),
            FileChooserActivity.class);
    startActivityForResult(launchFileManager, REQUEST_CODE); //receives files
    //fileArray has been populated here

    Button btn=(Button)findViewById(R.id.dispFilesid);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            initializeServer();
        }
    });
}

private void initializeServer() {
    boolean listening = true;
    try {
        serversocket = new ServerSocket(4444);
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("Listen failed", "Listening to port 4444 failed");
    }
    while (listening) {
        try {
            socket = serversocket.accept();
            Thread Clienttrd = new Thread(new Runnable() {
                @Override
                public void run() {

                    try {
                        OutputStream myos=socket.getOutputStream();
                        myos.write(filepathNameArray.size()); //send file count
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    if (!fileArray.isEmpty()) {
                        for (int i = 0; i < filepathNameArray.size(); i++){
                            copyFile(fileArray.get(i), fileArray.get(i).getName().toString());
                            //mtv.setText(fileArray.get(i).getName().toString());
                        }
                    }
                }
            });
            Clienttrd.start();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

FileChooserActivity的意图返回一个ArrayList,其中包含文件URI的列表。 然后将这些URI包裹在文件周围,并写在Socket对象的DataOutputStream上。 请帮忙。 任何见识将不胜感激! 提前致谢!

终于解决了问题。 这可能会对将来登陆此页面的其他人有所帮助。 问题:我使用同一线程来接受和处理客户端连接。 因此,服务器无法腾出空间来监听其他传入的连接。 我编写了一个单独的ConnectionHandler类来处理客户端连接:

btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Thread trd = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        serversocket = new ServerSocket(4444);
                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.d("Listen failed",
                                "Listening to port 4444 failed");
                    }

                    while (listening) {
                        try {
                            socket = serversocket.accept();
                            Runnable connectionHandler = new ConnectionHandler(
                                    socket, fileArray, filepathNameArray);
                            new Thread(connectionHandler).start();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            });
            trd.start();
        }
    });

ConnectionHandler(这解决了我的问题):

    public class ConnectionHandler implements Runnable {

    private Socket socket=null;
    private ArrayList<File> fileArray=null;
    ArrayList<String> filepathNameArray=null;

    public ConnectionHandler(Socket socket, ArrayList<File> fileArray, ArrayList<String> filepathNameArray) {
        super();
        this.socket = socket;
        this.fileArray=fileArray;
        this.filepathNameArray=filepathNameArray;
    }
    @Override
    public void run() {
        try {
            OutputStream myos=socket.getOutputStream();
            myos.write(filepathNameArray.size()); //send file count
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (!fileArray.isEmpty()) {
            for (int i = 0; i < filepathNameArray.size(); i++){
                copyFile(fileArray.get(i), fileArray.get(i).getName().toString());
                //mtv.setText(fileArray.get(i).getName().toString());
            }
        }

    }
    private void copyFile(File file, String name) {
        FileInputStream fis;
        long filesize = file.length();
        try {
            fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            @SuppressWarnings("resource")
            DataInputStream dis = new DataInputStream(bis);
            byte[] mybytearray = new byte[16384];
            OutputStream os;
            if (socket != null) {
                os = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                dos.writeUTF(name); // filename is also sent to client
                dos.writeLong(filesize); // file size is also sent to client
                long z = filesize;
                int n = 0;
                while ((z > 0)
                        && (n = dis.read(mybytearray, 0,
                                (int) Math.min(mybytearray.length, z))) != -1) {
                    dos.write(mybytearray, 0, n);
                    dos.flush();
                    z -= n;
                }
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM