前の記事では、Javaソケットチャットルームプログラミング(1)ソケットを使用してチャットメッセージプッシュを実装して、ソケットを使用してサーバーとクライアントの間を通過させる方法について説明し、メッセージをプッシュする目的を達成しました。次に、サーバーがクライアントとクライアント間の通信を確立できるようにする方法について書きます。
実際、1対1のチャットコミュニケーションを確立することです。
メッセージプッシュを実装した以前のコードとは多少異なり、変更されました。
メソッドまたはクラスが言及されていない場合、それらは前の記事とまったく同じです。
1.エンティティクラスを変更する(サーバーとクライアントのエンティティクラスは同じです)
1。USERINFOBEANユーザー情報表
パブリッククラスのuserInfobeanはSerializable {private static final long serialversionuid = 2l; private long userid; // user idprivate string username; // user name private string likename; // nickname private string userpwd; //ユーザーパスワードプライベート文字列Usericon;2。MessageBeanチャット情報テーブル
パブリッククラスのMessageBeanはSerializable {private static final long serialversionuid = 1l; private long messageid; // message idprivate long groupid; // group idprivate boolean isgoup; //グループメッセージであるかどうか; //メッセージタイプ; //メッセージタイプ; 1、テキスト;コンテンツプライベート文字列ERRORMSG; //エラーメッセージプライベートintエラーコード; //エラーコードプライベートint userid; // user idprivate int friendid; //ターゲットフレンドidprivate messagefilebean chatfile; // message添付ファイル// get and setメソッド}3。MessageFilebeanメッセージ添付テーブル
パブリッククラスMessageFilebeanはSerializable {private static final long serialversionuid = 3l; private int fileid; // file idprivate string filename; // file name private long filelength; // file content private string filetype;2。(サーバーサイドコードの変更)Chatserverのメインチャットサービスクラス、変更
パブリッククラスチャットサーバー{//ソケットサービスプライベートスタチックサーバーサーバー; // arrayListを使用してすべてのsocketpublicリスト<Socket> socket> socketlist = new ArrayList <>(); // SocketPublic Map <integer、socket> socketmap = new hashmap(); hashmap(); public gson gson = new gson();/*** Socket Service*/public void initserver(){// Serversocketを作成してポート8080サーバーで顧客リクエストをリッスンする= new Serversocket(socketurls.port); blocke.printstacktrace();}}/***メッセージ管理を作成し、メッセージを受信し続けます*/private void createmessage(){try {system.out.println( "waiting waiting waiting waiting");/custome requests socket socket = server.accect(); socketlist.add(socket); system.out.println( "user access:" + socket.getport()); //別のソケットがnew runnable(){public void run(){//他のユーザーがcreatemessageにアクセスするのを待っているソケットサービスを再度作成する();クライアントBufferedReaderから情報を取得bff = new BufferedReader(new inputstreamreader(socket.getinputStream()); bff.readline())!= null){//エンティティクラスMessageBean messagebean = gson.fromjson(line、massionbean.class); //ユーザー情報をマップに模倣し、メモリに模倣し、エンティティクラスはデータベースに保存され、ソケットはメモリに保存されます。ユーザーIDはリファレンスSetChatMap(MessageBean、Socket); //ユーザーから送信されたメッセージをターゲットフレンドGetFriend(MessageBean); system.out.println( "user:" + usermap.get(messagebean.getuserid())。getUsername()); system.out.println(content: " + system.out();" + system.out(); server.close();} catch(Exception e){// todo auto-generated catch blocke.printstacktrace(); system.out.println( "error:" + e.getmessage());}/***メッセージを送信*/private void getmessage(){new runnable(){new void run(){bubber() {//コンソールStrin = new BufferedReader(new inputstreamReader(system.in)); buffer = strin.readline(); // readlineがエンドポイントとして新しいラインバッファーを使用するため、 += "/n"; //ここでは、すべてのユーザーに接続されたユーザーに接続されたすべてのユーザーに接続されたユーザーに接続されたユーザーに接続されているために、newlineバッファーを追加するため、end = "/n"; {outputStream output = socket.getOutputStream(); output.write(buffer.getBytes( "utf-8")); // data output.flush();}}} catch(ioexception e){// todo auto-generated catch blocke.printstrace();データベースとメモリ** @param messagebean* @param scoket*/private void setChatmap(messagebean messagebean、socket scoket){//ユーザー情報を保存します(usermap!= null && usermap.get(mesagebean.getuserid()== null) getUserInfobean(messagebean.getuserid());} //対応するリンクソケットを保存if(socketmap!= null && socketmap.get(messagebean.getuserid())== null){socketmap.put(massembean.getuserid()、scoket); here** @param userid* @return*/private userininfobean getuserinfobean(int userid){userinfobean userinfobean = new userInfobean(); userInfobean.setusericon( "user avatar "); userInfobean.setuserid(userId); userinfobean.setusername(" admin "); userinfobean.setuserpwd(" 123123132a "); return userinfobean;}/***ターゲットフレンドへメッセージをターゲットfriend friend** @param getmap umap bean getfrienm(spectrien && socketmap.get(messagebean.getfriendid())!= null){socket socket = socketmap.get(messagebean.getfriendid()); string buffer = gson.tojson(messagebean); // readlineは新しいラインのエンドポイントであるため、end += "/=" socket.getOutputStream(); output.write(buffer.getBytes( "utf-8")); // data output.flush();} catch(ioexception e){// dodo auto-generated catch blocke.printstacktrace();}}}}}}}}}}}}}}}}3。
パブリッククラスのログニクティ率は、appcompatactivityを拡張します{private edittext chat_name_text、chat_pwd_text; private button chat_login_btn; @overrideprotected void oncreate(bundle savedinstancestate){super.oncreate(savedinstanceSate); (edittext)findViewById(r.id.chat_name_text); chat_pwd_text =(edittext)findviewbyid(r.id.chat_pwd_text); chat_login_btn =(button)findViewid(r.id.chat_login_btn); chat_login_btn.setonclicklistener(new view.onclicklistener(){@overridepublic void onclick(view v){int status = getlogin(chat_name_text.getText()。trim()。trion()、chat_pwd_text.getText()。toString()。 {toast.makeText(loginActivity.、 "password error"、toast.length_long).show(); return;} getChatserver(getLogin(chat_name_text.getText()。toString()。trim()。トリム()、chat_pwd_text.getText() Intent(loginActivity.this、mainactivity.class); startactivity(intent); finish();}});}/***ログインステータスに戻り、1はユーザー、2は他のユーザーです。ここでは、2人のユーザーが互いに通信するようにシミュレートされます** @param name* @param pwd* @return*/private int getlogin(string name、string pwd){if(textutils.isempty(name)|| isempty(PWD)){return 0; 1; // user1} else if(name.equals( "admin")&& pwd.equals( "2")){return 2; // user2} else {return -1; // password error}}/*** @param status*/private void getChatserver(int){chat -appliaction. chatsipliaction. chatriaction. chatserver(int)4。(クライアントコード)チャットサーバーチャットサービスコードロジックの変更
パブリッククラスチャットソーバー{プライベートソケットソケット;プライベートハンドラーハンドラー;プライベートメッセージビーンメッセージビーン;プライベートGSON = new GSON(); //ソケットオブジェクトから出力ストリームを取得し、プリントライターオブジェクトプリントライタープリントライターを構築します;入力ストリーム入力;出力ストリーム出力; {initmessage(status); initteratserver();}/***メッセージqueue、メッセージを渡すために使用される** @param handler*/public void setChathandler(handler handler){this.handler = handler;} private void initchatserver(){// open swrewを受信するための初期化{messagebean = new MessageBean(); userinfobean userinfobean = new userininfobean(); userininfobean.setuserid(2); messagebean.setmessageid(1); messionbean.setchattype(1); userininfobean.setusername( "admis"); userinfobean.setuserpwd( "123123123a");チャットターゲットユーザーIDIF(status == 1){//ユーザー1の場合、彼はユーザー2を指してmessagebean.setuserid(1); messagebean.setfriendid(2);} else if(status == 2){//ユーザー2の場合、ユーザー1を指してmessagebean.setuserid(2); messagebean.setfriendid(1);} chatappliaction.userinfobean;}/***メッセージを送信** @param contentmsg*/public void sendmessage(string contentmsg){try {if(socket == null){message message = handler.obtainmessage(閉じて "; handler.sendmessage(message); return;} byte [] str = contentmsg.getBytes(" utf-8 "); //コンテンツをutf-8string aaa = new String(str); messagebean.setcontent(aaa); string messagejson = gson.tojson(messagebean);/***サーバー上のreadline()が読み取りをブロックしているため** newline文字を読み取れない場合、またはそこでブロックされる場合、そこでブロックされます。 "/n";output.write(messagejson.getBytes("utf-8"));// print newline Charature output.flush(); //サーバーがすぐに文字列を受信するように出力ストリームを更新して} catch(例外e){e.printstacktrace(); log.e( "test"、 "error:" + e.tostring();}}/*** firn the child thread*/private void receivemessage(){new runnable(){new Runrideable(){new Runride()ネイティブポートへのクライアントリクエスト8080 Socket = new Socket(socketurls.ip、socketurls.port); //ソケットオブジェクトから入力ストリームを取得し、対応するbufferedreaderオブジェクトPrintwriter = new PrintputStream(); input = socket.getInputStream(); dataoutputStream(socket.getOutputStream()); //クライアントバッファレッドリーダー= new inputStreamReader(input))から情報を取得します。 line); messagebean messagebean = gson.fromjson(line、messagebean.class); message message = handler.obtainmessage(); message.obj = messagebean.getContent(); message.what = 1; handler.sendmessage(message);} if(socket == null)break;} output.close()ソケット入力ストリームsocket.close(); // close socket} catch(例外e){e.printstacktrace(); log.e( "test"、 "error:" + e.tostring();}}})。このようにして、コードロジックは、メッセージプッシュのロジックからシングルチャットのロジックに変更されました。
このコードにより、ユーザー1とユーザー2が互いにチャットすることができ、サーバーはそれらの間のチャット履歴を記録します。また、サーバーにはメッセージプッシュの機能もあります。
上記は、ソケットを使用して単一のチャットルームを実装する編集者(ii)が紹介したJavaソケットチャットルームプログラミングです。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!