Java 通过套接字连接发送数据

Java 通过套接字连接发送数据,java,android,sockets,android-studio,file-transfer,Java,Android,Sockets,Android Studio,File Transfer,我正在做一个android应用程序,其中我必须设置一个类似ShareIt的功能,从一个设备到另一个设备发送和接收文件。 我能够做到这一点,但我必须从接收端一次又一次地手动调用receive方法。 我想问一下,当发送者选择文件后点击发送按钮时,如何自动判断或启动socket的接收方式 buttonConnect.setOnClickListener(new View.OnClickListener(){ @Override public void onClic

我正在做一个android应用程序,其中我必须设置一个类似ShareIt的功能,从一个设备到另一个设备发送和接收文件。 我能够做到这一点,但我必须从接收端一次又一次地手动调用receive方法。 我想问一下,当发送者选择文件后点击发送按钮时,如何自动判断或启动socket的接收方式

  buttonConnect.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            Log.e("asdfd", IP_ADDRESS);
             clientRxThread =
                    new ClientRxThread(
                            IP_ADDRESS,
                            SocketServerPORT);

            clientRxThread.start();
        }});
}
在接收端单击按钮时,我正在通过此线程与发送方IP地址和端口号进行套接字连接

 private class ClientRxThread extends Thread {
    String dstAddress;
    int dstPort;

    ClientRxThread(String address, int port) {
        dstAddress = address;
        dstPort = port;
    }

    @Override
    public void run() {


            try {
                socket = new Socket(dstAddress, dstPort);
                socket.setReuseAddress(true);
                receive(socket);
                RecieveActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(RecieveActivity.this,
                                "Finished",
                                Toast.LENGTH_LONG).show();
                    }
                });

            } catch (IOException e) {

                e.printStackTrace();

                final String eMsg = "Something wrong: " + e.getMessage();
                RecieveActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(RecieveActivity.this,
                                eMsg,
                                Toast.LENGTH_LONG).show();
                    }
                });

            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    }
}
public void receive(Socket sockett){
    try {
        DataInputStream dis = new DataInputStream(new BufferedInputStream(sockett.getInputStream()));
        int number = dis.readInt();
        File[] files = new File[number];
        System.out.println("Number of Files to be received: " +number);
        for(int i = 0; i< number;i++) {

            long fileLength = dis.readLong();
            String fileName = dis.readUTF();
            final int progressInt = 100/number * (i+1);

            files[i] = new File(
                    Environment.getExternalStorageDirectory()+"/HotspotDemo",
                    fileName);

            FileOutputStream fos = new FileOutputStream(files[i]);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            for(int j = 0; j < fileLength; j++) bos.write(dis.read());

            bos.close();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(progressInt);
                }
            });
        }
        dis.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }
}
这是我建立连接并从该线程调用receive方法的线程

 private class ClientRxThread extends Thread {
    String dstAddress;
    int dstPort;

    ClientRxThread(String address, int port) {
        dstAddress = address;
        dstPort = port;
    }

    @Override
    public void run() {


            try {
                socket = new Socket(dstAddress, dstPort);
                socket.setReuseAddress(true);
                receive(socket);
                RecieveActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(RecieveActivity.this,
                                "Finished",
                                Toast.LENGTH_LONG).show();
                    }
                });

            } catch (IOException e) {

                e.printStackTrace();

                final String eMsg = "Something wrong: " + e.getMessage();
                RecieveActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(RecieveActivity.this,
                                eMsg,
                                Toast.LENGTH_LONG).show();
                    }
                });

            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    }
}
public void receive(Socket sockett){
    try {
        DataInputStream dis = new DataInputStream(new BufferedInputStream(sockett.getInputStream()));
        int number = dis.readInt();
        File[] files = new File[number];
        System.out.println("Number of Files to be received: " +number);
        for(int i = 0; i< number;i++) {

            long fileLength = dis.readLong();
            String fileName = dis.readUTF();
            final int progressInt = 100/number * (i+1);

            files[i] = new File(
                    Environment.getExternalStorageDirectory()+"/HotspotDemo",
                    fileName);

            FileOutputStream fos = new FileOutputStream(files[i]);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            for(int j = 0; j < fileLength; j++) bos.write(dis.read());

            bos.close();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(progressInt);
                }
            });
        }
        dis.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }
}
public void接收(Socket sockett){
试一试{
DataInputStream dis=新的DataInputStream(新的BufferedInputStream(sockett.getInputStream());
int number=dis.readInt();
文件[]文件=新文件[编号];
System.out.println(“要接收的文件数:“+Number”);
for(int i=0;i
这里是接收方法,我保存从发送方端发送的文件


任何帮助都将不胜感激。提前感谢。

所以您可以发送文件。你会收到文件。为什么?
提前谢谢。
在接收端点击按钮,我打电话来接受套接字连接。不。这是试图与服务器建立连接的客户端的代码。客户端不接受连接。如果发件人是服务器,则只能发送到连接的客户端。当然,服务器不能启动客户机。重新思考。@greenapps是的,你是对的。我只在发送方端接受连接,但我的问题是,我如何在不反复单击接收按钮的情况下接收文件,我的意思是,当发送方接受连接并发送文件而不反复单击按钮时,如何调用接收方法??顺便说一句,谢谢你的回复。所以你发送文件。你会收到文件。为什么?
提前谢谢。
在接收端点击按钮,我打电话来接受套接字连接。不。这是试图与服务器建立连接的客户端的代码。客户端不接受连接。如果发件人是服务器,则只能发送到连接的客户端。当然,服务器不能启动客户机。重新思考。@greenapps是的,你是对的。我只在发送方端接受连接,但我的问题是,我如何在不反复单击接收按钮的情况下接收文件,我的意思是,当发送方接受连接并发送文件而不反复单击按钮时,如何调用接收方法??顺便说一句,谢谢你的回复。