socket编程总结
一,網絡編程中兩個主要的問題
一個是怎樣準確的定位網絡上一臺或多臺主機,還有一個就是找到主機后怎樣可靠高效的進行傳輸數據。
在TCP/IP協議中IP層主要負責網絡主機的定位,傳輸數據的路由,由IP地址能夠唯一地確定Internet上的一臺主機。
而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的傳輸數據機制,這是網絡編程的主要對象,一般不須要關心IP層是怎樣處理數據的。
眼下較為流行的網絡編程模型是客戶機/server(C/S)結構。即通信兩方一方作為server等待客戶提出請求并予以響應。客戶則在須要服務時向server提 出申請。server一般作為守護進程始終運行,監聽網絡port,一旦有客戶請求,就會啟動一個服務進程來響應該客戶,同一時候自己繼續監聽服務port,使后來的客戶也 能及時得到服務。
關于TCP&UDP請查看本人的相關博客,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46137679
二,基于Socket的java網絡編程
1,什么是Socket
網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常常使用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個port號唯一確定。
可是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必定聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。
我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。
2,Socket通訊的過程
Server端Listen(監聽)某個port是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都能夠通過Send,Write等解決方案與對方通信。
服務器根據地址類型(ipv4,ipv6)、socket類型、協議創建socket
服務器為socket綁定ip地址和端口號
服務器socket監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket并沒有被打開
客戶端創建socket
客戶端打開socket,根據服務器ip地址和端口號試圖連接服務器socket
服務器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連接信息后才返回,開始接收下一個客戶端諒解請求
客戶端連接成功,向服務器發送連接狀態信息
服務器accept方法返回,連接成功
客戶端向socket寫入信息
服務器讀取信息
客戶端關閉
服務器端關閉
服務器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手:
但是對于一個簡單的功能齊全的Socket其工作過程包含下面四個主要的步驟:
(1) 創建Socket;
(2) 打開連接到Socket的輸入/出流;
(3) 依照一定的協議對Socket進行讀/寫操作;
(4) 關閉Socket。
本人在寫學習基于java的socket編程時,參考了以下博文,鏈接如下:
http://www.cnblogs.com/mfryf/archive/2013/06/12/3133346.html
3,創建Socket
創建Socket
java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的client和服務端。這是兩個封裝得很好的類,使用很方便。其構造解決方案例如以下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
當中address、host和port分別是雙向連接中還有一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的port號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既能夠用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。比如:學習視頻網 http://www.xxspw.com
Socket client = new Socket(“127.0.01.”, 80);
ServerSocket server = new ServerSocket(80);
注意,在選擇port時,必須小心。每一個port提供一種特定的服務,唯獨給出正確的port,才 能獲得對應的服務。0~1023的port號為系統所保留,比如http服務的port號為80,telnet服務的port號為21,ftp服務的port號為23, 所以我們在選擇port號時,最好選擇一個大于1023的數以防止發生沖突。
在創建socket時假設錯誤發生,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。
4,簡單的Client/Server程序
(實現一對一的在線聊天)
2. server端程序
5,支持多客戶的client/server程序
前面的Client/Server程序僅僅能實現Server和一個客戶的對話。在實際應用 中,往往是在server上運行一個永久的程序,它能夠接收來自其他多個client的請求,提供對應的服務。為了實如今server方給多個客戶提供服務的功能,須要對上 面的程序進行改造,利用多線程實現多客戶機制。server總是在指定的port上監聽是否有客戶請求,一旦監聽到客戶請求,server就會啟動一個專門的服務線程來響 應該客戶的請求,而server本身在啟動完線程之后立即又進入監聽狀態,等待下一個客戶的到來。
總結
以上是生活随笔為你收集整理的socket编程总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两类传输协议:TCPUDP总结
- 下一篇: 【Java线程】简单实现带界面的一对一聊