簡體   English   中英

通過套接字連接Android設備和Java應用

[英]Connecting Android device and Java app over socket

Android應用是運行在API 19上的模擬Nexus設備上的服務器,客戶端是Java應用,它將圖像發送到服務器以在其上顯示。 我無法連接這兩個。 我正在使用localhost:5001連接到android設備,並且連接被拒絕。 模擬器上的Android應用始終運行,並在同一端口上接受連接。 我認為端口有問題,但是沒有人知道我該如何正確配置它?

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;
    }

}

您無需指定是否在同一局域網中同時運行兩個設備(服務器和客戶端),在這種情況下可以丟棄連接問題。 如果不是,那可能是一個測試。 如果您能夠將客戶端連接到同一路由器下的服務器,則意味着否則(即使用您的公共IP)存在某種阻止它的東西,可能是您的路由器。 另一個問題可能是防病毒,操作系統端口被阻止,路由器端口被阻止...

如果您無法在同一路由器連接下同時連接這兩者,則絕對是代碼問題。 我建議在雙方的連接片段中放置幾行Log.d()行,看看瓶頸在哪里,或者使用一些調試工具並放置一些斷點。 如果連設備都無法訪問,則可能是您指定了錯誤的IP地址。 不過,看到您的代碼,我看到您正在使用10.0.2.2作為IP。 請記住,這是一個localhost表示形式,並不意味着您可以將設備連接到它,這僅意味着該設備可以連接到其自身,我想您並不是在嘗試實現它。 請改用Internet本地地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM