2014-02-19 198 views
0

Android應用程序是運行在API 19上的模擬Nexus設備上的服務器,而客戶端是將應用程序發送到服務器以顯示在其上的Java應用程序。我無法設法連接這兩個。我正在使用localhost:5001連接到android設備,連接正在被拒絕。仿真器上的Android應用程序一直在運行,並在同一端口上接受連接。我認爲端口是問題,但有誰知道我該如何正確配置?通過套接字連接Android設備和Java應用程序

Java代碼:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.Socket; 

public class Server { 
    public static final int PORT = 5001; 
    public static final String IP_ADDRESS = "localhost";// "10.0.2.2"; 
    public static Socket ss; 
    public static final String FILE = "slika.jpg"; 

    public static void main(String[] args) throws InterruptedException { 
     boolean finished = false; 
     while (!finished) { 
      try { 
       System.out.println("Waiting..."); 
       ss = new Socket(IP_ADDRESS, PORT); 
       System.out.println("Connected!"); 
       OutputStream out = ss.getOutputStream(); 
       File file = new File(FILE); 
       System.out.println("File size: " + file.length()); 
       finished = true; 
       byte[] b = new byte[(int) file.length()]; 
       out.write((int)file.length()); 
       try { 
        FileInputStream fileInputStream = new FileInputStream(file); 
        fileInputStream.read(b); 
       } catch (FileNotFoundException e) { 
        System.out.println("File Not Found."); 
        e.printStackTrace(); 
       } catch (IOException e1) { 
        System.out.println("Error Reading The File."); 
        e1.printStackTrace(); 
       } 
       out.write(b); 
       out.flush(); 
       System.out.println("Finished sending!"); 
      } catch (Exception e) { 
       Thread.sleep(1000); 
      } finally { 
       if (ss != null) 
        try { 
         ss.close(); 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
      } 

     } 
    } 
} 

的Android代碼:

package com.example.filereceiver; 

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    public static final int PORT = 5001; 
    TextView informator; 
    ImageView image; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     informator = (TextView) findViewById(R.id.informator); 
     image = (ImageView) findViewById(R.id.image); 
     informator.setText("Waiting!"); 
     Log.i("DEBUGGER","Waiting!"); 

     new Thread() { 

      @Override 
      public void run() { 
       ServerSocket listener = null; 
       Log.i("DEBUGGER","Waiting for connection"); 
       try { 
        listener = new ServerSocket(PORT); 
        Socket sock = listener.accept(); 
        Log.i("DEBUGGER","Connected"); 
        InputStream in = sock.getInputStream(); 
        int size = in.read(); 
        byte[] b = new byte[size]; 
        in.read(b); 
        Bitmap myBitmap = BitmapFactory.decodeByteArray(b, 0, size); 
        image.setImageBitmap(myBitmap); 
        MainActivity.this.runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          MainActivity.this.informator 
            .setText("TRANSFER COMPLETE!"); 
          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            MainActivity.this) 
            .setSmallIcon(R.drawable.ic_launcher) 
            .setContentTitle("Info") 
            .setContentText("Transfer complete!") 
            .setAutoCancel(true); 
          Intent intent = new Intent(MainActivity.this, 
            MainActivity.class); 
          PendingIntent pi = PendingIntent.getActivity(
            MainActivity.this, 0, intent, 
            Intent.FLAG_ACTIVITY_NEW_TASK); 
          mBuilder.setContentIntent(pi); 
          NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
          mNotificationManager.notify(0, mBuilder.build()); 
         } 

        }); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       }finally{ 
        if(listener!=null)try { 
         listener.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     }.start(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
+0

我在無線網絡上進行了測試,結果發生了很小的變化。但是如果有人知道什麼是實際問題,請寫下它。 – Dejan

回答

0

如果你正在運行的同一局域網下的兩個設備(服務器和客戶端)不指定,在這種情況下你可以拋棄連接問題。如果不是,這可能是一個考驗,但。如果你能夠在同一路由器上將你的客戶端連接到你的服務器,那意味着否則(即使用你的公有IP)有阻止它的東西,可能是你的路由器。另一個問題可能是防病毒,操作系統端口阻塞,路由器端口阻塞...

如果您無法在同一個路由器連接下都連接,肯定是代碼問題。我建議在連接片段中加入幾條Log.d()行,看看瓶頸在哪裏,或者使用一些調試工具並放置一些斷點。如果甚至無法連接到設備,可能是您指定的IP地址不正確。看到你的代碼,但是,我看到你正在使用10.0.2.2作爲IP。請記住,這是一個本地主機表示,並不意味着您可以將設備連接到它,這只是意味着該設備可以連接到它自己,我認爲你並沒有試圖達到這一點。使用互聯網本地地址。

+0

它是在同一臺PC上,模擬了Android。 Android正常啓動,我可以在logcat信息中看到。但是我在Java端獲得了ConnectionRefused異常。 – Dejan

+0

我想通過,如果連接是以相反的方式進行,我將需要使用10.0.2.2作爲模擬本地主機,但通過這種方式這個代碼應該工作。 – Dejan

+0

然後,只需在代碼中使用一些'Log.d()'行,就可以知道問題出在什麼地方(我猜你會搞砸IP)。 – nKn

相關問題