Android 我必须重新启动Java套接字连接以进行多文件传输
我已经为Android创建了一个小型服务器客户端程序。除了一件事,它的工作方式很有魅力。文件传输的第一个会话可以正常工作,但当我尝试发送另一个文件时,如果不重新启动套接字连接,我就无法完成。我想做到这一点: 1.启动Android服务器 2.连接远程客户端 3.在同一会话中传输任意数量的文件(无需重新启动服务器和重新连接客户端) 怎样才能做到呢?任何帮助都将不胜感激! 以下是我的代码片段: 服务器端方法:Android 我必须重新启动Java套接字连接以进行多文件传输,android,sockets,client-server,Android,Sockets,Client Server,我已经为Android创建了一个小型服务器客户端程序。除了一件事,它的工作方式很有魅力。文件传输的第一个会话可以正常工作,但当我尝试发送另一个文件时,如果不重新启动套接字连接,我就无法完成。我想做到这一点: 1.启动Android服务器 2.连接远程客户端 3.在同一会话中传输任意数量的文件(无需重新启动服务器和重新连接客户端) 怎样才能做到呢?任何帮助都将不胜感激! 以下是我的代码片段: 服务器端方法: public void initializeServer() { try {
public void initializeServer() {
try {
serverSocket = new ServerSocket(4444);
runOnUiThread( new Runnable() {
@Override
public void run() {
registerLog("Server started successfully at: "+ getLocalIpAddress());
registerLog("Listening on port: 4444");
registerLog("Waiting for client request . . .");
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("Listen failed", "Couldn't listen to port 4444");
}
try {
socket = serverSocket.accept();
runOnUiThread( new Runnable() {
@Override
public void run() {
registerLog("Client connected: "+socket.getInetAddress());
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("Acceptance failed", "Couldn't accept client socket connection");
}
}
正在向客户端发送文件:
public void sendFileDOS() throws FileNotFoundException {
runOnUiThread( new Runnable() {
@Override
public void run() {
registerLog("Sending. . . Please wait. . .");
}
});
final long startTime = System.currentTimeMillis();
final File myFile= new File(filePath); //sdcard/DCIM.JPG
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
try {
dis.readFully(mybytearray, 0, mybytearray.length);
OutputStream os = socket.getOutputStream();
//Sending file name and file size to the server
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(myFile.getName());
dos.writeLong(mybytearray.length);
dos.write(mybytearray, 0, mybytearray.length);
dos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
runOnUiThread( new Runnable() {
@Override
public void run() {
long estimatedTime = (System.currentTimeMillis() - startTime)/1000;
registerLog("File successfully sent");
registerLog("File size: "+myFile.length()/1000+" KBytes");
registerLog("Elapsed time: "+estimatedTime+" sec. (approx)");
registerLog("Server stopped. Please restart for another session.");
}
});
}
客户端(在PC上运行):
试着在之后冲洗一下
output.write(buffer, 0, bytesRead);
如果这仍然不起作用,我发现我的服务器/客户机与objectoutputstreams配合使用效果最好,您可以使用以下方式
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
// always call flush and reset after sending anything
oos.writeObject(server.getPartyMembersNames());
oos.flush();
oos.reset();
YourObject blah = (YourObject) ois.readObject();
试着在之后冲洗一下
output.write(buffer, 0, bytesRead);
如果这仍然不起作用,我发现我的服务器/客户机与objectoutputstreams配合使用效果最好,您可以使用以下方式
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
// always call flush and reset after sending anything
oos.writeObject(server.getPartyMembersNames());
oos.flush();
oos.reset();
YourObject blah = (YourObject) ois.readObject();