関連する読書: Javaソケットチャットルームプログラミング(ii)ソケットを使用してシングルチャットルームを実装する
ソケットを使用してインターネットにチャットを実装する例はすでに多くありますが、私はそれらの多くを見てきましたが、多かれ少なかれ問題があります。
ここでは、比較的完全なチャットの例を実装し、そのロジックを説明します。
ソケットは比較的大きいため、いくつかの記事を分割して、比較的完全なソケットの例を記述します。
ここでは、まず、サーバークライアント通信とクライアントの最も単純な機能を実装して、メッセージプッシュを実現します。
目的:サーバーは、クライアントとの接続を確立します。クライアントはメッセージをサーバーに送信でき、サーバーはクライアントにメッセージをプッシュできます。
1. Javaを使用してソケットチャットサーバーを作成します
1。Socketurlsは、IPアドレスとポート番号を決定します
public class socketurls {// IPアドレスpublic final static string ip = "192.168.1.110"; //ポート番号パブリック最終static int port = 8888;}2。メインプログラムの入り口
public class main {public static void main(string [] args)throws Exception {new Chatserver()。initserver();}}3。Beanエンティティクラス
userinfobean
public class main {public static void main(string [] args)throws Exception {new Chatserver()。initserver();}}MessageBeanをチャットします
public class messagebeanはuserinfobeanを拡張します{private long messageid; // message idprivate long groupid; // group idprivate boolean isgoup; //グループメッセージプライベートintチャットタイプ; //メッセージタイプ; 1、テキスト; 2、画像;エラーコード; //エラーコード// omit get/setメソッド}4。最も重要なプログラムであるChatserverチャットサービス
パブリッククラスチャットサーバー{//ソケットサービスプライベートスタティックサーバーソケットサーバー;パブリックGSON gson = new gson();/*** Socket Service*/public void initserver(){//ポート8080サーバーで顧客リクエストを聴くためにサーバーソケットを作成します= new Serversocket(sockurls.port); Auto-generated Catch Blocke.printstacktrace();}}/***メッセージ管理を作成し、メッセージを受信し続けます*/private void createmessage(){try {system.out.println( "waiting waiting"); // use accept()をブロックしてクライアントリクエストをブロックして待機しますserver.out.println: socket.getport()); //チャイルドスレッドを開き、別のソケットが新しいスレッドに結合するのを待つ(new runnable(){public void run(){createmessage();}})。 inputStreamReader(socket.getinputStream()) strin.readline(); // readlineはnewlineをエンドポイントとして使用するため、end += = "/n"; output.write(buffer.getbytes("utf-8"))hewed data output.flush();}} catch(ioexception e){// dodo auto-generated catch catch catch();}} flush.flush() blocke.printstacktrace();}}}) {messagebean messagebean.fromjson(line、messagebean.class); system.out.println( "user:" + messagebean.getusername()); system.out.println( "content:" + messagebean.getcontent();}}}} // server. // blocke.printstacktrace(); system.out.println( "error:" + e.getmessage();}}}}}2.Android側は、サーバーに接続するためのモバイル側として使用されます
1.アプリケーションは、グローバルチャットサービスをインスタンス化します
public class chatappliaction拡張アプリケーション{public static chatserver chatserver; public static userinfobean userinfobean; @overridepublic void oncreate(){super.oncreate();}}}2。IPアドレスとポート番号はサーバーと一致しています
3.チャットの強さはサーバー側と同じです
4。XMLレイアウト。ログインして、チャットします
1。ログインします
<?xml version = "1.0" encoding = "utf-8"?> <linearlayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_pa Rent "Android:Orientation =" Vertical "> <edittextandroid:id ="@+id/chat_name_text "android:layout_width =" match_parent "android:layou t_height = "wrap_content" android:hint = "username" android:text = "admin"/> <edittextandroid:id = "@+id/chat_pwd_text" android:layout_width = " match_parent "android:layout_height =" wrap_content "android:hint =" password "android:text =" 123123123a "android:inputtype =" numberpassword " /> <buttonandroid:id = "@+id/chat_login_btn" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "login"/> </linearlayout>
2。チャット
<?xml version = "1.0" encoding = "utf-8"?> <linearlayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_width =" match_parent "android:layout =" match_parent "android" 「Vertical」ツール:Context = "。Activity.Mainactivity"> <ScrollViewAndroid:id = "@+id/scrollview" android:layout_width = "match_parent" android:layout_height = "" android:layout_weight = "0.9"> <linearlayoutandr oid:id = "@+id/chat_ly" android:layout_width = "match_width" android:layout_height = "match_parent" android:orientation = "vertical"> </linearlayout> </scrollview> <linearlayoutandroid:layout_width = "match_par ent "android:layout_height =" wrap_content "android:orientation =" horizontal "> <edittextandroid:id ="@+id/chat_et "android" android_width = "0DP" /> <buttonandroid:id="@+id/send_btn" android:layout_width="0dp" android:layout_height="match_parent "android:layout_weight="0.2"android:text="send"/>
5。LoginActivityログイン
パブリッククラスのログニクティ率は、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 onclick(view v){if(getlogin(chat_name_text.getText()。toString()。trim()、chat_pwd_text.getText()。toString()。toString()。 mainActivity.class); startactivity(intent); finish();}}}});} private boolean getlogin(string name、string pwd){if(textutils.isempty(name)|| isempty(pwd))return fals; false;} private void getChatserver(){chathappliaction.chatserver = new Chatserver();}}}6. MainActivityチャット
パブリッククラスのMainActivityはAppCompatActivityを拡張します{private linearlayout chat_ly; private textview left_text、right_view; private edittext chat_et; private button send_btn; private viewgroup.layoutparams layoutparams = new viewgroup.layoutparams(viewgroup.layoutparams.matm.matrioutpary viewgroup.layoutparams.wrap_content);@overridedotected void oncreate(bundle savedinstancestate){super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); chat_ly =(linearlayout)findviewid(r.id.chat_ty); findViewById(r.id.chat_et); send_btn =(button)findviewbyid(r.id.send_btn); send_btn.setonclicklistener(new View.onclickListener(){@overridepublic void onclick(ビューv) {chathappliaction.chatserver.sendmessage(chat_et.getText()。toString()。trim()); chat_ly.addview(initirightView(chat_et.getText()。toString()。toString()。トリム();}}); // {@overridepublic void handlemessage(message msg){if(msg.what == 1){//メッセージを送信した後、uichat_ly.addview(msg.obj.tostring());}}}}) MessageContent){right_view = new textView(this); right_view.setlayoutparams(layoutparams); right_view.setgravity(view.focus_view.settext(messagecontent); return right_view;}/** reght* @prive biew* @private*/**メッセージmessageContent){left_text = new TextView(this); left_text.setLayoutParams(layoutParams); left_text.setGravity(view.focus_left); left_text.settext(messagecontent); return left_text;}}}}7。最も重要なチャットチャットロジック
パブリッククラスのchatserver {プライベートソケットソケット;プライベートハンドラーハンドラー;プライベートメッセージビーンメッセージビーン;プライベートgson = new gson(); //ソケットオブジェクトから出力ストリームを取得し、プリントライターオブジェクトPrintwriter Printwriter;入力ストリーム入力;出力ストリーム出力;メッセージキュー、メッセージを渡すために使用されるメッセージ** @Param Handler*/public void setChathandler(Handler Handler){this.handler = handler;} private void inithitserver(){// Open Swrep(){//メッセージReceivemessage() messagebean(); messagebean.setuserid(1); messagebean.setmessageid(1); messionbean.setchattype(1); messionbean.setusername( "admin"); chatappliaction.userinfobean = messagebean;}/***メッセージ** @param contentsage = edingmessgsg(sendmessgsg(sendmessg)) null){message message = handler.obtainmessage(); message.what = 1; message.obj = "handler.sendmessage(message); return;} byte [] contentsmsg.getBytes(" utf-8 "); // content utf-8string aaa = aaa = new string(aa gson.tojson(messagebean);/***サーバー上のreadline()が読み取りをブロックしているため* newline文字を読み取れない場合、または出力ストリームが終了した場合、そこでブロックされます*したがって、jsonメッセージの最後に、メッセージが送信されていることをサーバーに伝えるために新しいライン文字が追加されます**/messagejson += "/n" Newline Print output.flush(); //サーバーがすぐに文字列を受信するように出力ストリームを更新} catch(例外e){e.printstacktrace(); log.e( "test"、 "er error:" + e.tostring();}}/*** childスレッドでメッセージを受け取ります*/private void receivemessage(){new runrideable(){new Runride(){new Runride()ネイティブポートへのクライアントリクエスト8080 Socket = new Socket(socketurls.ip、socketurls.port); //ソケットオブジェクトから入力ストリームを取得し、対応するbufferedreaderオブジェクトPrintwriter = new PrintputStream(); input = socket.getInputStream(); dataoutputStream(socket.getOutputStream()); //クライアントバッファレッドリーダーBFFから情報を取得する(new inputStreamReader(input)); line); message message = handler.obtainmessage(); message.obj = line; message.what = 1; handler.sendmessage(message);} if(socket == null)break(); // close socket output stream input.close(); {e.printstacktrace(); log.e( "test"、 "error:" + e.tostring();}}})。start();}}}}}}}ちなみに、すべてのコードが完了しました。
このデモにより、携帯電話はサーバーとサーバーに携帯電話にメッセージを送信できます。
このデモはプッシュ関数と見なすことができますが、実際のプッシュはそれほど単純ではありません。ソケットの初心者として、ソケットプログラミングのアイデアを見ることができます。
上記は、編集者(1)によって導入されたJavaソケットチャットルームプログラミングで、ソケットを使用してチャットメッセージプッシュを実装します。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!