前提・実現したいこと
今android studioを使ってアンドロイドエミュレーター仮想デバイスを使用してPCとソケット通信を行いたいと思っています。
発生している問題・エラーメッセージ
AndroidプログラミングバイブルSDK7の布留川栄一さん著書の本を読んでソケット通信のページがあったのでとりあえず記述してみました。
私の考えではコピペしているのでエラーは出ないと思っていたのですがコードの記述ミスかSDKが間違っているのか何が違うのかわかりませんがコードのいたるところに赤波線と赤文字が表示されます。
本に書いていることをそのまま記述してエラーっていうのはほかの設定が間違っているから?
エラーの出ている箇所はコードのほうで記述しようと思うので何が違うか教えてください。
当方かなりの初心者なのでお手柔らかにお願いします。
該当のソースコード
Java
1package net.npaka.socketex; 2import android.app.Activity; 3import android.graphics.Color; 4import android.os.AsyncTask; 5import android.os.Bundle; 6import android.os.Handler; 7import android.view.View; 8import android.view.ViewGroup; 9import android.view.Window; 10import android.widget.Button; 11import android.widget.EditText; 12import android.widget.LinearLayout; 13import android.widget.TextView; 14import java.io.InputStream; //エラー①InputStreamが赤文字 15import java.io.OutputStream; 16import java.net.Socket; 17 18 19//ソケット通信 20public class SocketEX extends Activity 21 implements View.OnClickListener { 22 private final static String BR = System.getProperty("line.separator"); 23 private final static int WC = ViewGroup.LayoutParams.WRAP_CONTENT; 24 private final static int MP = ViewGroup.LayoutParams.MATCH_PARENT; 25 26 //IPアドレスの指定 27 private final static String IP = "入力済み"; 28 29 private TextView lblReceive; 30 private EditText edtSend; 31 private Button btnSend; 32 33 private Socket socket; 34 private java.io.InputStream in; //エラー②InputStreamが赤文字 35 private OutputStream out; 36 private boolean error; 37 38 private final Handler handler = new Handler(); 39 40 @Override 41 public void onCreate(Bundle bundle) { 42 super.onCreate(bundle); 43 requestWindowFeature(Window.FEATURE_NO_TITLE); 44 //LAYOUTの作成 45 LinearLayout layout = new LinearLayout(this); 46 layout.setBackgroundColor(Color.WHITE); 47 layout.setOrientation(LinearLayout.VERTICAL); 48 setContentView(layout); 49 50 //送信エディットテキストの生成 51 edtSend = new EditText(this); 52 edtSend.setText(""); 53 edtSend.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); 54 layout.addView(edtSend); 55 56 //送信ボタンの作成 57 btnSend = new Button(this); 58 btnSend.setText("送信"); 59 btnSend.setOnClickListener(this); 60 btnSend.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); 61 62 //受信ラベルの作成 63 lblReceive = new TextView(this); 64 lblReceive.setText(""); 65 lblReceive.setTextSize(16.0f); 66 lblReceive.setTextColor(Color.BLACK); 67 lblReceive.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); 68 layout.addView(lblReceive); 69 } 70 71 //アクティビティ開始時に呼ばれる 72 @Override 73 public void onStart() { 74 super.onStart(); 75 76 //スレッドの作成 77 Thread thread = new Thread() { 78 public void run() { 79 try { 80 connect(IP, 8081); 81 } catch (Exception e) { 82 } 83 84 } 85 }; 86 thread.start(); 87 } 88 //アクティビティ停止時に呼ばれる 89 @Override 90 public void onStop(){ 91 super.onStop(); 92 disconnect(); 93 } 94 private void addText(final String text) { 95 //ハンドラの生成 96 handler.post(new Runnable() { //エラー③Runnableに赤波線 97 public void run() { 98 lblReceive.setText(text + BR + lblReceive.getText()); 99 } 100 }); 101 } 102 //接続 103 private void connect(String ip, int port) { 104 int size; 105 String str; 106 byte[] w = new byte[1024]; 107 try { 108 //ソケット通信 109 addText("接続中"); 110 socket = new Socket(ip, port); //エラー④Socketに赤波線 111 in = socket.getInputStream(); 112 out = socket.getOutputStream(); 113 addText("接続完了"); 114 115 //受信ループ 116 while (socket != null && socket.isConnected()) { 117 //データの受信 118 size = in.read(w); //エラー⑤readが赤文字 119 if (size <= 0) continue; 120 str = new String(w, 0, size, "UTF-8"); //エラー⑥Stringに赤波線 121 addText(str); 122 } 123 } catch (Exception e) { 124 addText("通信に失敗しました"); 125 } 126 } 127 //切断 128 private void disconnect(){ 129 try { 130 socket.close(); 131 socket = null; 132 }catch (Exception e){ 133 } 134 } 135 136 //ボタンをクリックしたときの処理 137 public void onClick(View v){ 138 //スレッドの生成 139 Thread thread = new Thread(new Runnable(){public void run(){ 140 error = false; 141 try { 142 //データの送信 143 if(socket != null && socket.isConnected()){ 144 byte[] w = edtSend.getText().toString().getBytes("UTF8"); //getBytesに赤波線 145 out.write(w); 146 out.flush(); 147 } 148 } 149 catch (Exception e){ 150 error = true; 151 } 152 //ハンドラの生成 153 handler.post(new Runnable(){public void run(){ //エラー⑧Runnable に赤波線 154 if(!error) { 155 edtSend.setText(""); 156 }else{ 157 addText("通信失敗しました"); 158 } 159 }}); 160 }}); 161 thread.start(); 162 } 163}
試したこと
コンテキストアクションにて表示されることを試したり、エクリプス(テキストエディタ)に張り付けてみたり、、、
ちなみにIPは入力してます
マニフェストファイルにパーミッションの追加もしています
InputStreamをInoutStreamReaderにしたり、、、
補足情報(FW/ツールのバージョンなど)
仮想デバイスの情報
Pixel 3a
レゾリューション 1080*2220
API 30
ターゲット Android 10.0+
CPU/ABI x86
回答1件
あなたの回答
tips
プレビュー