本來想講一下基礎(chǔ)的網(wǎng)絡(luò)通信方面的知識點(diǎn),發(fā)現(xiàn)太枯燥乏味了,不過筆試中也經(jīng)常會問到這方面的問題,所以關(guān)于通信方面的知識點(diǎn),小編會放到面試中去,因為實(shí)戰(zhàn)中也就面試會用到這方面知識點(diǎn)
Android與服務(wù)器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的大差異在于,http連接使用的是“請求—響應(yīng)方式”,即在請求時建立連接通道,當(dāng)客戶端向服務(wù)器發(fā)送請求后,服務(wù)器端才能向客戶端返回數(shù)據(jù)。
而Socket通信中基于TCP/IP協(xié)議的通信則是在雙方建立起連接后就可以直接進(jìn)行數(shù)據(jù)的傳輸,在連接時可實(shí)現(xiàn)信息的主動推送,而不需要每次由客戶端想服務(wù)器發(fā)送請求。而UDP則是提供無連接的數(shù)據(jù)報服務(wù),UDP在發(fā)送數(shù)據(jù)報前不需建立連接,不對數(shù)據(jù)報進(jìn)行檢查即可發(fā)送數(shù)據(jù)包
1.什么是Socket?
2.Socket通信模型:
Socket通信實(shí)現(xiàn)步驟解析:
Step 1:創(chuàng)建ServerSocket和Socket
Step 2:打開連接到的Socket的輸入/輸出流
Step 3:按照協(xié)議對Socket進(jìn)行讀/寫操作
Step 4:關(guān)閉輸入輸出流,以及Socket
好的,我們接下來寫一個簡單的例子,開啟服務(wù)端后,客戶端點(diǎn)擊按鈕然后鏈接服務(wù)端, 并向服務(wù)端發(fā)送一串字符串,表示通過Socket鏈接上服務(wù)器~
一、1.基于TCPSocket服務(wù)端的編寫:
服務(wù)端要做的事有這些:
Step 1 :創(chuàng)建ServerSocket對象,綁定監(jiān)聽的端口
Step 2 :調(diào)用accept()方法監(jiān)聽客戶端的請求
Step 3 :連接建立后,通過輸入流讀取客戶端發(fā)送的請求信息
Step 4 :通過輸出流向客戶端發(fā)送響應(yīng)信息 Step 5 :關(guān)閉相關(guān)資源
代碼實(shí)現(xiàn):
創(chuàng)建一個Java項目,然后把Java代碼貼進(jìn)去即可!這里可以用eclipse來寫服務(wù)端,as來寫安卓端
public class SocketServer { public static void main(String[] args) throws IOException { //1.創(chuàng)建一個服務(wù)器端Socket,即ServerSocket,指定綁定的端口,并監(jiān)聽此端口 ServerSocket serverSocket = new ServerSocket(12345); InetAddress address = InetAddress.getLocalHost(); String ip = address.getHostAddress(); Socket socket = null; //2.調(diào)用accept()等待客戶端連接 System.out.println("~~~服務(wù)端已就緒,等待客戶端接入~,服務(wù)端ip地址: " + ip); socket = serverSocket.accept(); //3.連接后獲取輸入流,讀取客戶端信息 InputStream is=null; InputStreamReader isr=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; is = socket.getInputStream(); //獲取輸入流 isr = new InputStreamReader(is,"UTF-8"); br = new BufferedReader(isr); String info = null; while((info=br.readLine())!=null){//循環(huán)讀取客戶端的信息 System.out.println("客戶端發(fā)送過來的信息" + info); } socket.shutdownInput();//關(guān)閉輸入流 socket.close(); } }