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

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

ただいまの
回答率

88.93%

androidソケット通信について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 190

snowdropAPP

score 34

前提・実現したいこと

今android studioを使ってアンドロイドエミュレーター仮想デバイスを使用してPCとソケット通信を行いたいと思っています。

発生している問題・エラーメッセージ

AndroidプログラミングバイブルSDK7の布留川栄一さん著書の本を読んでソケット通信のページがあったのでとりあえず記述してみました。
私の考えではコピペしているのでエラーは出ないと思っていたのですがコードの記述ミスかSDKが間違っているのか何が違うのかわかりませんがコードのいたるところに赤波線と赤文字が表示されます。
本に書いていることをそのまま記述してエラーっていうのはほかの設定が間違っているから?

エラーの出ている箇所はコードのほうで記述しようと思うので何が違うか教えてください。
当方かなりの初心者なのでお手柔らかにお願いします。

該当のソースコード

package net.npaka.socketex;
import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
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;   //エラー①InputStreamが赤文字
import java.io.OutputStream;
import java.net.Socket;


//ソケット通信
public class SocketEX 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 = "入力済み";

    private TextView lblReceive;
    private EditText edtSend;
    private Button btnSend;

    private Socket socket;
    private java.io.InputStream in; //エラー②InputStreamが赤文字
    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);
        //LAYOUTの作成
        LinearLayout layout = new LinearLayout(this);
        layout.setBackgroundColor(Color.WHITE);
        layout.setOrientation(LinearLayout.VERTICAL);
        setContentView(layout);

        //送信エディットテキストの生成
        edtSend = new EditText(this);
        edtSend.setText("");
        edtSend.setLayoutParams(new LinearLayout.LayoutParams(MP, WC));
        layout.addView(edtSend);

        //送信ボタンの作成
        btnSend = new Button(this);
        btnSend.setText("送信");
        btnSend.setOnClickListener(this);
        btnSend.setLayoutParams(new LinearLayout.LayoutParams(WC, WC));

        //受信ラベルの作成
        lblReceive = new TextView(this);
        lblReceive.setText("");
        lblReceive.setTextSize(16.0f);
        lblReceive.setTextColor(Color.BLACK);
        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() {  //エラー③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); //エラー④Socketに赤波線
            in = socket.getInputStream();
            out = socket.getOutputStream();
            addText("接続完了");

            //受信ループ
            while (socket != null && socket.isConnected()) {
                //データの受信
                size = in.read(w); //エラー⑤readが赤文字
                if (size <= 0) continue;
                str = new String(w, 0, size, "UTF-8");  //エラー⑥Stringに赤波線
                addText(str);
            }
        } catch (Exception e) {
            addText("通信に失敗しました");
        }
    }
    //切断
    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"); //getBytesに赤波線
                    out.write(w);
                    out.flush();
                }
            }
            catch (Exception e){
                error = true;
            }
            //ハンドラの生成
            handler.post(new Runnable(){public void run(){ //エラー⑧Runnable に赤波線
                if(!error) {
                    edtSend.setText("");
                }else{
                    addText("通信失敗しました");
                }
            }});
        }});
        thread.start();
    }
}

試したこと

コンテキストアクションにて表示されることを試したり、エクリプス(テキストエディタ)に張り付けてみたり、、、
ちなみにIPは入力してます
マニフェストファイルにパーミッションの追加もしています
InputStreamをInoutStreamReaderにしたり、、、

補足情報(FW/ツールのバージョンなど)

仮想デバイスの情報
Pixel 3a 
レゾリューション 1080*2220
API 30
ターゲット Android 10.0+
CPU/ABI  x86 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/07/06 12:00

    エラーが出るならエラーメッセージをそのままコピペで提示しましょう

    キャンセル

  • snowdropAPP

    2020/07/06 13:14

    ログキャットを見てみると何も表示されておりません
    エラーというよりコンパイルが通らない状態になっています

    キャンセル

回答 1

check解決した方法

0

解決いたしました
どうやらマニフェストファイルにてデフォルトのアクティビティが見つからなかったようで正しくアクテビティを設定したところ解決いたしました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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