1

Android 用の小さなサーバー クライアント プログラムを作成しました。1つのことを除いて、それは魅力のように機能しています. ファイル転送の最初のセッションは問題なく動作しますが、別のファイルを送信しようとすると、ソケット接続を再起動しないと送信できません。私はこれを達成したかった: 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 上で実行):

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

1 に答える 1