相見恨晚--Socket通訊

來源:互聯網
上載者:User

標籤:socket   j2se   tcpip   

       第一次接觸Socket是大二時的課程設計,當時做的是圖書管理系統,源碼都是網上下載,考試周拿著代碼天天磨,隱約中記得有Socket這麼一個單詞。

   第二次是去年代表學校參加“河北省電子資訊職業技能大賽”,接受曹建新師哥的培訓。建新師哥當時用手機Android軟體做用戶端,通過區域網路向電腦端伺服器傳輸手機錄入的資訊。當時我很詫異,用戶端是Android平台,伺服器是.Net平台,這兩種平台是如何在區域網路內進行通訊的呢?建新師哥的回答是:“通過Socket,把資料打包成JSON格式進行傳輸。”從此對Socket的認識便有了一種高大上的感覺。

   第三次接觸是通過馬士兵老師的視頻,這次瞬間感覺Socket--So Easy。這也驗證了米老師的那句話:不怕不知道,就怕不知道。

   Socket通訊分為伺服器Socket即ServerSocket和用戶端Socket。

   在伺服器端,通訊前需要建立和用戶端的通訊通道,建立對用戶端通訊連接埠號的監聽;在用戶端,通訊前需要定義進行通訊的主機IP和連接埠號碼,建立通訊通道。兩者都準備完畢,下面就可以進行通訊了。

   伺服器端代碼:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class TCPServer {public static void main(String[] args) {//建立向用戶端傳輸資料的通道InputStream in = null;//建立從用戶端接收資料的通道OutputStream out = null;try {//建立和用戶端的通訊,並定義通訊連接埠ServerSocket ss = new ServerSocket(5888);//監聽用戶端提交的請求Socket socket = ss.accept();in = socket.getInputStream();out = socket.getOutputStream();//在位元組流的基礎上進行封裝資料流DataInputStream dis = new DataInputStream(in);DataOutputStream dos = new DataOutputStream(out);//接收用戶端提交的請求String s = null;if ((s = dis.readUTF()) != null) {System.out.println(s);System.out.println("from:" + socket.getInetAddress());System.out.println("port:" + socket.getPort());}//向用戶端傳輸資料dos.writeUTF("hi,hello");dos.close();dis.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}
        由於資料流的readUTF()方法和writeUTF()方法都是阻塞式,所以當A向B發送資料後,如果B沒有響應,A是無法繼續發送資料的,只能傻傻的等待。這個過程好比TCP/IP協議的三向交握,1:A呼叫B,“我是A,收到請回答?”;2:B回應A,“我是B,收到”;3:A繼續說,“我想請你吃飯,你有時間嗎?”。下面A和B就可以進行通訊了。

   伺服器端代碼有了,下面分享用戶端代碼:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) {//建立向伺服器傳輸資料的通道InputStream in = null;//建立從伺服器接收資料的通道OutputStream out = null;try {//定義進行通訊的主機IP和連接埠號碼Socket socket = new Socket("localhost", 5888);in = socket.getInputStream();out = socket.getOutputStream();//在位元組流的基礎上進行封裝資料流DataInputStream dis = new DataInputStream(in);DataOutputStream dos = new DataOutputStream(out);//向伺服器提交資料dos.writeUTF("hey");//接收從伺服器返回的資料String s = null;if ((s = dis.readUTF()) != null) {System.out.println(s);}dos.close();dis.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();}catch(IOException e){e.printStackTrace();}}}
      通過這個簡單的小Demo,我們就可以清晰的觀察到Socket是如何在伺服器端和用戶端進行通訊的。

    J2SE是JavaWeb和J2EE的基礎,異常處理、IO通道、線程、網路編程、GUI編程又是J2SE的基礎,所以學好Socket很有必要。

    席慕蓉說過一句名言:前世的五百次回眸才能換得今生的一次擦肩而過。所以對於以後的每次擦肩而過都應該認真對待,不要像我,和Socket都擦肩而過好多次了,今天才終於認識它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.