2012-01-19 99 views
5

需要帮助...我已经理解如何使服务器 - 客户端套接字连接...它工作fie ...现在我想从服务器传输文件到客户端,并返回....这里是我的消息来源......android套接字文件传输

套接字服务器...

public class ServerActivity extends Activity { 

private TextView serverStatus; 

// default ip 
public static String SERVERIP = "192.168.1.1"; 

// designate a port 
public static final int SERVERPORT = 8080; 

private Handler handler = new Handler(); 

private ServerSocket serverSocket; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    serverStatus = (TextView) findViewById(R.id.server_status); 

    SERVERIP = getLocalIpAddress(); 

    Thread fst = new Thread(new ServerThread()); 
    fst.start(); 
} 

public class ServerThread implements Runnable { 

    public void run() { 
     try { 
      if (SERVERIP != null) { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         serverStatus.setText("Listening on IP: " + SERVERIP); 
        } 
       }); 
       serverSocket = new ServerSocket(SERVERPORT); 
       while (true) { 
        // listen for incoming clients 


        Socket client = serverSocket.accept(); 
        ///////////////////////////////// 
        File myFile = new File ("/sdcard/frostwire.apk"); 
        byte [] mybytearray = new byte [(int)myFile.length()]; 
        FileInputStream fis = new FileInputStream(myFile); 
        BufferedInputStream bis = new BufferedInputStream(fis); 
        bis.read(mybytearray,0,mybytearray.length); 
        OutputStream os = client.getOutputStream(); 
        System.out.println("Sending..."); 
        serverStatus.setText("sending 123.exe..."); 
        os.write(mybytearray,0,mybytearray.length); 
        os.flush(); 
        client.close(); 
        //////////////////////////// 

        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          serverStatus.setText("Connected."); 
         } 
        }); 

        try { 
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
         String line = null; 
         while ((line = in.readLine()) != null) { 
          Log.d("ServerActivity", line); 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 
            // do whatever you want to the front end 
            // this is where you can be creative 
           } 
          }); 
         } 
         break; 
        } catch (Exception e) { 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
           serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); 
          } 
         }); 
         e.printStackTrace(); 
        } 
       } 
      } else { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         serverStatus.setText("Couldn't detect internet connection."); 
        } 
       }); 
      } 
     } catch (Exception e) { 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        serverStatus.setText("Error"); 
       } 
      }); 
      e.printStackTrace(); 
     } 
    } 
} 

// gets the ip address of your phone's network 
private String getLocalIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e("ServerActivity", ex.toString()); 
    } 
    return null; 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    try { 
     // make sure you close the socket upon exiting 
     serverSocket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

客户端的Socket ...源

public class ClientActivity extends Activity { 

private EditText serverIp; 

private Button connectPhones; 

private String serverIpAddress = ""; 

private boolean connected = false; 

private Handler handler = new Handler(); 
int filesize; // filesize temporary hardcoded 

long start = System.currentTimeMillis(); 
int bytesRead; 
int current = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.client); 

    serverIp = (EditText) findViewById(R.id.server_ip); 
    connectPhones = (Button) findViewById(R.id.connect_phones); 
    connectPhones.setOnClickListener(connectListener); 
} 

private OnClickListener connectListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start(); 
      } 
     } 
    } 
}; 

public class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
      connected = true; 
    //////////  // receive file 
      byte [] mybytearray = new byte [filesize]; 
      InputStream is = socket.getInputStream(); 
      FileOutputStream fos = new FileOutputStream("/sdcard/frostwire.apk"); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(mybytearray,0,mybytearray.length); 
      current = bytesRead; 


      do { 
       bytesRead = 
        is.read(mybytearray, current, (mybytearray.length-current)); 
       if(bytesRead >= 0) current += bytesRead; 
      } while(bytesRead > -1); 

      bos.write(mybytearray, 0 , current); 
      bos.flush(); 
      long end = System.currentTimeMillis(); 
      System.out.println(end-start); 
      bos.close(); 
      socket.close(); 

    //////////////////////////////  
      while (connected) { 
       try { 
        Log.d("ClientActivity", "C: Sending command."); 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
         // where you issue the commands 
         out.println("Hey Server!"); 
         Log.d("ClientActivity", "C: Sent."); 
       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 
      } 
      socket.close(); 
      Log.d("ClientActivity", "C: Closed."); 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 
} 
} 

件所生产的 “///////” 唐标't work ....帮助

+0

只是说“它不起作用”并不是什么线索......你可能试着更好地解释它吗?它可以帮助我们帮助你。 –

+0

套接字服务器提供了一个错误...据我所知,错误是: – timonvlad

+0

byte [] mybytearray = new byte [filesize]; InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream(“/ sdcard/frostwire.apk”); BufferedOutputStream bos = new BufferedOutputStream(fos); bytesRead = is.read(mybytearray,0,mybytearray.length); current = bytesRead; do { bytesRead = is.read(mybytearray,current,(mybytearray.length-current)); if(bytesRead> = 0)current + = bytesRead; – timonvlad

回答

1


更好您替换下面的代码

do { 
       bytesRead = 
        is.read(mybytearray, current, (mybytearray.length-current)); 
       if(bytesRead >= 0) current += bytesRead; 
      } while(bytesRead > -1); 

用下面的

do { 
       bytesRead =is.read(mybytearray, current, (mybytearray.length-current)); 
       if(bytesRead > 0) 
       { 
        current += bytesRead; 
       } 
    } while(bytesRead > 0); 


那就试试吧

0

通过上面的讨论会后,我想补充一些评论 -

  1. 你有没有在Android清单文件中添加读取sdcard的权限代码?如果没有,则应在服务器访问外部存储器时添加以下代码。为客户做也写在外部存储。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

  • 否则,你提供的目录是不正确的。检查目录。

  • 在客户端程序中,您已经定义了file_size,该程序中没有任何值没有赋值。

  • 我还想建议,客户端程序中的file_size应该大于要传输的文件,大小以字节为单位。