質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

解決済

2台のアンドロイドスマホでソケット通信の使い方を教えてください。

H30_inenaga
H30_inenaga

総合スコア18

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0評価

1クリップ

8935閲覧

投稿2018/10/15 04:31

編集2018/10/16 03:18

###解決したいこと
ソケット通信のプログラミングを、AndroidStudioにて終えました。
無事、ビルドもランもできています。

ただ、私、通信の知識に疎いので、これから通信に関して色々とお聞きしたいことがあります。
手始めとして、ソケット通信を2台のスマホで行うためには、IPアドレスと、ポート番号は何番を入力すればよいのでしょうか?
※ちなみに自前のWifiルータを使用していますが、携帯回線(wifiルータなし)でも通信できるのでしょうか?

[1]「設定」の歯車アイコンをタップ→無線とネットワークの項目から「Wi-Fi」をタップ→右上にある歯車アイコンをタップ→IPアドレス
[2]https://www.cman.jp/network/support/go_access.cgi

[1]で行って確認するIPアドレスと、[2]で行うIPアドレスが違うのですが、なぜなのでしょうか?
あと、実行すると、Runはできているが、通信失敗しました2というメッセージが表示されます。
通信失敗しました2というのはソースコードをご覧いただければ幸いです。

以下にソースコードを掲載します。//ここを教えてください というコメントが2点ございますので先の疑問点とともに指摘いただければ幸いです。
###ソースコード

java

import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; //ソケット通信 public class MainActivity extends Activity implements View.OnClickListener{ private final static String BR = System.getProperty("line.separator"); private final static int WC = ViewGroup.LayoutParams.WRAP_CONTENT; private final static int MP = ViewGroup.LayoutParams.MATCH_PARENT; //IPアドレスの指定 private final static String IP = "000.000.000.000";//変更必須 private TextView lblReceive; //受信ラベル private EditText edtSend; //送信エディットテキスト private Button btnSend; //送信ボタン private Socket socket ; //ソケット private InputStream in; //入力ストリーム private OutputStream out; //出力ストリーム private boolean error; //エラー private final Handler handler = new Handler();//ハンドラ //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //レイアウトの生成 LinearLayout layout = new LinearLayout(this); layout.setBackgroundColor(Color.BLACK); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //送信エディトテキストの生成 edtSend = new EditText(this) ; edtSend.setText(""); edtSend.setOnClickListener(this); layout.addView(edtSend); //送信ボタンの生成 btnSend = new Button(this) ; btnSend.setText("送信"); btnSend.setOnClickListener(this); layout.addView(btnSend); //受信ラベルの生成 lblReceive = new TextView(this); lblReceive.setText(""); lblReceive.setTextSize(20.0f); lblReceive.setTextColor(Color.BLUE); lblReceive.setLayoutParams(new LinearLayout.LayoutParams(MP,WC)); layout.addView(lblReceive); } //アクティビティ開始時に呼ばれる @Override public void onStart() { super.onStart(); //スレッドの生成 Thread thread = new Thread(){ public void run() { try { connect(IP, 8081); } catch (Exception e) { } } }; thread.start(); } //アクティビティの停止時に呼ばれる @Override public void onStop(){ super.onStop(); disconnect(); } //受信テキストの追加 private void addText(final String text) { //ハンドラの生成 handler.post(new Runnable(){ public void run() { lblReceive.setText(text+BR+lblReceive.getText()); } }); } // 接続 private void connect(String ip, int port) { int size ; String str ; byte[] w = new byte[1024] ; try{ //ソケット通信 addText("接続中"); socket = new Socket(ip, port) ; in = socket.getInputStream() ; out = socket.getOutputStream(); addText("接続完了"); //受信ループ while (socket != null && socket.isConnected()) { //データの受信 size = in.read(w); if (size <= 0) continue ; str = new String(w, 0, size, "UTF-8"); //ラベルへの文字追加 addText("通信失敗しました1"); } } catch (Exception e) { addText("通信失敗しました2"); } } //切断 private void disconnect() { try { socket.close(); socket = null ; } catch (Exception e) { } } //ボタンクリックイベントの処理 public void onClick(View v) { //スレッドの生成 Thread thread = new Thread(new Runnable() {public void run(){ error = false ; try { //データの送信 if (socket != null && socket.isConnected()){ byte[] w = edtSend.getText().toString().getBytes("UTF8"); out.write(w) ; out.flush(); } } catch (Exception e) { error = true ; } //ハンドラの生成 handler.post(new Runnable(){ public void run(){ if(!error){ edtSend.setText(""); } else { addText("通信失敗しました3"); } }}); }}); thread.start(); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。