2017-01-15 16 views
-3

AndroidデバイスをWindowsラップトップとUSBケーブルでクライアント/サーバーブリッジとして接続したいと考えています。私はJavaでクライアントコードを書いた。私のデバイスが私のWiFiモデムに接続され、私のラップトップもLANケーブルで接続されているとき、私はアプリケーションのデスクトップ上のデバイスIPをサーバーソケットに接続するためのアドレスとして設定します。しかし、私のWiFiモデムがオフで、私はAndroidデバイスとノートパソコンをUSBケーブルで接続したいと思っています。デバイスのIPアドレスが使用できないため、Androidデバイスに接続できません。AndroidデバイスにPCを接続してUSBケーブル経由でクライアント/サーバーリンクを形成

もう1つ質問:USBケーブルでIPアドレスでサーバとオープンソケットに接続できますか?

Androidのコード

public class ActivityMain extends AppCompatActivity { 
private Button button ; 
public static final int TIMEOUT = 10; 
private String connectionStatus = null; 
private Handler mHandler = null; 
private ServerSocket serverSocket = null; 
private Socket socket = null; 
private ObjectOutputStream objectOutputStream; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
button = (Button) findViewById(R.id.button); 

configure_button(); 
} 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 10: 
     configure_button(); 
     break; 
     default: 
     break; 
    } 
    } 
    void configure_button() { 
    // first check for permissions 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
     ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
     ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET)    != PackageManager.PERMISSION_GRANTED) { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.INTERNET}, 10); 
     } 
     return; 
    } 
    //this code won't execute if permissions are not allower, because in the line above there is return statement. 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     //initialize serverSocket socket in a new separate thread 
     new Thread(initializeConnection).start(); 
     String msg = "Attempting to connect"; 
     Toast.makeText(ActivityMain.this, msg, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    } 

    //threads 
    private final Runnable initializeConnection = new Thread(){ 
@Override 
public void run() { 
    // initialize server socket 
    try { 
    serverSocket = new ServerSocket(38300); 
    serverSocket.setSoTimeout(ActivityMain.TIMEOUT * 1000); 

    //attempt to accept a connection 
    socket = serverSocket.accept(); 

    objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
    try { 
     while(true) { 
     for (int i = 0; i < 1000; i++) { 
      //objectOutputStream.reset(); 
      objectOutputStream.writeObject("number" + i); 
      // objectOutputStream.writeBytes("number"+i); 
      System.out.println("send>" + "number" + i); 
     } 
     } 
    } catch (IOException ioException) { 
     //Log.e(ActivityMain.TAG, "" + ioException); 
    } 
    } catch (SocketTimeoutException e) { 
    connectionStatus = "Connection has timed objectOutputStream! Please try again"; 
    // mHandler.post(showConnectionStatus); 
    } 
    catch(IOException e) 
    { 
    //Log.e(ActivityMain.TAG, ""+e); 
    } 

    if(socket != null) 
    { 
    connectionStatus = "Connection was succesful"; 
    // mHandler.post(showConnectionStatus); 
    } 
} 
}; 
} 

クライアントコード

public class CCC { 
    public static void main(String[] args) 
    { 
     System.out.println("hi"); 
     Socket echoSocket = null; 
     ObjectOutputStream out = null; 
     ObjectInputStream in = null; 
     String message = ""; 

     // Create socket connection with host address as localhost and port number with 38300 
     try 
     { 
      echoSocket = new Socket("192.168.1.19", 38300); 

      in = new ObjectInputStream(echoSocket.getInputStream()); 

      // Communicating with the server 
      try 
      { 
       while(true){ 
       message = (String) in.readObject(); 
       System.out.println("server>" + message); 

       } 
      } 
      catch (ClassNotFoundException classNot) 
      { 
       System.err.println("data received in unknown format"); 
      } 
     } 
     catch (UnknownHostException e) 
     { 
      System.err.println("Don't know about host: LocalHost."); 
      System.exit(1); 
     } 
     catch (IOException e) 
     { 
      System.err.println("Couldn't get I/O for " + "the connection to: LocalHost:"); 
      System.exit(1); 
     } 
     finally 
     { 
      // Closing connection 
      try 
      { 
       in.close(); 

       if (echoSocket != null) 
       { 
        echoSocket.close(); 
       } 
      } 
      catch (IOException ioException) 
      { 
       ioException.printStackTrace(); 
      } 
     } 
    } 
} 

私は、1秒毎にサーバからクライアントに位置データを送信する必要があります。

+0

あなたの努力を私たちに教えてください。何か試しましたか?あなたはどこで失敗しましたか? – rupinderjeet

+0

@rupinderjeetコードが追加されました。私はクライアント - サーバー間でWIFI接続を使用しています。私はAndroidデバイスのIPとiをテキストファイルに書き込んでおり、クライアントではテキストファイルを読み取り、サーバーに接続するためにIPを使用します。エラーが発生し、クライアントとサーバーに接続できません。 – Desert

答えて

0

クライアントコードでは、while(true)を使用して無限にObjectInputStreamを読み込んでいます。あなたがファイルの終わりに達すると、あなたはループを壊すことはありません。

プログラムはファイルの最後に達しているため、これ以上読み取ることができないため、EOFExceptionがスローされる可能性があります。これを確認するにはif(in.readObject() != null)を使用してください。例外をキャッチして自然に処理する必要があります。

try { 
    while(true) { 
     message = in.readObject(); 
     System.out.println("server>" + message); 
    } 
} catch (EOFException e) { 
    // handle exception 
    System.out.println("Reached end of file while reading."); 
} 

EOFExceptionは、ループを壊すのに役立ちます。

+0

私は 'OutPutStream'オブジェクトに1秒おきに位置データを置く必要があります。 'InputStream'オブジェクトを使ってクライアントサイドで読むと、私のコードは変更されましたが、まだ問題があります。私はローカルIPを持っていますが、私はUSBケーブルを使ってIPを持っていません。どうすれば私のクライアント側にアドレスを与えてサーバーを見つけるべきですか? – Desert

0

最後に答えが見つかりました。 PCとAndroidデバイスのClient-Serverフォームを通信します。 ADBを使用する必要があります。あなたのPCにadbの場所を入れて> adb forward tcp:38300(例:38300)のポート番号を入力してください:tcp:38300 このコマンドを使用した後でIDEを閉じる必要があります。このようなAndroidデバイスのIP-> echoSocket = new Socket( "localhost"、38300); とされています。

関連する問題