Android Studioを使用してチャットクライアントアプリを作成しています.
使用としてはサーバーのIPアドレスとポート番号を入力してConnectボタンをクリックするとサーバーに接続とチャット受信を行い,送信ボタンはテキストに入力されたメッセージをサーバーに送信する役割を担っています.
メッセージを送信できない問題が発生しました.
これは何が原因で起こっているものなのでしょうか
教えてください.
参考までにソースコードなども載せておきます.
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 14public class MainActivity extends AppCompatActivity 15 implements ChatConnectTask.ChatConnectTaskCallback,ChatSendTask.ChatSendTaskCallback{ 16 17 private ChatConnectTask connectTask; 18 private ChatSendTask sendTask; 19 private EditText inputIP; 20 private EditText inputPort; 21 private EditText inputMessage; 22 private TextView viewChat; 23 private Button buttonConnect; 24 private Button buttonSend; 25 private String param1; 26 private int param2; 27 private String param3; 28 private View view; 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 36 setSupportActionBar(toolbar); 37 38 inputIP = (EditText)findViewById(R.id.inputIP); 39 inputPort = (EditText)findViewById(R.id.inputPort); 40 inputMessage = (EditText)findViewById(R.id.inputMessage); 41 buttonConnect = (Button)findViewById(R.id.buttonConnect); 42 buttonSend = (Button)findViewById(R.id.buttonSend); 43 viewChat = (TextView)findViewById(R.id.viewChat); 44 45 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 46 fab.setOnClickListener(new View.OnClickListener() { 47 @Override 48 public void onClick(View view) { 49 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 50 .setAction("Action", null).show(); 51 } 52 }); 53 } 54 55 //connectボタンでソケット接続&メッセージ受信 56 public void handleButtonConnectAction(View view){ 57 String param1 = inputIP.getText().toString(); 58 int param2 = Integer.parseInt(inputPort.getText().toString()); 59 Param param = new Param(param1,param2); 60 connectTask = new ChatConnectTask(this); 61 connectTask.execute(param); 62 } 63 //送信ボタンでメッセージを送信 64 public void handleButtonSendAction(View view){ 65 param3 = inputMessage.getText().toString(); 66 Param param = new Param(param1,param2,param3); 67 sendTask = new ChatSendTask(this); 68 sendTask.execute(param); 69 } 70 71 @Override 72 public boolean onCreateOptionsMenu(Menu menu) { 73 // Inflate the menu; this adds items to the action bar if it is present. 74 getMenuInflater().inflate(R.menu.menu_main, menu); 75 return true; 76 } 77 78 @Override 79 public boolean onOptionsItemSelected(MenuItem item) { 80 // Handle action bar item clicks here. The action bar will 81 // automatically handle clicks on the Home/Up button, so long 82 // as you specify a parent activity in AndroidManifest.xml. 83 int id = item.getItemId(); 84 85 //noinspection SimplifiableIfStatement 86 if (id == R.id.action_settings) { 87 return true; 88 } 89 90 return super.onOptionsItemSelected(item); 91 } 92 93 @Override 94 public void onPreExecute() { 95 96 } 97 98 @Override 99 public void onProgressUpdate(String... message) { 100 viewChat.setText(message[0].toString()); 101 } 102 103 @Override 104 public void onPostExecute(String result) { 105 Toast.makeText(this,result,Toast.LENGTH_LONG); 106 } 107} 108
ChatConnectTask.java
1 2import android.os.AsyncTask; 3 4import java.io.DataInputStream; 5import java.io.DataOutputStream; 6import java.io.IOException; 7import java.io.InputStream; 8import java.io.OutputStream; 9import java.net.InetSocketAddress; 10import java.net.Socket; 11 12/** 13 */ 14public class ChatConnectTask extends AsyncTask<Param,String,String > { 15 private ChatConnectTaskCallback mCallback; 16 private Param param = new Param(); 17 18 public ChatConnectTask(ChatConnectTaskCallback callback){ 19 20 this.mCallback = callback; 21 } 22 23 24 25 26 @Override 27 protected void onPreExecute(){ 28 if(mCallback != null) 29 mCallback.onPreExecute(); 30 } 31 32 protected String doInBackground(Param... param){ 33 34 String server = param[0].param1; 35 // Server Portからポート番号を取得 36 int port = param[0].param2; 37 38 Socket socket = null; 39 try { 40 // ソケットを作成 41 socket = new Socket(); 42 // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する 43 socket.connect(new InetSocketAddress(server, port)); 44 while(socket != null) { 45 // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 46 InputStream is = socket.getInputStream(); 47 DataInputStream dis = new DataInputStream(is); 48 49 50 // データの受信 51 String receiveMessage = dis.readUTF(); 52 //受信したデータに改行をつけてメッセージを追加していく 53 String showMessage = receiveMessage + "\r\n"; 54 // 受信したデータを表示 55 56 publishProgress(showMessage); 57 } 58 59 60 } catch (Exception e) { 61 e.printStackTrace(); 62 } finally { 63 // ソケットをクローズする 64 if (socket != null) { 65 try { 66 socket.close(); 67 } catch (IOException e) {} 68 } 69 } 70 71 return "チャットを終了します"; 72 } 73 74 @Override 75 protected void onProgressUpdate(String... message){ 76 if(mCallback != null) 77 mCallback.onProgressUpdate(message); 78 } 79 80 @Override 81 protected void onPostExecute(String result ){ 82 if(mCallback != null) { 83 mCallback.onPostExecute(result); 84 } 85 } 86 87 88 public interface ChatConnectTaskCallback{ 89 void onPreExecute(); 90 void onProgressUpdate(String... message); 91 void onPostExecute(String result); 92 } 93} 94
ChatSendTask.java
1package jp.ac.id140441007_meijo_u.task81; 2 3 4import android.os.AsyncTask; 5 6import java.io.DataOutputStream; 7import java.io.IOException; 8import java.io.OutputStream; 9import java.net.InetSocketAddress; 10import java.net.Socket; 11 12/** 13 * Created by 大嗣 on 2016/01/07. 14 */ 15public class ChatSendTask extends AsyncTask<Param,String,String > { 16 private ChatSendTaskCallback mCallback; 17 private Param param = new Param(); 18 19 public ChatSendTask(ChatSendTaskCallback callback){ 20 21 this.mCallback = callback; 22 } 23 24 25 26 27 @Override 28 protected void onPreExecute(){ 29 if(mCallback != null) 30 mCallback.onPreExecute(); 31 } 32 33 protected String doInBackground(Param... param){ 34 35 String server = param[0].param1; 36 // Server Portからポート番号を取得 37 int port = param[0].param2; 38 39 Socket socket = null; 40 try { 41 // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する 42 socket.connect(new InetSocketAddress(server, port)); 43// 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 44 OutputStream os = socket.getOutputStream(); 45 DataOutputStream dos = new DataOutputStream(os); 46// テキストフィールドの文字を取得 47 String sendMessage = param[0].param3; 48 49 dos.write(sendMessage.getBytes()); 50 dos.flush(); 51 52 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } finally { 56 // ソケットをクローズする 57 if (socket != null) { 58 try { 59 socket.close(); 60 } catch (IOException e) {} 61 } 62 } 63 64 return "メッセージを送信しました"; 65 } 66 67 @Override 68 protected void onProgressUpdate(String... message){ 69 if(mCallback != null) 70 mCallback.onProgressUpdate(message); 71 } 72 73 @Override 74 protected void onPostExecute(String result){ 75 if(mCallback != null) { 76 mCallback.onPostExecute(result); 77 } 78 } 79 80 81 public interface ChatSendTaskCallback{ 82 void onPreExecute(); 83 void onProgressUpdate(String... message); 84 void onPostExecute(String result); 85 } 86}
回答2件
あなたの回答
tips
プレビュー