Android 我必须重新启动Java套接字连接以进行多文件传输

Android 我必须重新启动Java套接字连接以进行多文件传输,android,sockets,client-server,Android,Sockets,Client Server,我已经为Android创建了一个小型服务器客户端程序。除了一件事,它的工作方式很有魅力。文件传输的第一个会话可以正常工作,但当我尝试发送另一个文件时,如果不重新启动套接字连接,我就无法完成。我想做到这一点: 1.启动Android服务器 2.连接远程客户端 3.在同一会话中传输任意数量的文件(无需重新启动服务器和重新连接客户端) 怎样才能做到呢?任何帮助都将不胜感激! 以下是我的代码片段: 服务器端方法: public void initializeServer() { try {

我已经为Android创建了一个小型服务器客户端程序。除了一件事,它的工作方式很有魅力。文件传输的第一个会话可以正常工作,但当我尝试发送另一个文件时,如果不重新启动套接字连接,我就无法完成。我想做到这一点: 1.启动Android服务器 2.连接远程客户端 3.在同一会话中传输任意数量的文件(无需重新启动服务器和重新连接客户端) 怎样才能做到呢?任何帮助都将不胜感激! 以下是我的代码片段: 服务器端方法:

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();