1. 程式人生 > >Android簡單的socket網路通訊例子--群聊

Android簡單的socket網路通訊例子--群聊

Android的網路通訊很多都是基於socket,在這裡說一下簡單的Android的socket通訊的例子。在這裡我們模擬一下群聊。

首先我們瞭解一下什麼是socket,socket又稱“套接字”,應用程式通常通過“套接字”向網路發出請求或者應答請求。在Java中Socket和ServerSocket類庫位於java.net包中。ServerSocket用於伺服器端,Socket是建立網路連結使用的,連線成功後應用程式的兩端都會產生一個Socket例項,操作這個例項,我們就可以完成回話了。

Socket連結建立的過程:

1.伺服器監聽

2.客戶端發出請求

3.建立連結

4.通訊

服務端的程式碼:

package com.example.testmysetversocket.main;

/**
 * 啟動執行緒開始監聽
 * @author Allen
 *
 */
public class MyServerSocket {

	public static void main(String[] args) {
		new ServerListener().start();
		
	}

}
package com.example.testmysetversocket.main;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;
/**
 * 監聽客戶端請求的執行緒類
 * @author Allen
 *
 */
public class ServerListener extends Thread {

	@Override
	public void run() {
		//1-65535
		try {
			ServerSocket serverSocket = new ServerSocket(12345);
			//迴圈監聽來自客戶端的連線
			while (true) {
				//block
				Socket socket = serverSocket.accept();
				//建立連線
				JOptionPane.showMessageDialog(null, "有客戶端連結到了本機的12345埠");
				//將socket傳遞給新的執行緒
				ChatSocket cs = new ChatSocket(socket);
				cs.start();
				ChatManager.getChatManager().add(cs);
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

package com.example.testmysetversocket.main;

import java.util.Vector;
/**
 * 管理聊天執行緒的類,每個客戶端只有一個聊天執行緒
 * @author Allen
 *
 */
public class ChatManager {
	//把ChatManager單例化
	private ChatManager(){}
	private static final ChatManager cm = new ChatManager();
	public static ChatManager getChatManager() {
		return cm;
	}
	
	//ChatSocket執行緒管理集合
	Vector<ChatSocket> vector = new Vector<ChatSocket>();
	
	/**
	 * 新增ChatSocket
	 * @param cs
	 */
	public void add(ChatSocket cs) {
		vector.add(cs);
	}
	
	/**
	 * 向其他所有客戶端傳送資訊
	 * @param cs
	 * @param out
	 */
	public void publish(ChatSocket cs,String out) {
		for (int i = 0; i < vector.size(); i++) {
			ChatSocket csChatSocket = vector.get(i);
			//進行判斷,當前傳送資訊的執行緒就不用再接收資訊了
			if (!cs.equals(csChatSocket)) {
				csChatSocket.out(out);
			}
		}
	}
}

package com.example.testmysetversocket.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
/**
 * socket通訊的執行緒類
 * @author Allen
 *
 */
public class ChatSocket extends Thread {
	
	Socket socket;
	/**
	 * 建構函式
	 * @param s
	 */
	public ChatSocket(Socket s){
		this.socket = s;
	}
	/**
	 * 輸出訊息到客戶端
	 * @param out
	 */
	public void out(String out) {
		try {
			socket.getOutputStream().write((out+"\n").getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 從客戶端接收資訊,並把訊息傳送給其他所有的客戶端
	 */
	@Override
	public void run() {
		out("你已經連線到本伺服器了");
		try {
			BufferedReader br = new BufferedReader(
					new InputStreamReader(
							socket.getInputStream(),"UTF-8"));
			String line = null;
			//把訊息傳送給其他所有客戶端
			while ((line = br.readLine()) != null) {
				System.out.println(line);
				ChatManager.getChatManager().publish(this, line);
			}
			//這裡注意要把當前的流關閉
			br.close();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
Android端的程式碼:

MainActivity佈局檔案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/ip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.6"
            android:hint="輸入伺服器的IP地址"
            android:text="10.0.2.2" >

        </EditText>

        <Button
            android:id="@+id/connect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.4"
            android:text="連線" />

    </LinearLayout>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.86" >

        <TextView
            android:id="@+id/text"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="Ready..." />
    </ScrollView>

    <EditText
        android:id="@+id/edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="在這裡輸入內容" />

    <Button
        android:id="@+id/send"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="傳送" />

</LinearLayout>

package com.example.mysocketclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import com.jikexueyuan.mysocketclient.R;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	EditText ip;
	EditText editText;
	TextView text;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		ip = (EditText) findViewById(R.id.ip);
		editText = (EditText) findViewById(R.id.edit);
		text = (TextView) findViewById(R.id.text);

		findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				connect();
			}
		});

		findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				send();
			}
		});
	}

	//-------------------------------------

	Socket socket = null;
	BufferedWriter writer = null;
	BufferedReader reader = null;
	/**
	 * 建立連結
	 */
	public void connect() {

		
		AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {

			@Override
			protected Void doInBackground(Void... arg0) {
				try {
					socket = new Socket(ip.getText().toString(), 12345);
					writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
					reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					publishProgress("@success");
				} catch (UnknownHostException e1) {
					Toast.makeText(MainActivity.this, "無法建立連結", Toast.LENGTH_SHORT).show();
				} catch (IOException e1) {
					Toast.makeText(MainActivity.this, "無法建立連結", Toast.LENGTH_SHORT).show();
				}
				try {
					String line;
					while ((line = reader.readLine())!= null) {
						publishProgress(line);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return null;
			}

			@Override
			protected void onProgressUpdate(String... values) {
				if (values[0].equals("@success")) {
					Toast.makeText(MainActivity.this, "連結成功!", Toast.LENGTH_SHORT).show();
					
				}
				text.append("別人說:"+values[0]+"\n");
				super.onProgressUpdate(values);
			}
		};
		read.execute();

	}
	/**
	 * 傳送訊息
	 */
	public void send() {
		try {
			text.append("我說:"+editText.getText().toString()+"\n");
			writer.write(editText.getText().toString()+"\n");
			writer.flush();
			editText.setText("");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

配置檔案

注意:要加Internet訪問許可權,不然會報錯

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jikexueyuan.mysocketclient"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mysocketclient.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

就先講到這裡啦!


相關推薦

Android簡單socket網路通訊例子--

Android的網路通訊很多都是基於socket,在這裡說一下簡單的Android的socket通訊的例子。在這裡我們模擬一下群聊。 首先我們瞭解一下什麼是socket,socket又稱“套接字”,應用程式通常通過“套接字”向網路發出請求或者應答請求。在Java中Socke

unity基於TCP的socket通訊實現“”功能

一般遊戲都有內建聊天系統,socket 也是常見網路通訊方式之一,現在使用 socket 基於 TCP 實現遊戲中“群聊”功能。 老規矩,先上效果圖: 客戶端:可以同時開啟多個 服務端: 接下來上程式碼: 服務端: using System; using System

Hololens之Socket網路通訊

我用HoloLens開發網路模組時,最初的做法是用.Net的System.Net.Scoekt中的UDP,想必這個方法是大多數開發者直接想到的方法。但是在匯出時就出問題了,匯出為UWP時,報錯,大致是Socket庫裡缺少某個方法,還有我當時用的同步方法,所以自己寫的的多執行緒

[記錄]Hololens之Socket網路通訊

我用HoloLens開發網路模組時,最初的做法是用.Net的System.Net.Scoekt中的UDP,想必這個方法是大多數開發者直接想到的方法。但是在匯出時就出問題了,匯出為UWP時,報錯,大致是Socket庫裡缺少某個方法,還有我當時用的同步方法,所以自己寫的的多執行緒,然後多執行緒也報錯了:

Socket網路通訊基礎(第八天)

什麼是網路模型 網路程式設計的本質是兩個裝置之間的資料交換,當然,在**計算機網路**中,裝置主要指計算機。資料傳遞本身沒有多大的難度,不就是把一個裝置中的資料傳送給兩外一個裝置,然後接受另外一個裝置反饋的資料。 現在的網路程式設計基本上都是基於請求/響應方式的

java socket網路通訊

1.客戶端給伺服器傳送1句話 import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; public class C

初識http、https、TCP/IP、Socket網路通訊

網路由下往上分為:  物理層–                      資料鏈路層– 網路層–                       IP協議 傳輸層–                       TCP協議 會話層– 表示層和應用層–           HTTP協議 一、TCP/

Socket 網路通訊協議 http、TCP/IP協議與socket之間的區別

網路由下往上分為:  物理層-- 資料鏈路層-- 網路層-- IP協議 傳輸層-- TCP協議 會話層-- 表示層和應用層-- HTTP協議 1、TCP/IP連線 手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP連線

如何基於TCP/IP協議進行MFC Socket網路通訊程式設計

MFC Socket網路通訊程式設計        最近因為一個專案需要進行區域網絡通訊,向工作單位的軟體工程師請教了一下需要用到哪些知識,然後博主就自學了一遍windows網路通訊程式設計原理,然後就在網上找了一大堆例子,但實際執行效果並不佳,花了大概一週多的時間總算是把

Android實現https網路通訊之新增指定信任證書/信任所有證書

當Android客戶端訪問https網站,預設情況下,受證書信任限制,無法訪問,可以有兩種解決方法來實現: 1、將要訪問的https網站的ca證書新增到客戶端信任證書列表中,此種方式為谷歌推薦,安全性高。 2、將客戶端設定為信任所有證書,也就是說不驗證伺服器證書,此種方式實

MFC Socket網路通訊程式設計

 最近因為一個專案需要進行區域網絡通訊,向工作單位的軟體工程師請教了一下需要用到哪些知識,然後博主就自學了一遍windows網路通訊程式設計原理,然後就在網上找了一大堆例子,但實際執行效果並不佳,花了大概一週多的時間總算是把網路通訊程式給跑起來了(PS:雖然時間比較長,但對於一個新手程式設

java Socket網路通訊簡介

Socket1、簡介:網路上執行的程式之間雙向通訊鏈路的終結點,是tcp和udp的基礎                由ip地址和埠號組成2、java提供的網路功能                 1>InetAddress:用於標識網路上的硬體資源,相當於標識IP地

一套完整的unity的socket網路通訊模組

SocketHelper類 主要的通訊類,socket的管理放在這裡 下面說一下一些主要的方法 1.連線伺服器,這個都寫了比較詳細的註釋,一看就會明白 /// <summary> /// 連線伺服器 /// </summary

Unity3D Webplayer Socket網路通訊使用中遇到的問題總結

Unity3D Webplayer釋出時,由於安全沙箱的問題,在Socket通訊、Dll引用時會遇到一些麻煩, 但最終證明:Unity3D Webplayer模式下,完全可以使用Socket 通訊和 自己編寫的Dll(使用VS C#類庫建立的Dll),但要注意以下方面。 1

android 三種網路通訊介面及各個介面的程式碼示例

第一部分 Android網路基礎    Android平臺瀏覽器採用了WeBKit引擎,這款名為Chorme Lite的Web瀏覽器擁有強大擴充套件特性,每個開發者都以為編寫自己的外掛,使得瀏覽器的功能更加完善。    目前Android平臺有3種網路介面。   第

Socket系列(二)基於Socket網路通訊的服務端和客戶端程式設計

        Socket系列一主要介紹了Socket的基礎知識、工作原理以及與傳統的http協議的區別。這部分內容的目的是為本文做鋪墊。本文將介紹基於Socket網路通訊的伺服器端和客戶端的程式設計。 一、伺服器端的程式設計         關於Socket伺服器端的

QT 簡單網路通訊(tcp ,udp)

最近要用到Qt的Socket部分,網上關於這部分的資料都比較複雜,我在這總結一下,把Socket的主要部分提取出來,實現TCP和UDP的簡單通訊。 1.UDP通訊 UDP沒有特定的server端和client端,簡單來說就是向特定的ip傳送報文,因此我把它分為傳送端和

C# Socket網路通訊基礎教程

Socket連結的流程 套接字是支援TCP/IP協議網路通訊的基本操作單元可以將套接字看作不同主機間的程序雙向通訊的端點, 它構成了單個主機內及整個網路間的程式設計介面。 套接字存在於通訊域中, 通訊域是為了處理 一般的執行緒通過套接字通訊而引進的一種抽象概念。 套接字通常

網際網路架構(8):Socket網路通訊程式設計--Netty

三、Socket網路通訊程式設計–Netty Netty是一個提供非同步事件驅動的網路應用框架,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。 換句話說,Netty是一個NIO框架,使用它可以簡單快速地開發網路應用程式,比如客戶端和服務端的協議。Ne

C#與C/C++ Socket網路通訊

C作為客戶端(傳送端)                //建立套接字                 serSocket = socket(AF_INET, SOCK_DGRAM,0); if (serSocket == INVALID_SOCKET) {