我正在使用套接字从Android到Android使用WiFi Direct传输文件。我开始使用以下代码发送文件
String[] filesPath = data.getStringArrayExtra("all_path");
Intent serviceIntent = new Intent(getActivity(), FileTransferService.class);
serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE);
serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, filesPath);
serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, info.groupOwnerAddress.getHostAddress());
serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988);
getActivity().startService(serviceIntent);
服务代码是:
@Override
protected void onHandleIntent(Intent intent)
{
Context context = getApplicationContext();
if (intent.getAction().equals(ACTION_SEND_FILE))
{
//String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);
String[] files = intent.getExtras().getStringArray(EXTRAS_FILE_PATH);
String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS);
Socket socket = new Socket();
int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);
try
{
Log.d(WiFiDirectActivity.TAG, "Opening client socket - ");
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
Log.d(WiFiDirectActivity.TAG, "Client socket - " + socket.isConnected());
ArrayList<File> filesList = new ArrayList<File>();
for (String file : files)
{
filesList.add(new File(Uri.parse("file://" + file).getPath()));
}
send(filesList, socket);
}
catch (IOException e)
{
e.printStackTrace();
Log.e(WiFiDirectActivity.TAG, e.getMessage());
}
finally
{
if (socket.isConnected())
{
try
{
socket.close();
}
catch (IOException e)
{
// Give up
e.printStackTrace();
}
}
}
}
}
发送文件方法:
public void send(ArrayList<File> files, Socket socket)
{
try
{
//DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
System.out.println(files.size());
//write the number of files to the server
dos.writeInt(files.size());
dos.flush();
//write file names
for (File file1 : files)
{
dos.writeUTF(file1.getName());
dos.flush();
}
//buffer for file writing, to declare inside or outside loop?
int n;
byte[] buf = new byte[1024 * 8];
//outer loop, executes one for each file
for (File file : files)
{
System.out.println(file.getName());
FileInputStream fis = new FileInputStream(file);
dos.writeLong(file.length());
dos.flush();
while ((n = fis.read(buf)) != -1)
{
dos.write(buf, 0, n);
dos.flush();
}
}
dos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
接收方代码是:
@Override
protected String doInBackground(Void... params)
{
try
{
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(8988));
//ServerSocket serverSocket = new ServerSocket(8988);
Log.d(WiFiDirectActivity.TAG, "Server: Socket opened");
Socket client = serverSocket.accept();
Log.d(WiFiDirectActivity.TAG, "Server: connection done");
receive(client);
return "";
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
}
public void receive(Socket socket)
{
try
{
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
//read the number of files from the client
int number = dis.readInt();
ArrayList<File> files = new ArrayList<File>(number);
System.out.println("Number of Files to be received: " + number);
//read file names, add files to arraylist
for (int i = 0; i < number; i++)
{
File file = new File(dis.readUTF());
files.add(file);
}
int n;
byte[] buf = new byte[1024 * 8];
for (File file : files)
{
System.out.println("Receiving file: " + file.getName());
final File f = new File(Environment.getExternalStorageDirectory() + "/WiFiDirect/" + file.getName());
File dirs = new File(f.getParent());
if (!dirs.exists())
{
dirs.mkdirs();
}
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
long fileSize = dis.readLong();
while (fileSize > 0 && (n = dis.read(buf, 0, (int) Math.min(buf.length, fileSize))) != -1)
{
fos.write(buf, 0, n);
fileSize -= n;
}
fos.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (socket.isConnected())
{
try
{
socket.close();
}
catch (IOException e)
{
// Give up
e.printStackTrace();
}
}
}
}
所有代码都运行良好,当我第一次在两个应用程序上启动应用程序时,文件传输成功。但在第二次文件传输失败的接收方,
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(8988));
上面第三行代码serverSocket.bind(new InetSocketAddress(8988));抛出异常 java.net.BindException:绑定失败:EADDRINUSE(地址已在使用中) 如何解决此异常?任何建议将不胜感激。 感谢
答案 0 :(得分:5)
我每次都发送服务但是没有停止发送文件,是否需要在再次发送之前停止服务?
是的,当然有,否则它仍在侦听端口8988,所以你无法启动另一个实例。
如果是,那么最好的方法是什么?
杀死旧的。但是,为什么你在它已经运行时启动呢?