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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

2570閲覧

Android チャットクライアント

kt3302y

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/01/14 03:22

編集2022/01/12 10:55

Android Studioを使用してチャットクライアントを作成しています.
public void handleButtonConnectAction(View view)はソケットを接続してバックラウンドでチャットを受信待ち状態にするメソッドです
しかしこれを実行すると常にチャットを受信待ちにしなければならないはずが受信待ちのバックラウンド処理がすぐに終了してしまう問題が発生してしまいます.どうすればよいのでしょうか

MainActivity.java

1import android.os.Bundle; 2import android.support.design.widget.FloatingActionButton; 3import android.support.design.widget.Snackbar; 4import android.support.v7.app.AppCompatActivity; 5import android.support.v7.widget.Toolbar; 6import android.view.View; 7import android.view.Menu; 8import android.view.MenuItem; 9import android.widget.Button; 10import android.widget.EditText; 11import android.widget.TextView; 12import android.widget.Toast; 13 14import java.io.IOException; 15import java.net.InetSocketAddress; 16import java.net.Socket; 17import java.util.logging.Handler; 18import java.util.logging.LogRecord; 19 20public class MainActivity extends AppCompatActivity 21 implements ChatConnectTask.ChatConnectTaskCallback{ 22 23 private ChatConnectTask connectTask; 24 private EditText inputIP; 25 private EditText inputPort; 26 private EditText inputMessage; 27 private TextView viewChat; 28 private Button buttonConnect; 29 private Button buttonSend; 30 private Socket socket; 31 32 33 34 35 @Override 36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.activity_main); 39 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 40 setSupportActionBar(toolbar); 41 42 inputIP = (EditText)findViewById(R.id.inputIP); 43 inputPort = (EditText)findViewById(R.id.inputPort); 44 inputMessage = (EditText)findViewById(R.id.inputMessage); 45 buttonConnect = (Button)findViewById(R.id.buttonConnect); 46 buttonSend = (Button)findViewById(R.id.buttonSend); 47 viewChat = (TextView)findViewById(R.id.viewChat); 48 49 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 50 fab.setOnClickListener(new View.OnClickListener() { 51 @Override 52 public void onClick(View view) { 53 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 54 .setAction("Action", null).show(); 55 } 56 }); 57 } 58 59 //connectボタンでソケット接続&メッセージ受信 60 public void handleButtonConnectAction(View view){ 61 Toast.makeText(this, "kaisi", Toast.LENGTH_SHORT).show(); 62 //IPアドレスを取得 63 String IP = inputIP.getText().toString(); 64 //ポート番号を取得 65 int port = Integer.parseInt(inputPort.getText().toString()); 66 this.socket = connect(IP,port); 67 Param param = new Param(socket); 68 connectTask = new ChatConnectTask(this); 69 connectTask.execute(param); 70 } 71 //サーバと接続するメソッド 72 protected Socket connect(final String IP, final int port){ 73 new Thread(new Runnable(){ 74 @Override 75 public void run(){ 76 Socket socket = new Socket(); 77 try { 78 socket.connect(new InetSocketAddress(IP,port)); 79 } catch (IOException e) { 80 81 } 82 } 83 }).start(); 84 85 return socket; 86 } 87 88 89 //送信ボタンでメッセージを送信 90 public void handleButtonSendAction(View view){ 91 String message = inputMessage.getText().toString(); 92 Param param = new Param(socket,message); 93 ChatSendTask sendTask = new ChatSendTask(param); 94 sendTask.start(); 95 } 96 97 @Override 98 public boolean onCreateOptionsMenu(Menu menu) { 99 // Inflate the menu; this adds items to the action bar if it is present. 100 getMenuInflater().inflate(R.menu.menu_main, menu); 101 return true; 102 } 103 104 @Override 105 public boolean onOptionsItemSelected(MenuItem item) { 106 // Handle action bar item clicks here. The action bar will 107 // automatically handle clicks on the Home/Up button, so long 108 // as you specify a parent activity in AndroidManifest.xml. 109 int id = item.getItemId(); 110 111 //noinspection SimplifiableIfStatement 112 if (id == R.id.action_settings) { 113 return true; 114 } 115 116 return super.onOptionsItemSelected(item); 117 } 118 119 @Override 120 public void onPreExecute() { 121 122 } 123 124 @Override 125 public void onProgressUpdate(String... message) { 126 viewChat.setText(message[0].toString()); 127 } 128 129 @Override 130 public void onPostExecute(String result) { 131 Toast.makeText(this,result,Toast.LENGTH_LONG).show(); 132 inputMessage.setText(""); 133 } 134 135 136 137} 138```ChatConnectTask.java 139import android.os.AsyncTask; 140 141import java.io.DataInputStream; 142 143import java.io.IOException; 144import java.io.InputStream; 145 146import java.net.Socket; 147 148public class ChatConnectTask extends AsyncTask<Param,String,String > { 149 private ChatConnectTaskCallback mCallback; 150 151 private String showMessage = " ";//nullConnectと表示させないための処置 152 153 public ChatConnectTask(ChatConnectTaskCallback callback){ 154 155 this.mCallback = callback; 156 } 157 158 159 160 161 @Override 162 protected void onPreExecute(){ 163 if(mCallback != null) 164 mCallback.onPreExecute(); 165 } 166 167 protected String doInBackground(Param... param){ 168 169 Socket socket = param[0].param1; 170 171 try { 172 173 while(socket != null) { 174 // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 175 InputStream is = socket.getInputStream(); 176 DataInputStream dis = new DataInputStream(is); 177 178 179 // データの受信 180 String receiveMessage = dis.readUTF(); 181 //受信したデータに改行をつけてメッセージを追加していく 182 showMessage += receiveMessage + "\r\n"; 183 // 受信したデータを表示 184 185 publishProgress(showMessage); 186 } 187 188 189 } catch (Exception e) { 190 e.printStackTrace(); 191 } finally { 192 // ソケットをクローズする 193 if (socket != null ) { 194 try { 195 socket.close(); 196 } catch (IOException e) {} 197 } 198 } 199 200 return "チャットを終了します"; 201 } 202 203 @Override 204 protected void onProgressUpdate(String... message){ 205 if(mCallback != null) 206 mCallback.onProgressUpdate(message); 207 } 208 209 @Override 210 protected void onPostExecute(String result ){ 211 if(mCallback != null) { 212 mCallback.onPostExecute(result); 213 } 214 } 215 216 217 public interface ChatConnectTaskCallback{ 218 void onPreExecute(); 219 void onProgressUpdate(String... message); 220 void onPostExecute(String result); 221 } 222}

ChatSendTask.java

1import java.io.DataOutputStream; 2import java.io.IOException; 3import java.io.OutputStream; 4import java.net.InetSocketAddress; 5import java.net.Socket; 6 7public class ChatSendTask extends Thread { 8 private Param param = new Param(); 9 10 public ChatSendTask(Param... params){ 11 this.param.param1 = params[0].param1; 12 this.param.param2 = params[0].param2; 13 } 14 15 public void run(){ 16 17 try { 18 19// 接続されたソケットの出力力ストリームを取得し,データ出力ストリームを連結 20 OutputStream os = param.param1.getOutputStream(); 21 DataOutputStream dos = new DataOutputStream(os); 22// テキストフィールドの文字を取得 23 String sendMessage = param.param2; 24 //データの送信 25 dos.writeUTF(sendMessage); 26 dos.flush(); 27 28 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } finally { 32 // ソケットをクローズする 33 if (param.param1 != null) { 34 try { 35 param.param1.close(); 36 } catch (IOException e) {} 37 } 38 } 39 } 40 41} 42```Param.java 43import java.net.Socket; 44 45 46public class Param { 47 Socket param1; 48 String param2; 49 50 51 Param(Socket param1,String param2){ 52 this.param1 = param1; 53 this.param2 = param2; 54 } 55 Param(Socket param1){ 56 this(param1,null); 57 } 58 Param(){ 59 this(null,null); 60 } 61 62}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問