Android Socketチャットツール(1つのサービス側で複数のクライアント間通信を実現)


http://www.kankanews.com/ICkengine/archives/29985.shtml
要旨:プログラムはオープンソースで、共同で勉強します.最近Androidを学んで、Socketが実現したTCPプロトコルに基づくチャットツールを作って、1つのサービス端で複数のクライアント間の交流通信をサポートしました.私は以前ブルートゥースコントロールカーのソフトを作ったことがありますが、今回も時間がかかりました.仕方なく、谁が私を呼ぶのはまだただ野菜の鸟で、だから下でどれらが言うのが不当な地方があって、また各位によけいに许してもらいます!
      もしある友达もこのSocketチャットのツールをするつもりならば、私は小さい提案があって、あなたはあまりコードを焦らないで、まず自分が最終的にどのように効果をやり遂げるかをよく考えて、それから自分の考えをすべて書いて、基本的な実現方法があります.コードを書くときは自分の考えに沿って一歩一歩書き続け、コードを書くときに考えがはっきりしないために左削除したり右削除したりすることをよく避けることができます.
以下は本人プログラムの設計構想である.
    クライアント設計の考え方:
  1 ユーザーログインインタフェース
1 ユーザー名入力口としてEditTextを使用し、キーで決定します.
2 後のチャットインタフェースから送信されたメッセージブロードキャスト(送信者、受信者、メッセージボディを含む)を受信するブロードキャスト受信機を登録します.
3 クライアントがサービス側に接続する方法(スレッドで起動する)を作成し、接続に成功して入出力ストリームを取得した後、そこで入力ストリーム管理スレッド(サービス側から送信されたメッセージを受信して処理する)を起動します.そしてintentを通じて次の友達リストインタフェースを起動します(同時に自分のユーザー名を次のインタフェースに送ります).
4 ストリーム管理スレッドの入力については、まず、友人リストが受信されたか、チャットメッセージが送信されたかの2つのブロードキャストを判断します(サービス側が2つの情報を送信する場合は、スレッドを区別するためにラベルを付けることができます).その後、2つのブロードキャストに分けられ、1つはブロードキャストの後ろの友达リストインタフェースが受信したオンライン友达リストであり、もう1つはチャットインタフェースが受信したチャット情報をブロードキャストする.
5 メニューの下にActivityを終了するボタンを作って、ユーザーがプログラムを終了するのを便利にします.
6 すべての準備ができたら、ユーザーはユーザー名を入力して「OK」をクリックすると、以上の操作を実現し、同時に友人リストのインタフェースに入ることができます(サービス側に正しく接続できることを前提としています).
               
  二 友達リスト画面
1 登録インタフェースの入力ストリーム管理スレッドから送信された友達リスト放送を受信するブロードキャスト受信機を登録します.
2 リストビューで友達リストを1つずつ表示します.
3 ユーザーログインインタフェースから送信された自分のユーザー名を取得します.
4 ListViewにリスナーをバインドし、listView上の友人をクリックするとintentで次のチャットインタフェースを起動し、クリックした友人のユーザー名と自分のユーザー名を次のインタフェースに送信します.
               
 
  三 チャットインタフェース
1 友達リストインタフェースから送られてきたチャットの友達のユーザー名と自分のユーザー名を取得し、Titleに表示します.
2 1つのEditTextをチャットメッセージ入力口とし、1つのボタンで出力を決定する.
3 ユーザがOKをクリックすると、送信者、受信者、メッセージボディを含むメッセージブロードキャストが送信され、ユーザがインタフェースにログインしたメッセージブロードキャスト受信機に受信される.
4 ブロードキャスト受信機を登録して、ユーザログインインタフェースの入力ストリーム管理スレッドから送信されたメッセージを受信します.
                   
    サービス側の設計構想:
  メッセージ処理インタフェース(1つのインタフェースのみ)
1 リスニング接続要求メソッドの作成 (リスニングクライアントが接続要求を送信し、スレッドで起動する必要がある).
  A  ユーザが接続要求を送信すると、socketオブジェクトが生成されます.このsocketオブジェクトから出力ストリームと入力ストリームが生成され,入力ストリームからクライアントから送信されたユーザ名が抽出されsickName配列にユーザ名が置かれ,出力がArrayOut配列に流れる.
  B  新しいクライアントXXX接続の正常なブロードキャストを送信します.
  C  あらかじめsickName配列とArrayOut配列を使用して、接続されたクライアントごとに友達リストを送信する送信友達リストメソッドを作成し、ここでメソッドを呼び出します.
  D  新しいストリーム管理スレッドを生成して起動します(クライアントから送信されたメッセージを受信して処理します.新しいユーザが生成すると、入力ストリーム管理スレッドが新しくなるので、クライアントから送信されたメッセージは混乱しません).
2 友達リストの送信方法を作成します.
3 2つのブロードキャスト受信機を登録し、1つは新しいクライアントXXX接続を受信してブロードキャストに成功した.もう1つは、入力ストリーム管理スレッドから送信されたチャットメッセージを受信し、ターゲットオブジェクトを識別し、ターゲットオブジェクトにそれぞれメッセージを送信する.
4 onResumeメソッドでリスニングスレッドを開始します.
5 メニューの下にActivityを終了するボタンとリフレッシュボタンを作成します(各クライアントに接続したユーザーのリストを再送信します).
 
    改善可能な場所:
 友達が脱退したときにオフラインを表示することが考えられます.
 チャット中でない友達がメッセージを送ったときに注意します.
 ログインしていれば、未接続の情報はずっと保存でき、チャットインタフェースに入ると再び表示できます.
 LQアバターとチャットの表情を追加することも考えられます.
 ......
クライアントコード:
1 ユーザーログインインタフェース
 
package cn.text2;



import java.io.BufferedWriter;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;







import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;



public class Text2Activity extends Activity {

	

	

	Button buttonSure;

	Button buttonDump;

	EditText editTextName;

	PrintWriter output ;

	Text2Helper text2helper;

	int k = 0;

	

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    	

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        buttonSure = (Button)findViewById(R.id.buttonSure);

        editTextName = (EditText)findViewById(R.id.editTextName);

        

    }

    

    /*****    *******/

    public void buttonsure(View v) {

    	

		 new Thread(){

			public void run(){

				Connect();

				System.out.println("  Text2ClientActivity       ");

			}

		 }.start();

		 System.out.println("  Text2ClientActivity       ");

		 OpenBroadcastReceiver();

		 

	 }

    



    /****      *******/

	public void OpenBroadcastReceiver(){

		

		//  BroadcastReceiver  

		Text2ClientActivityReceiver Receiver = new Text2ClientActivityReceiver();

		//     IntentFilter  

		IntentFilter filter = new IntentFilter();

		//          

		filter.addAction("android.intent.action.VOICE_COMMAND");//  Text2ClientActivity       

		//      

		Text2Activity.this.registerReceiver(Receiver, filter);

		System.out.println("      !");

		

	}

	

		/********      ***********///    Text2ClientActivity       

	public class Text2ClientActivityReceiver extends BroadcastReceiver {

		

		@Override

		public void onReceive(Context context, Intent intent) {

			// TODO Auto-generated method stub

			String yourself = intent.getStringExtra("SendYourself");//                      

			String target = intent.getStringExtra("SendTarget");

			String message = intent.getStringExtra("SendMessage");

			if(k>0){

				 output.println(yourself);  //yourself

				 output.flush();

				 output.println(target);  //target

				 output.flush();

				 output.println(message);  //  

				 output.flush();

				 System.out.println("      Text2ClientActivity   ,       ");

			}



		}

		

	}

	



	

	

	 /*********       ***********/

	 public void Connect(){

			

			try {

				 InetAddress addr = InetAddress.getByName("192.168.22.10");//       IP  ,   wifi     

				 System.out.println("       ");

				 

				 //             

				 Socket socket = new Socket(addr,6666);

		         System.out.println("    ,socket=" + socket);

		         

		         //    socket       

		         output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

		         System.out.println("       ");

		         output.println(editTextName.getEditableText().toString());

		         output.flush();

		         k++;

		         

		         //  getMessage  

		         text2helper = new Text2Helper(socket,this);  //    CGetMessage       CGetMessage

		         Thread gt = new Thread(text2helper);

		         gt.start();

		         

		         /**      FriendListActivity**/

		         Intent intentdump =new Intent();

				 intentdump.putExtra("ClientName",editTextName.getText().toString());

				 intentdump.setClass(Text2Activity.this, Text2FriendActivity.class);

				 Text2Activity.this.startActivity(intentdump);

			  } catch (Exception e) {

				 e.printStackTrace();

			  }

			 

	 }

	 

	 

	 /********    **********/

	 @Override

	 public boolean onCreateOptionsMenu(Menu menu) {

		 

		  menu.add(0,1,1,"  ");

		  menu.add(0,2,2,"  ");

		  return true;

	  

	 }

	 

	 @Override

	 public boolean onMenuItemSelected(int featureId, MenuItem item) {

		 

		  if(item.getItemId() == 1){

			  finish();

		  }

		  

		  if(item.getItemId() == 2){

			  new Thread(){

					

					public void run()

					{

						Connect();

					}

				}.start();

		  }

		  

	  return super.onMenuItemSelected(featureId, item);

	  

	 }

    

    

}

 2友達リスト画面
package cn.text2;



import java.util.ArrayList;

import java.util.HashMap;



import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;



public class Text2FriendActivity extends Activity {



	

	TextView textViewfriendlist;

	ListView listViewfriendlist;

	static Toast tt = null;

	

	int i = 1;

	String Clients[] = {"","","","","","","","","","","","","","","","","","","","","","","","",""};

	String YourName;

	

	SimpleAdapter simpleAdapter;

	ArrayList> listItem;

	

	 @Override

	protected void onCreate(Bundle savedInstanceState) {

		 

		  super.onCreate(savedInstanceState);

		  setContentView(R.layout.friend);

		  Intent intentdump = getIntent();

		  YourName = intentdump.getStringExtra("ClientName");

		  listViewfriendlist = (ListView)findViewById(R.id.listViewfriendlist);

		  textViewfriendlist = (TextView)findViewById(R.id.textViewfriendlist);

		  

		  /**********listView           *************/

		  listItem = new ArrayList>();//       

		  HashMap map = new HashMap();  

		  map.put("LvMessage","  :");  

		  listItem.add(map); 

		  simpleAdapter = new SimpleAdapter(this,listItem,

		  R.layout.text2user,new String[] {"LvMessage"},new int[] {R.id.LvTextViewMessage});	//     

		  listViewfriendlist.setAdapter(simpleAdapter);    

		  listViewfriendlist.setOnItemClickListener(new ListViewListener());

		  

		  OpenBroadcastReceiver();//    UpLoadActivity           

		  Clients[0]= "Jack";

		  

	}

	

	/*******listView    **********/

	class ListViewListener implements OnItemClickListener{

    	

		@Override

		public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) {

			

			// TODO Auto-generated method stub

			setTitle("     "+arg2+" ");//               ( 0  ) 

//			if(arg2>0){

				/**      Text2ClientActivity**/

		         Intent intentdump2 =new Intent();

		         intentdump2.putExtra("Target",Clients[arg2]);//     

		         intentdump2.putExtra("Yourself", YourName);//     

		         intentdump2.setClass(Text2FriendActivity.this, Text2TalkActivity.class);

		         Text2FriendActivity.this.startActivity(intentdump2);

//			}

			

		}

		

    }

	



	/****      *******/

	public void OpenBroadcastReceiver(){

		

		//  BroadcastReceiver  

		FriendListReceiver Receiver = new FriendListReceiver();

		//     IntentFilter  

		IntentFilter filter = new IntentFilter();

		//          

		filter.addAction("android.intent.action.DIAL");  

		//      

		Text2FriendActivity.this.registerReceiver(Receiver, filter);

		System.out.println("      !");

		

	}

	

	/********      ***********///  UpLoadActivity         

	public class FriendListReceiver extends BroadcastReceiver {

		

		@Override

		public void onReceive(Context context, Intent intent) {

			

			// TODO Auto-generated method stub

			String msg = intent.getStringExtra("FriendListmessage");

			//       

			Clients[i] = msg;

			HashMap map = new HashMap(); 

			map.put("LvMessage",msg);  

			listItem.add(map);  

			listViewfriendlist.setAdapter(simpleAdapter);    

			System.out.println("        --->"+msg+",    listView ");

			i++;

		}

		



	}

		

	

	

	

	/********    **********/

	 @Override

	 public boolean onCreateOptionsMenu(Menu menu) {

		 

		  menu.add(0,1,1,"  ");

		  return true;

	  

	 }

	 

	 @Override

	 public boolean onMenuItemSelected(int featureId, MenuItem item) {

		 

		  if(item.getItemId() == 1){

			  finish();

		  }

		  

	  return super.onMenuItemSelected(featureId, item);

	  

	 }

	 

	 

}

 3チャットインターフェイス
package cn.text2;



import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;

import java.util.ArrayList;

import java.util.HashMap;



import android.app.Activity;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.os.Message;

import android.os.Vibrator;

import android.text.Editable;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.Toast;



public class Text2TalkActivity extends Activity {

	

	

	 TextView textViewMessage;

	 Button buttonSend;

	 EditText editText;

	 ListView listView;

	 Vibrator vibrator;

	 static Toast tt = null;

	 

	 SimpleAdapter simpleAdapter;

	 ArrayList> listItem;

	 

	 String Yourself;

	 String Target;

	 

	 @Override

	 protected void onCreate(Bundle savedInstanceState) {

		 

	  super.onCreate(savedInstanceState);

	  setContentView(R.layout.talk);

	  

	  Intent intent2 = getIntent();

	  Yourself = intent2.getStringExtra("Yourself");

	  Target = intent2.getStringExtra("Target");

	  setTitle("I am "+Yourself+"     --->"+Target);

	  

	  textViewMessage = (TextView)findViewById(R.id.textViewMessage);

	  buttonSend = (Button)findViewById(R.id.buttonSend);

	  editText = (EditText)findViewById(R.id.editText);

	  listView = (ListView)findViewById(R.id.listView);

	  tt = Toast.makeText(Text2TalkActivity.this, "   ", Toast.LENGTH_SHORT);

	  

	  /**********listView           *************/

	  listItem = new ArrayList>();//       

	  HashMap map = new HashMap();  

	  map.put("LvMessage","    :");  

	  listItem.add(map); 

	  simpleAdapter = new SimpleAdapter(this,listItem,

	  R.layout.text2user,new String[] {"LvMessage"},new int[] {R.id.LvTextViewMessage});	//     

	  listView.setAdapter(simpleAdapter);

	  

	  Text2TalkBroadcastReceiver();

	  

	 }

	 

		

		/******         ********/

		public void buttonsend(View v) {

			

			HashMap map = new HashMap(); 

			map.put("LvMessage", Yourself +":"+editText.getEditableText());  

			listItem.add(map);  

			listView.setAdapter(simpleAdapter);   

			

			Intent intent = new Intent();

        	intent.setAction(intent.ACTION_VOICE_COMMAND);// UploadActivity    yourself

        	intent.putExtra("SendYourself",Yourself);

        	intent.putExtra("SendTarget",Target);

        	intent.putExtra("SendMessage",editText.getEditableText().toString());

        	Text2TalkActivity.this.sendBroadcast(intent);

        	

			System.out.println("        :"+editText.getEditableText());

			

		}

		 

	 /****      *******/

	public void Text2TalkBroadcastReceiver(){

		

		//  BroadcastReceiver  

		Text2TalkbroadcastReceiver Receiver = new Text2TalkbroadcastReceiver();

		//     IntentFilter  

		IntentFilter filter = new IntentFilter();

		//          

		filter.addAction("android.intent.action.PICK");  //   Text2FriendActivity       

		//      

		Text2TalkActivity.this.registerReceiver(Receiver, filter);

		System.out.println("      !");

		

	}

	

		/********      ***********///   Text2FriendActivity       

	public class Text2TalkbroadcastReceiver extends BroadcastReceiver {

		

		@Override

		public void onReceive(Context context, Intent intent) {

			

			// TODO Auto-generated method stub

			String msg = intent.getStringExtra("TextMessage");

			//       

			HashMap map = new HashMap(); 

			map.put("LvMessage", msg);  

			listItem.add(map);  

			listView.setAdapter(simpleAdapter);    

			System.out.println("Text2Talk        --->"+msg+",    listView ");

			

			vibrator();//  

			

		}

			

	}

	

	/******  30ms  ******/

    public void vibrator(){  

    	

    	vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);

    	vibrator.vibrate(30);

    	System.out.println("  30ms");

    	

    }

	



	/*************  *******************/

	 @Override

	 public boolean onCreateOptionsMenu(Menu menu) {

		 

		  menu.add(0,0,0,"  ");

		  menu.add(0,1,1,"  ");

		  return true;

	  

	 }

	 

	 @Override

	 public boolean onMenuItemSelected(int featureId, MenuItem item) {

		 

		  if(item.getItemId() == 0){

			  ArrayList> listItem1 = new ArrayList>();/*        */ 

			  HashMap map = new HashMap();  

			  map.put("ItemText","    :");  

			  listItem1.add(map);  

			  SimpleAdapter simpleAdapter1 = new SimpleAdapter(this,listItem1,

					  R.layout.text2user,new String[] {"ItemText"},new int[] {R.id.LvTextViewMessage});

			  listView.setAdapter(simpleAdapter1);

		  }

		  

		  if(item.getItemId() == 1){

			  finish();

		  }

		  

	  return super.onMenuItemSelected(featureId, item);

	 }





}

 
 
サービス側コード:
package cn.Text2Server;



import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.SocketAddress;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;



import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.Toast;



public class Text2ServerActivity  extends Activity {

	

	

	 TextView textViewHead = null;

	 TextView textViewMessage;

	 Button buttonStart;

	 Button buttonSend;

	 EditText editText;

	 ListView listView;

	 static Toast toast = null;

	 

	 PrintWriter out,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16,o17,o18,o19,o20;

	 PrintWriter ArrayOut[] = {o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16,o17,o18,o19,o20};

	 				//   (PrintWriter[]  ArrayOut)   

	 int k = 0;  	//          

	 int m = 0;		//               body

	 String ReceiveMessage = "   :
"; String nickName[] = {"","","","","","","","","","","","","","","","","","","","","","","","",""}; String from,to,body; String packet[] = {from,to,body}; SimpleAdapter simpleAdapter; ArrayList> listItem; HashMap map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textViewHead = (TextView)findViewById(R.id.textView); textViewMessage = (TextView)findViewById(R.id.textViewMessage); buttonSend = (Button)findViewById(R.id.buttonSend); editText = (EditText)findViewById(R.id.editText); listView = (ListView)findViewById(R.id.listView); toast = Toast.makeText(Text2ServerActivity.this, " ", Toast.LENGTH_SHORT); /**********listView *************/ listItem = new ArrayList>();// map = new HashMap(); map.put("LvMessage"," :"); listItem.add(map); simpleAdapter = new SimpleAdapter(this,listItem, R.layout.user,new String[] {"LvMessage"},new int[] {R.id.LvTextViewMessage}); // listView.setAdapter(simpleAdapter); } /******** *******/ // public void buttonsend(View v){ HashMap map = new HashMap(); map.put("LvMessage", " :"+editText.getEditableText()); listItem.add(map); listView.setAdapter(simpleAdapter); out.println(editText.getEditableText());// out.flush(); System.out.println(" :"+editText.getEditableText()); } /**** *******/ public void OpenBroadcastReceiver(){ // BroadcastReceiver broadcastReceiver Receiver = new broadcastReceiver(); // IntentFilter IntentFilter filterMessage = new IntentFilter(); // filterMessage.addAction("android.intent.action.EDIT"); // Text2ServerActivity.this.registerReceiver(Receiver, filterMessage); System.out.println(" !"); } /******** ***********/ public class broadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub // String msg = intent.getStringExtra("message"); packet[m] = msg; m++; if(msg.equals(" ")||msg.equals(" ")){ textViewHead.setText(" : :"+msg); System.out.println(" msg TextView "); m = 0; } if(m>=3){ m = 0; String ReceiveMessage = "From -"+packet[0]+ "To -"+packet[1] + " :"+packet[2]; HashMap map = new HashMap(); map.put("LvMessage", ReceiveMessage); listItem.add(map); listView.setAdapter(simpleAdapter); System.out.println(" ListView "); for(int i=0;i> listItem1 = new ArrayList>();/* */ HashMap map = new HashMap(); map.put("ItemText", " :"); listItem.add(map); SimpleAdapter simpleAdapter1 = new SimpleAdapter(this,listItem1, R.layout.user,new String[] {"ItemText"},new int[] {R.id.LvTextViewMessage} ); listView.setAdapter(simpleAdapter1); } if(item.getItemId() == 1){ finish(); } if(item.getItemId() == 2){ for(int m=0;m

, , Socket !!


声明:OSCHINAブログの文章の著作権は作者に属し、法律によって保護されています.作者の同意を得ずに転載してはならない.