English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事は、Androidでsocketを使用したシンプルなCの実装について説明しています。/Sチャット通信機能。皆の参考に供します。以下の通りです:
主なアイデア:クライアント上でメッセージを送信し、バックグラウンドでスレッドを開いてサーバーを充当し、メッセージを受信するとすぐにクライアントにフィードバックします。
第1歩:Activityを継承するSocketClientActityクラスを作成し、パッケージはcom.pku.netです。
レイアウトファイルsocketclient.xmlを記述します。以下はそのコードです:
<?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_parent" android:orientation="vertical" > <ScrollView android:id="@"+id/scrollview3" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@"+id/chattxt2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#"98F5FF" /> </ScrollView> <EditText android:id="@"+id/chattxt" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@"+id/chatOk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="送信" > </Button> </LinearLayout>
次にSocketClientActity.Javaファイルを記述します:
package com.pku.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.net.UnknownHostException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.*; public class SocketClientActivity extends Activity { SocketServerThread yaochatserver; /** アクティビティが最初に作成されたときに呼び出されます。 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.socketclient); try { yaochatserver = new SocketServerThread(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (yaochatserver != null) { yaochatserver.start(); } findviews(); setonclick(); } private EditText chattxt; private TextView chattxt2; private Button chatok; public void findviews() { chattxt = (EditText) this.findViewById(R.id.chattxt); chattxt2 = (TextView) this.findViewById(R.id.chattxt2); chatok = (Button) this.findViewById(R.id.chatOk); } private void setonclick() { chatok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { connecttoserver(chattxt.getText().toString()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public void connecttoserver(String socketData) throws UnknownHostException, IOException { Socket socket = RequestSocket("127.0.0.1", 5000); SendMsg(socket, socketData); String txt = ReceiveMsg(socket); this.chattxt2.setText(txt); } private Socket RequestSocket(String host, int port) throws UnknownHostException, IOException { Socket socket = new Socket(host, port); return socket; } private void SendMsg(Socket socket, String msg) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); writer.write(msg.replace("\n", " ")); + "\n"); writer.flush(); } private String ReceiveMsg(Socket socket) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); String txt = reader.readLine(); return txt; } }
AndroidManifest.xmlファイルの作成方法:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android package="com.pku.net" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".HttpURLActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN"> /> <category android:name="android.intent.category.LAUNCHER"> /> </intent-filter> </activity> <activity android:name="GetNetImage"></activity> <activity android:name="HttpClientActivity"></activity> <activity android:name="SocketClientActivity"></activity> </application> </manifest>
最後にバックグラウンドのサーバーサービスのファイルSocketServerThread.javaを以下のように書きます:
package com.pku.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServerThread extends Thread { public SocketServerThread() throws IOException { CreateSocket(); // Socketサーバーを生成します } public void run() { Socket client; String txt; try { while (true) // スレッドは無限ループし、socketポートをリアルタイムで監視します { client = ResponseSocket(); // クライアントリンク要求に応答します。。 while (true) { txt = ReceiveMsg(client); System.out.println(txt); // クライアントからメッセージを受信し、それをサーバーのスクリーンに表示します SendMsg(client, txt); // クライアントにメッセージを返信します if (true) break; // 中断し、リンク要求を待ち続けます } CloseSocket(client); // このリンクを閉じます } } catch (IOException e) { System.out.println(e); } } private ServerSocket server = null; private static final int PORT = 5000; private BufferedWriter writer; private BufferedReader reader; private void CreateSocket() throws IOException { server = new ServerSocket(PORT, 100); System.out.println("Server starting.."); } private Socket ResponseSocket() throws IOException { Socket client = server.accept(); System.out.println("client connected.."); return client; } private void CloseSocket(Socket socket) throws IOException { reader.close(); writer.close(); socket.close(); System.out.println("client closed.."); } private void SendMsg(Socket socket, String Msg) throws IOException { writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); writer.write(Msg + "\n"); writer.flush(); } private String ReceiveMsg(Socket socket) throws IOException { reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); System.out.println("server get input from client socket.."); String txt = "Sever send:" + reader.readLine(); return txt; } /* public static void main(final String args[]) throws IOException { SocketServerThread yaochatserver = new SocketServerThread(); if (yaochatserver != null) { yaochatserver.start(); } } */ }
実行結果は以下の図に示されています:
Androidに関する詳細な内容に興味がある読者は、本サイトの特集を確認してください:《Android通信方式の要約》、《Android開発入門と進階チュートリアル》、《Androidデバッグ技術と一般的な問題解決方法のまとめ》、《Androidメディア操作技術のまとめ(オーディオ、ビデオ、録音など)》、《Android基本コンポーネントの使用法のまとめ》、《AndroidビューViewの技術のまとめ》、《Androidレイアウトlayoutの技術のまとめ》および《Androidコントロールの使用法のまとめ》
本文の内容が皆様のAndroidプログラムデザインに役立つことを願っています。
声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。本サイトは所有権を持ちません。人工編集は行われていません。また、関連する法的責任を負いません。著作権侵害が疑われる内容がある場合は、メールを送信してください:notice#oldtoolbag.com(メール送信時、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりついたら、本サイトは即座に侵害疑いのコンテンツを削除します。)