android - 我必须重新启动我的 Java 套接字连接才能进行多文件传输

标签 android sockets client-server

我为 Android 创建了一个小型服务器客户端程序。除了一件事,它就像魅力一样工作。文件传输的第一个 session 没有任何问题,但是当我尝试发送另一个文件时,如果不重新启动套接字连接就无法完成。我想实现这一点: 1.启动安卓服务器 2.连接远程客户端 3. 在同一 session 中传输尽可能多的文件(无需重新启动服务器和重新连接客户端) 如何做呢?任何帮助,将不胜感激! 这是我的代码 fragment : 服务器端方法:

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 上运行):

public class myFileClient {
final static String servAdd="10.142.198.127";
static String filename=null;
static Socket socket = null;
static Boolean flag=true;

/**
 * @param args
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    initializeClient();
    receiveDOS();       
}
public static void initializeClient () throws IOException {
    InetAddress serverIP=InetAddress.getByName(servAdd);
    socket=new Socket(serverIP, 4444);
}
public static void receiveDOS() {
    int bytesRead;
    InputStream in;
    int bufferSize=0;

    try {
        bufferSize=socket.getReceiveBufferSize();
        in=socket.getInputStream();
        DataInputStream clientData = new DataInputStream(in);
        String fileName = clientData.readUTF();
        System.out.println(fileName);
        OutputStream output = new FileOutputStream("//home//evinish//Documents//Android//Received files//"+ fileName);
        long size = clientData.readLong();
        byte[] buffer = new byte[bufferSize];
        while (size > 0
                && (bytesRead = clientData.read(buffer, 0,
                        (int) Math.min(buffer.length, size))) != -1) {
            output.write(buffer, 0, bytesRead);
            size -= bytesRead;
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

最佳答案

尝试在之后冲洗

output.write(buffer, 0, bytesRead);

如果这仍然不起作用,我发现我的服务器/客户端最适合您按以下方式使用的对象输出流。

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

关于android - 我必须重新启动我的 Java 套接字连接才能进行多文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261629/

相关文章:

client-server - 网络本地主机

sockets - 握手后立即发送 WebSocket 消息

android - Xamarin Android.App.DialogFragment 已过时

android - Gradle “MyApplication4”项目刷新失败错误:连接被拒绝:connect

java - 等待很长时间后套接字连接失败

ios - 如何在 Swift 语言中使用 XMPPStream XMPP 框架发送图像?

java - 我不明白Android AutoCompleteTextView ArrayAdapter的构造函数

javascript - undefined 不是一个对象(评估 'this.props.navigation' )

c++ - 如何从 C++ 中的二进制数据包中提取 GUID?

delphi - 关于将来自 DataSnap REST 服务器的单元用于客户端项目的意见