Socket初步了解
在這之前我們先了解一下一些關於網絡編程的概念
網絡編程從大方面說就是對信息的發送和接收,中間傳輸為物理線路的作用,編程人員可以不用考慮 網絡編程最主要的工作就是在發送端吧信息通過規定好的協議進行組裝包,在接收端按照規定好的 協議進行包裝解析,從而提取對應的信息,達到通信的目的 網絡編程的三要素 1.IP地址 唯一標識網絡上的每一臺計算機 構成:32位,由4個8位二進制數組成IP地址=網絡地址加主機地址 網絡地址:標識計算機或網絡設備所在的網段 主機地址:標識特定主機或網絡設備
2.端口 "端口"是英文port的意譯,可以認為是設備與外界通訊交流的出口。端口可分為虛擬端口和物理端口,其中虛擬端口指計算機內部或交換機路由器內的端口,不可見。例如計算機中的80端口、21端口、23端口等。物理端口又稱為接口,是可見端口,計算機背板的RJ45網口,交換機路由器集線器等RJ45端口。電話使用RJ11插口也屬於物理端口的範疇。
兩類傳輸協議:TCP UDP
TCP就是Tranfer Control Protocol的簡稱,是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。發送
方和接收方的成對的兩個socket之間必須建 立連接,以便在TCP協議的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接時,另一個
socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發送 或接收操作。
UDP就是Use Datagram Protocol的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的
路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。
什麽是Socket 網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。 建立網絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口, 這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。Socket網絡編程可以分為以下步驟
1.建立連接
2.打開Socket關聯的輸出流
3.數據流讀取信息
4.關閉所有數據流和Socket
Socket實現原理機制
1.通信兩端都有Socket
2.網絡通信其實就是Socket間的通信
3.數據在兩個Socket間通過IO傳輸
Socket 通信模型
進行網絡通信時,Socket需要借助數據流來完成數據流的傳遞工作
如何實現多客戶請求呢
采用多線程方式
一個專門負責監聽的應用服務程序
一個專門負責處理請求的線程程序
DatagramPacket類
封裝了數據報的數據,數據長度,目標地址和目標端口
DatagramSocket類
接收和發送DatagramPacket對象封裝好的數據報
基於UDP協議的Socket網絡編程步驟
1.利用DatagramPacket對象封裝數據報
2.利用DatagramSocket發送數據報
3.利用DatagramSocket接收數據報
4.利用DatagramPacket處理數據報
使用兩種協議實現簡單的對話功能(簡單的對話功能)
ServerSocket sk=new ServerSocket(11111); //2.監聽 Socket s=sk.accept(); //打包數據 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader bw=new BufferedReader(new InputStreamReader(System.in)); OutputStream os=s.getOutputStream(); String line=null; while((line=br.readLine())!=null){ System.out.println("Client \t"+line); os.write(bw.readLine().getBytes()); } //釋放資源 s.close(); //sk.close();
Socket sk=new Socket("192.168.111.1",11111); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); String line=null; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); InputStream is=sk.getInputStream(); byte [] by=new byte[1024]; int num=is.read(by); String h=new String(by, 0, num); System.out.println("Service:\t"+h); } //br.close(); //bw.close(); sk.close(); }
實現結果
==============================================
=======================================
========================================
Socket初步了解