1. 程式人生 > >思路超簡單的Android Socket 通訊 Demo 註釋詳細

思路超簡單的Android Socket 通訊 Demo 註釋詳細

思路超簡單的Android Socket 通訊  Demo 註釋詳細

demo下載  http://download.csdn.net/detail/menglele1314/9280379

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。

Socket型別為流套接字(streamsocket)和資料報套接字(datagramsocket)。

Socket基本實現原理

TCP與UDP
1基於TCP協議的Socket
伺服器端首先宣告一個ServerSocket物件並且指定埠號,然後呼叫Serversocket的accept()方法接收客戶端的資料。accept()方法在沒有資料進行接收的處於堵塞狀態。(Socketsocket=serversocket.accept()),一旦接收到資料,通過inputstream讀取接收的資料。
客戶端建立一個Socket物件,指定伺服器端的ip地址和埠號(Socketsocket=newSocket("172.168.10.108",8080);),通過inputstream讀取資料,獲取伺服器發出的資料(OutputStreamoutputstream=socket.getOutputStream()),最後將要傳送的資料寫入到outputstream即可進行TCP協議的socket資料傳輸。
2基於UDP協議的資料傳輸
伺服器端首先建立一個DatagramSocket物件,並且指點監聽的埠。接下來建立一個空的DatagramSocket物件用於接收資料(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端傳送的資料,receive()與serversocket的accepet()類似,在沒有資料進行接收的處於堵塞狀態。
客戶端也建立個DatagramSocket物件,並且指點監聽的埠。接下來建立一個InetAddress物件,這個物件類似與一個網路的傳送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定義要傳送的一個字串,建立一個DatagramPacket物件,並制定要講這個資料報包傳送到網路的那個地址以及埠號,最後使用DatagramSocket的物件的send()傳送資料。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)
TCP使用的是流的方式傳送,UDP是以包的形式傳送。

上點程式碼

新增許可權
<!--允許應用程式改變網路狀態-->    
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>    
    
<!--允許應用程式改變WIFI連線狀態-->    
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>    
    
<!--允許應用程式訪問有關的網路資訊-->    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    
    
<!--允許應用程式訪問WIFI網絡卡的網路資訊-->    
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    
    
<!--允許應用程式完全使用網路-->    
<uses-permission android:name="android.permission.INTERNET"/> 

客戶端
package com.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import org.apache.commons.io.IOUtils;

public class AbsClient {

	public static void main(String[] args) {
		request("registered");// login
	}

	public static String request(String params) {
		Socket socket = null;
		String object = null;
		try {
			// 1.連線伺服器
			String ip = InetAddress.getLocalHost().getHostAddress();// 伺服器Ip地址
			System.out.println("AbsClient*****連線伺服器");
			socket = new Socket("127.0.0.1", 8485);
			System.out.println("AbsClient*****已經建立連線");
			// 2.傳送請求資料
			System.out.println("AbsClient*****傳送請求");
			sendRequest(socket.getOutputStream(), params);
			socket.isInputShutdown();
			System.out.println("AbsClient*****請求傳送成功*****接收響應");
			// 3.接收並解析響應資料
			object = receiveResponse(socket.getInputStream());
			System.out.println("AbsClient*****響應接收完成*****伺服器返回結果");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != socket) {
				try {
					// 4.斷開連線
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 5.返回接收的資料
		return object;
	}

	/******** 生成併發送請求資料 ***************************************************/
	public static void sendRequest(OutputStream out, String params) throws Exception {
		out.write(params.getBytes());
		out.flush();
		System.out.println("AbsClient我傳送到服務端去》》》" + params);
	}

	/*********** 接收並解析響應資料 ***********************************/
	public static String receiveResponse(InputStream in) throws Exception {
		String data = IOUtils.toString(in);// 儲存從伺服器響應的結果
		System.out.println("AbsClient我是收到服務端的》》》" + data);
		return data;
	}

}

服務端

package com.server;

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

public class AbsServer {

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

	static Thread thread = new Thread() {
		private ServerSocket ss;

		public void run() {
			try {
				ss = new ServerSocket(8485);
				System.out.println("AbsServer伺服器已經啟動");
				while (true) {
					Socket socket = ss.accept();
					try {
						socket.setSoTimeout(5 * 1000);
						// 1.接收並解析請求資料
						String type = receiveRequest(socket.getInputStream());
						String result = null;
						if ("login".equals(type)) {
							result = "AbsServer恭喜你註冊成功,我是服務端返回的訊息";
						} else {
							result = "AbsServer我是服務端返回的登入資訊";
						}
						// 2.生成併發送響應資料
						sendRespnose(socket.getOutputStream(), result);
					} catch (Exception e) {
						System.out.println("AbsServer通訊失敗");
						e.printStackTrace();
					} finally {
						try {
							// 3.斷開連線
							socket.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println("AbsServer伺服器已經停止");
		}

		/********** 接收請求資訊 ***************************************/
		public String receiveRequest(InputStream in) throws Exception {
			// 接收,解析請求
			byte[] buf = new byte[4096];
			in.read(buf);
			String type = new String(buf);
			System.out.println("AbsServer我從客戶端來《《《" + type);
			return type;
		}

		/********** 返回請求要的資訊 **************************************************/
		public void sendRespnose(OutputStream out, String result) throws Exception {
			out.write(result.getBytes());
			out.flush();
			System.out.println("AbsServer我發客戶端去》》》" + result);
		}

	};

}


相關推薦

思路簡單Android Socket 通訊 Demo 註釋詳細

思路超簡單的Android Socket 通訊  Demo 註釋詳細 demo下載  http://download.csdn.net/detail/menglele1314/9280379 服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對

android socket通訊demo (本篇服務於android訊息推送)

本文系作者原創,轉載請附原文地址,謝謝。 文章末尾提供本文中的原始碼下載連結,需資源積分1分,人艱不拆,下載後評論資源可獲系統返回積分=無損! 前言: 關於什麼是socket通訊,本篇文件中不進行解釋,不甚清楚的可以去百科查詢,日後得空我也會整理相關的內容。 本文

Android簡單實現Socket通訊,客戶端連線伺服器後,伺服器向客戶端傳送文字資料

案例實現的是簡單的Socket通訊,當客戶端(Android客戶端)連線到指定伺服器以後,伺服器向客戶端傳送一句話文字資訊(你可以拓展其它的了) 先看一下服務端程式的實現吧 Server.java import java.io.IOException;

Android java和C的Socket通訊demo(可用)

原址 關於Android應用與Framework的socket通訊,相信關心這個問題的朋友們已經看過《android使用socket使底層和framework通訊》這篇文章,美中不足的是作者只貼出一些關鍵的程式碼片段而並沒有放出原始碼。我這裡還是以一個能實際執行的例子為基礎

android socket 通訊(客戶端) 發送數據

exc ring private soc 頭信息 tput output vid array /** ClientSocket通訊類 **/ public class ClientSocket { /**服務器地址*/ private String serve

三、UDP實現簡單socket通訊例項

1.伺服器端程式碼 package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 類功能描述:伺服器端,先啟動伺服器端後啟動

二、多執行緒實現簡單socket通訊例項(TCP)

1.伺服器端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @createTime:2018/

一、一個簡單socket通訊例項(TCP)

  1.服務端程式碼 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @creat

PKI學習之路(一)------------------------java實現簡單socket通訊

專案地址:https://github.com/gongxianshengjiadexiaohuihui/PKI 關於什麼是socket通訊,我會寫一篇部落格去敘述 這次我們主要實現client和server通過socket進行通訊 server程式碼 package com.ggp

TCP/IP Socket通訊demo

一個例項通過client端和server端通訊 客戶端傳送:“我是客戶端,請多關照” 服務端回覆:“收到來自於"+s.getInetAddress().getHostName()+"的資訊” package com.ykw.net; import java.io.IOException; imp

簡單socket通訊伺服器和客戶端

底部附上了效果圖 伺服器程式碼: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java

Android Socket通訊如何設定超時時間

今天太閒了,實在是一個寫部落格的好日子! 其實關於這個問題可能用到的人不會很多,不過我在這裡還是說說。 正常很多人寫socket通訊時,都會直接通過new socket(IP,PORT)直接去連結伺服器。其實這種做法也沒有錯誤,但是若當伺服器IP不存在會伺服器沒有響應時,程

Java 基於TCP/IP 實現簡單socket 通訊

Server.java package com.learn; import java.io.BufferedReader; import java.io.IOException; import

java網路程式設計:8、基於TCP的socket程式設計(一)簡單socket通訊_一個客戶端

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、基於tcp的程式設計,就好像用電話進行交談一樣 二、在java中用於程式設計網路程式的類 三、套接字 + (輸出、輸入流) 1、伺服器程式編寫基本步驟: 2、客戶端程式

C#版 Socket程式設計(最簡單Socket通訊功能)

 示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊;這裡只是一個簡單的示例,是一個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。 下面是示例程式的簡單步驟說明 伺服器端:

簡單socket通訊 socket程式設計

一,服務端 # -*- coding: utf-8 -*- import socket #socket模組 import commands #執行系統命令模組 HOST='127.0.0.1' PORT=50007 s= socket.socket(socket.A

Androin學習筆記四十二:Java android Socket通訊檢測(server)連線是否斷開

Pre 在利用socket寫通訊程式的時候,想檢測伺服器是否還活著。 從網上找了很多資料,都沒有自己合適的,最後自己想了個辦法,不過也相當於截取了心跳檢測的一部分。 這裡檢測的是遠端server的連線,而不是本地是否連線成功。首先想到socket類的方法isClosed()、isConnected

Android socket通訊的長連線與心跳檢測

在Android開發中,我們可能需要和伺服器保持連線不斷開,這時需要用到socket通訊的長連線,並且定時傳送訊息檢測是否是連線狀態——心跳檢測。 我們需要一個客戶端和一個伺服器端的demo,現在我就貼出重要程式碼,主要是android客戶端的

android socket通訊,PC和模擬器,兩個模擬器之間的通訊

我已經試驗成功:  ps:模擬器做伺服器,PC機做客戶端。如果通過wifi連線的話直接訪問IP就行,不用重定向。       PC訪問模擬器用localhost即127.0.0.1, 模擬器 訪問 模擬器用10.0.2.2       本人已成功執行,看你的RP了-

thrift學習第二步,一個簡單的雙向通訊demo以及原理講解,以及注意事項

經過一番研究後,摸清楚了thrift的基本使用方法和其工作原理.thrift的確是封裝了java原生Socket,所以從根本上來講是可以實現雙向通訊的,正如上一篇文章中翻譯的外文中所說的,無需建立雙連線和輪詢,只需要做很少量的工作這個目的就可以達到先談談thri