使用Android網路程式設計實現簡易聊天室
http://blog.csdn.net/u010142437/article/details/9327541
在Java中我們可以利用socket程式設計實現聊天室,在Android中也一樣,因為Android完全支援JDK本身的TCP、UDP網路通訊API。我們可以使用ServerSocket、Socket來建立基於TCP/IP協議的網路通訊;也可以使用DatagramSocket、Datagrampacket、MulticastSocket來建立基於UDP協議的網路通訊。下面實現一個簡單的聊天室,伺服器端完全用Java程式碼實現,跟Android無關,客戶端用Android應用來實現。
伺服器不斷讀取來自客戶端的資訊,並即時地將資訊傳送給每個連線到本伺服器上的客戶端,每個客戶端可以向伺服器傳送訊息,並不斷地接收來自伺服器的訊息,並將訊息顯示在介面上。這樣就實現了客戶端與客戶端之間的即時聊天功能。程式碼如下:
伺服器端:
建立伺服器的主類:
- package com.home.server;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- public class MyServer {
- // 定義儲存所有Socket的集合
- public static ArrayList<Socket> socketList = new ArrayList<Socket>();
- public static void main(String[] args) throws IOException {
- ServerSocket ss = new ServerSocket(20000);
- System.out.println("伺服器建立成功!");
- System.out.println("等待客戶端的連線。。。");
- while (true) {
- // 此行程式碼會阻塞,等待使用者的連線
- Socket socket = ss.accept();
- System.out.println("有客戶端連線進來!");
- socketList.add(socket);
- // 每當客戶端連線後啟動一條ServerThread執行緒為該客戶端服務
- new Thread(new ServerThread(socket)).start();
- }
- }
- }
伺服器的執行緒類:
- package com.home.server;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.net.Socket;
- public class ServerThread implements Runnable {
- // 定義當前執行緒所處理的Socket
- private Socket socket = null;
- // 該執行緒所處理的Socket所對應的輸入流
- BufferedReader br = null;
- public ServerThread(Socket socket) throws IOException {
- this.socket = socket;
- // 初始化該Socket對應的輸入流
- br = new BufferedReader(new InputStreamReader(socket.getInputStream(),
- "utf-8"));
- }
- @Override
- public void run() {
- try {
- String content = null;
- // 採用迴圈不斷從Socket中讀取客戶端傳送過來的資料
- while ((content = readFromClient()) != null) {
- // 遍歷socketList中的每個Socket,將讀到的內容向每個Socket傳送一次
- for (Socket s : MyServer.socketList) {
- OutputStream os = s.getOutputStream();
- os.write((content + "\n").getBytes("utf-8"));
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 定義讀取客戶端資料的方法
- *
- * @return
- */
- private String readFromClient() {
- try {
- return br.readLine();
- }
- // 如果捕捉到異常,表明該Socket對應的客戶端已經關閉
- catch (Exception e) {
- // 刪除該Socket
- MyServer.socketList.remove(socket);
- e.printStackTrace();
- }
- return null;
- }
- }
客戶端主類(Activity):
- package com.home.activity;
- import java.io.OutputStream;
- import java.net.Socket;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import com.home.R;
- import com.home.util.ClientThread;
- public class MultiThreadClient extends Activity {
- private EditText input, show;
- private Button sendBtn;
- private OutputStream os;
- private Handler handler;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- input = (EditText) findViewById(R.id.main_et_input);
- show = (EditText) findViewById(R.id.main_et_show);
- sendBtn = (Button) findViewById(R.id.main_btn_send);
- handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // 如果訊息來自子執行緒
- if (msg.what == 0x234) {
- // 將讀取的內容追加顯示在文字框中
- show.append("\n" + msg.obj.toString());
- }
- }
- };
- new Thread() {
- public void run() {
- Socket socket;
- try {
- socket = new Socket("192.168.0.101", 20000);
- // 客戶端啟動ClientThread執行緒不斷讀取來自伺服器的資料
- new Thread(new ClientThread(socket, handler)).start();
- os = socket.getOutputStream();
- } catch (Exception e) {
- e.printStackTrace();
- }
- };
- }.start();
- sendBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- // 將使用者在文字框內輸入的內容寫入網路
- os.write((input.getText().toString() + "\r\n").getBytes());
- // 清空input文字框資料
- input.setText("");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
客戶端執行緒類:
- package com.home.util;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import android.os.Handler;
- import android.os.Message;
- public class ClientThread implements Runnable {
- private Handler handler;
- // 該執行緒所處理的Socket所對應的輸入流
- private BufferedReader br = null;
- public ClientThread(Socket socket, Handler handler) throws IOException {
- this.handler = handler;
- br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- }
- @Override
- public void run() {
- try {
- String content = null;
- // 不斷讀取Socket輸入流的內容
- while ((content = br.readLine()) != null) {
- // 每當讀到來自伺服器的資料之後,傳送訊息通知程式介面顯示該資料
- Message msg = new Message();
- msg.what = 0x234;
- msg.obj = content;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
Activity的佈局XML:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <EditText
- android:id="@+id/main_et_input"
- android:layout_width="240dp"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/main_btn_send"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="10dp"
- android:text="傳送" />
- </LinearLayout>
- <EditText
- android:id="@+id/main_et_show"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:cursorVisible="false"
- android:editable="false"
- android:gravity="top" />
- </LinearLayout>
許可權:
- <uses-permission android:name="android.permission.INTERNET"/>
相關文章
- uniapp專案實踐總結(十五)使用websocket實現簡易聊天室APPWeb
- Python基於Socket實現簡易多人聊天室Python
- C++程式設計_簡易計時器(Timer)的控制檯實現C++程式設計
- Java網路程式設計----透過實現簡易聊天工具來聊聊BIOJava程式設計
- Android使用Kotlin+Retrofit+Rxjava實現簡單的網路請求AndroidKotlinRxJava
- 快捷簡易統計圖表模型設計與實現模型
- 【Linux系統程式設計】libevent庫實現簡易tcp伺服器Linux程式設計TCP伺服器
- [譯] 使用響應式程式設計來實現簡易版的無限滾動載入程式設計
- Android 網路程式設計系列(4)使用 HttpUrlConnectionAndroid程式設計HTTP
- Node TCP /UDP 簡易聊天室TCPUDP
- 網易實習2019程式設計題 牛牛揹包程式設計
- NATAPP實現內網穿透簡易教程APP內網穿透
- C++實現簡易計算器C++
- 程式設計師如何實現“網際網路+”07-如何提高網站流量程式設計師網站
- Java介面程式設計實戰(一)——簡易QQ登入介面Java程式設計
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- 精研3道簡單的網易2018校招程式設計題程式設計
- Go 語言使用.NET 包實現 Socket 網路程式設計Go程式設計
- 使用輪詢&長輪詢實現網頁聊天室網頁
- namedtuple簡易實現
- Rust 程式設計,實現簡單的佇列Rust程式設計佇列
- 程式設計師如何實現“網際網路+”10-如何分析網站資料程式設計師網站
- Android AOP程式設計之雙擊攔截實現Android程式設計
- 用Java程式碼實現一個簡單的聊天室功能Java
- 一個簡易郵件群發軟體設計與實現
- 程式設計師如何實現“網際網路+”09-如何提高轉化率程式設計師
- 網路程式設計原理與UDP實現程式設計UDP
- NIO實現聊天室之:一切都要從網路程式設計的基礎開始聊起!程式設計
- HUST-計算機網路實驗-socket程式設計計算機網路程式設計
- js程式碼實現多人聊天室JS
- 程式設計師如何實現“網際網路+”01-程式設計師走向自由職業的 5 種常見方式程式設計師
- 微信小程式 簡易搜尋功能實現微信小程式
- py網路工具程式設計程式設計
- 網路通訊程式設計程式設計
- 簡易版 vue實現Vue
- 前端 JavaScript 實現一個簡易計算器前端JavaScript
- [C++ Daily] 使用模板實現簡易Python WrapperC++AIPythonAPP
- UDP協議網路Socket程式設計(java實現C/S通訊案例)UDP協議程式設計Java
- 程式設計師如何實現“網際網路+”03-為什麼需要有個網站程式設計師網站