編輯:關於Android編程
根據之前的經驗,應用軟件的網絡通信無非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的話就衍生出很多方式,基礎的HTTP GET和POST請求,然後就是WebService的SOAP。
在這些方式中,Socket當然是最基礎的。因此先從Socket開始。
服務端就不需要過多的說明了,無論采用什麼語言什麼平台都可以,只要遵循基本的Socket監聽模式就行。
實際上Android的Socket開發就是Java的Socket開發,因此學習過Java的開發人員也許覺得並沒有什麼難度,不過依然有一些不同於PC開發的地方需要注意
首先是說說TCP開發
JAVA裡的TCP開發感覺比C#裡簡單多了,實現方法幾句話就能完成。
[java]
Socket socket = new Socket("192.168.3.119",7628);//創建Socket實例,並綁定連接遠端IP地址和端口
OutputStream ops = socket.getOutputStream();//定義一個輸出流,來自於Socket輸出流
byte[] bytes = b.getBytes();
ops.write(bytes);//向輸出流中寫入數據
ops.flush();//刷行輸出流
//至此,在連接成功的情況下,服務端應該就能收到發送過去的流了。
//接下來是接收服務器發送過來的數據
InputStream ips = socket.getInputStream();//定義輸入流,來自於socket的輸入流
byte[] bytes2 = new byte[20];
ips.read(bytes2);//讀取輸入流數據
String str = new String(bytes2);//轉換成字符串
btn.setText(str);//顯示出來(我是現實在button上,當然,這個方法不正規,不過可以讓我少放點空間,看上去界面干淨點,只要能看到效果就行)
socket.close();
Socket socket = new Socket("192.168.3.119",7628);//創建Socket實例,並綁定連接遠端IP地址和端口
OutputStream ops = socket.getOutputStream();//定義一個輸出流,來自於Socket輸出流
byte[] bytes = b.getBytes();
ops.write(bytes);//向輸出流中寫入數據
ops.flush();//刷行輸出流
//至此,在連接成功的情況下,服務端應該就能收到發送過去的流了。
//接下來是接收服務器發送過來的數據
InputStream ips = socket.getInputStream();//定義輸入流,來自於socket的輸入流
byte[] bytes2 = new byte[20];
ips.read(bytes2);//讀取輸入流數據
String str = new String(bytes2);//轉換成字符串
btn.setText(str);//顯示出來(我是現實在button上,當然,這個方法不正規,不過可以讓我少放點空間,看上去界面干淨點,只要能看到效果就行)
socket.close();
服務端代碼就不多說明了,只要實現了Socket監聽和接收,發送就行。這樣Android上Tcp的Socket就完成了,很簡單。
接下來是UDP的,理論上來說,UDP的實現應該更簡單,不過,由於使用模擬器來調試的關系,出了一點小問題,郁悶了很久,另外,Java用UDP Socket對應使用的類是DatagramSocket,與C#不同,c#是在創建Socket的時候制定參數來制定協議類型,先看代碼。
[java]
DatagramSocket dgs = new DatagramSocket();//建立一個Socket,這個Socket將作為一個發送器,將Socket包發送出去
InetAddress inet = InetAddress.getByName("192.168.3.119");//創建一個InetAddress,ip地址為要發動到的遠端的服務器IP
DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//創建一個UDP數據包,數據包包含遠端的IP地址及端口
dgs.send(dgp);//發送
dgs.close();
DatagramSocket dgs2 = new DatagramSocket(9997);//創建另一個UDPSocket,
DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //創建一個空報文包
dgs2.receive(dgp2);//接收數據並填充到報文包中
String str = new String(dgp2.getData());//獲取報文包裡的數據並轉換成字符串
btn.setText(str);//顯示獲得的數據
dgs2.close();//關閉Socket
DatagramSocket dgs = new DatagramSocket();//建立一個Socket,這個Socket將作為一個發送器,將Socket包發送出去
InetAddress inet = InetAddress.getByName("192.168.3.119");//創建一個InetAddress,ip地址為要發動到的遠端的服務器IP
DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//創建一個UDP數據包,數據包包含遠端的IP地址及端口
dgs.send(dgp);//發送
dgs.close();
DatagramSocket dgs2 = new DatagramSocket(9997);//創建另一個UDPSocket,
DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //創建一個空報文包
dgs2.receive(dgp2);//接收數據並填充到報文包中
String str = new String(dgp2.getData());//獲取報文包裡的數據並轉換成字符串
btn.setText(str);//顯示獲得的數據
dgs2.close();//關閉Socket
需要特別注意的地方,在不做端口映射的情況下,UDP可能無法接受到服務器端發送過來的數據,原因是使用eclipse開發的時候,調試程序是用的模擬環境,模擬環境下,接收數據是要做端口映射的,因為模擬環境下,沒有自己真實的IP地址和端口,模擬器是使用5554來運行的,發送數據到PC沒問題,但是 PC發送到模擬器的時候,需要把本機的端口映射到模擬器上,真機環境不需要,具體操作方式如下
1、運行模擬器
2、打開DOS命令行窗口
執行:telnet localhost 5554
5554是模擬器的端口,執行之後會進入android console
3、 在console下執行:
redir add udp :8000:9000
其中,第一個端口號是PC的端口,第二個端口號是模擬器端口。
執行此命令之後,會把PC 8000端口接收到的數據轉到模擬器的9000端口,模擬器就能從9000端口接收UDP數據包了
另外,要實現Socket,必須在 AndroidManifest.xml 中加入權限如下
[xml]
<uses-permission android:name="android.permission.INTERNET" />
URL對象中前而幾個方法都非常容易理解,而該對象提供的openStream()可以讀取該 URL資源的InputStream,通過該方法可以非
很多朋友在用手機聊天的時候,常常會將自己的聊天記錄當做是一張圖片形式保存起來。或者是把一些奇葩的聊天過程曬出來。手機qq能截圖嗎?安卓手機qq怎麼開啟截屏功
首先帶大家看一下實現效果,用了兩種實現方式:1.基於LinearLayout實現,導航欄不可響應手指滑動2.基於HorizontalScrollView實現,導航欄可響應
Android特效專輯(十二)——仿支付寶咻一咻功能實現波紋擴散特效,精細小巧的View 先來看看這個效果 這是我的在Only上添加的效果,說實話