Java 通过套接字连接发送数据
我正在做一个android应用程序,其中我必须设置一个类似ShareIt的功能,从一个设备到另一个设备发送和接收文件。 我能够做到这一点,但我必须从接收端一次又一次地手动调用receive方法。 我想问一下,当发送者选择文件后点击发送按钮时,如何自动判断或启动socket的接收方式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
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是的,你是对的。我只在发送方端接受连接,但我的问题是,我如何在不反复单击接收按钮的情况下接收文件,我的意思是,当发送方接受连接并发送文件而不反复单击按钮时,如何调用接收方法??顺便说一句,谢谢你的回复。