2014-02-19 147 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

相关问题