Socket 簡單的說就是處在使用者端的服務端的一個通訊端 封裝了一定的函數和API
Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。
在服務端和用戶端進行通訊的時候,需要先進行通訊串連。用戶端:Socket s=new Socket("127.0.0.1",9999); 輸入ip地址和連接埠號碼。
服務端:ServerSocket server=new ServerSocket(9999); Socket s=server.accept(); 獲得連接埠號碼。以及資料。
Client:
package com.xu.chat;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket s=null;
try {
s=new Socket("127.0.0.1",9999);
PrintWriter p=new PrintWriter(s.getOutputStream(),true);
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s1=sc.nextLine();
p.println(s1);
}
sc.close();
p.flush();
p.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Service:
package com.xu.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket server=null;
Socket s=null;
try {
server=new ServerSocket(9999);
s=server.accept();
boolean flag=true;
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br);
while(flag){
String s1=br.readLine();
if(s1.trim().toLowerCase().equals("q")){
System.out.println("用戶端不想玩了。");
flag=false;
}else{
System.out.println(s1);
}
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
s.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
總結:socket 用法遠遠不僅如此 在底層的j2ee也有大量的應用,以後還要更加深入的瞭解。
第一部分、概念的理解
1、什麼是Socket。
Socket又稱之為“通訊端”,是系統提供的用於網路通訊的方法。它的實質並不是一種協議,沒有規定電腦應當怎麼樣傳遞訊息,只是給程式員提供了一個發送訊息的介面,程式員使用這個介面提供的方法,發送與接收訊息。
Socket描述了一個IP、連接埠對。它簡化了程式員的操作,知道對方的IP以及PORT就可以給對方發送訊息,再由伺服器端來處理髮送的這些訊息。所以,Socket一定包含了通訊的雙發,即用戶端(Client)與服務端(server)。
2、Socket的通訊過程。
每一個應用或者說服務,都有一個連接埠。比如DNS的53連接埠,http的80連接埠。我們能由DNS請求到查詢資訊,是因為DNS伺服器時時刻刻都在監聽53連接埠,當收到我們的查詢請求以後,就能夠返回我們想要的IP資訊。所以,從程式設計上來講,應該包含以下步驟:
1)服務端利用Socket監聽連接埠;
2)用戶端發起串連;
3)服務端返回資訊,建立串連,開始通訊;
4)用戶端,服務端中斷連線。
3、Socket雙方如何建立起串連。
以下過程用代碼錶示:
Server端:
1 intport = 2000;
2 IPEndPointServerEP = new IPEndPoint(IPAddress.Any,port);
3 Socketserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
4 server.Bind(ServerEP);
5 server.Listen(0);
Client端:
1 intport = 2000;
2 IPAddressserverip = IPAddress.Parse("192.168.1.100");
3 IPEndPointEP = new IPEndPoint(server,port);
4 Socketserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
5 server.Bind(EP);
當伺服器端接收到來自用戶端的串連以後,需要建立一個socket來處理遠端的資訊。
下面一段代碼應該在伺服器端:
1 Socketclient = server.Accept();
以上很簡單的幾行代碼,將在以後的網路編程中經常用到,後面還會有同步通訊、非同步通訊、線程、委託與事件等等
第二部分、各協議的區別
TCP/IP SOCKET HTTP
網路七層由下往上分別為物理層、資料連結層、網路層、傳輸層、會話層、展示層和應用程式層。
其中物理層、資料連結層和網路層通常被稱作媒體層,是網路工程師所研究的對象;
傳輸層、會話層、展示層和應用程式層則被稱作主機層,是使用者所面向和關心的內容。
http協議 對應於應用程式層
tcp協議 對應於傳輸層
ip協議 對應於網路層
三者本質上沒有可比性。 何況HTTP協議是基於TCP串連的。
TCP/IP是傳輸層協議,主要解決資料如何在網路中傳輸;而HTTP是應用程式層協議,主要解決如何封裝資料。
我們在傳輸資料時,可以只使用傳輸層(TCP/IP),但是那樣的話,由於沒有應用程式層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用應用程式層協議,應用程式層協議很多,有HTTP、FTP、TELNET等等,也可以自己定義應用程式層協議。WEB使用HTTP作傳輸層協議,以封裝HTTP文本資訊,然後使用TCP/IP做傳輸層協議將它發送到網路上。
Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。
Http和Socket串連區別
相信不少初學手機連網開發的朋友都想知道Http與Socket串連究竟有什麼區別,希望通過自己的淺顯理解能對初學者有所協助。
1、TCP串連
要想明白Socket串連,先要明白TCP串連。手機能夠使用連網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP串連。TCP協議可以對上層網路提供介面,使上層網路資料的傳輸建立在“無差別”的網路之上。
建立起一個TCP串連需要經過“三向交握”:
第一次握手:用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
握手過程中傳送的包裡不包含資料,三向交握完畢後,用戶端與伺服器才正式開始傳送資料。理想狀態下,TCP串連一旦建立,在通訊雙方中的任何一方主動關閉串連之前,TCP 串連都將被一直保持下去。中斷連線時伺服器和用戶端均可以主動發起斷開TCP串連的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是伺服器和用戶端互動,最終確定斷開)
2、HTTP串連
HTTP協議即超文本傳送協議(HypertextTransfer Protocol ),是Web連網的基礎,也是手機連網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP串連最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放串連。從建立串連到關閉串連的過程稱為“一次串連”。
1)在HTTP 1.0中,用戶端的每次請求都要求建立一次單獨的串連,在處理完本次請求後,就自動釋放串連。
2)在HTTP 1.1中則可以在一次串連中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由於HTTP在每次請求結束後都會主動釋放串連,因此HTTP串連是一種“短串連”,要保持用戶端程式的線上狀態,需要不斷地向伺服器發起串連請求。通常的做法是即時不需要獲得任何資料,用戶端也保持每隔一段固定的時間向伺服器發送一次“保持串連”的請求,伺服器在收到該請求後對用戶端進行回複,表明知道用戶端“線上”。若伺服器長時間無法收到用戶端的請求,則認為用戶端“下線”,若用戶端長時間無法收到伺服器的回複,則認為網路已經斷開。
3、SOCKET原理
3.1通訊端(socket)概念
通訊端(socket)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:串連使用的協議,本地主機的IP地址,本地進程的協議連接埠,遠地主機的IP地址,遠地進程的協議連接埠。
應用程式層通過傳輸層進行資料通訊時,TCP會遇到同時為多個應用程式進程提供並發服務的問題。多個TCP串連或多個應用程式進程可能需要通過同一個 TCP協議連接埠傳輸資料。為了區別不同的應用程式進程和串連,許多電腦作業系統為應用程式與TCP/IP協議互動提供了通訊端(Socket)介面。應用程式層可以和傳輸層通過Socket介面,區分來自不同應用程式進程或網路連接的通訊,實現資料轉送的並發服務。
3.2 建立socket串連
建立Socket串連至少需要一對通訊端,其中一個運行於用戶端,稱為ClientSocket,另一個運行於伺服器端,稱為ServerSocket。
通訊端之間的串連過程分為三個步驟:伺服器監聽,用戶端請求,串連確認。
伺服器監聽:伺服器端通訊端並不定位具體的用戶端通訊端,而是處於等待串連的狀態,即時監控網路狀態,等待用戶端的串連請求。
用戶端請求:指用戶端的通訊端提出串連請求,要串連的目標是伺服器端的通訊端。為此,用戶端的通訊端必須首先描述它要已連線的服務器的通訊端,指出伺服器端通訊端的地址和連接埠號碼,然後就向伺服器端通訊端提出串連請求。
串連確認:當伺服器端通訊端監聽到或者說接收到用戶端通訊端的串連請求時,就響應用戶端通訊端的請求,建立一個新的線程,把伺服器端通訊端的描述發給用戶端,一旦用戶端確認了此描述,雙方就正式建立串連。而伺服器端通訊端繼續處於監聽狀態,繼續接收其他用戶端通訊端的串連請求。
4、SOCKET串連與TCP串連
建立Socket串連時,可以指定使用的傳輸層協議,Socket可以支援不同的傳輸層協議(TCP或UDP),當使用TCP協議進行串連時,該Socket串連就是一個TCP串連。
5、Socket串連與HTTP串連
由於通常情況下Socket串連就是TCP串連,因此Socket串連一旦建立,通訊雙方即可開始相互發送資料內容,直到雙方串連斷開。但在實際網路應用中,用戶端到伺服器之間的通訊往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆預設會關閉長時間處於非活躍狀態的串連而導致 Socket 串連斷連,因此需要通過輪詢告訴網路,該串連處於活躍狀態。
而HTTP串連使用的是“請求—響應”的方式,不僅在請求時需要先建立串連,而且需要用戶端向伺服器發出請求後,伺服器端才能回複資料。
很多情況下,需要伺服器端主動向用戶端推送資料,保持用戶端與伺服器資料的即時與同步。此時若雙方建立的是Socket串連,伺服器就可以直接將資料傳送給用戶端;若雙方建立的是HTTP串連,則伺服器需要等到用戶端發送一次請求後才能將資料傳回給用戶端,因此,用戶端定時向伺服器端發送串連請求,不僅可以保持線上,同時也是在“詢問”伺服器是否有新的資料,如果有就將資料傳給用戶端。
HTTP串連是什麼意思
HTTP是一個屬於應用程式層的物件導向的協議,由於其簡捷、快速的方式,適用於分布式超媒體資訊系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的正常化工作進行中之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出.(協議,算是全球定位。)
WWW的核心——HTTP協議
眾所周知,Internet的基本協議是TCP/IP協議,目前廣泛採用的FTP、Archie Gopher等是建立在TCP/IP協議之上的應用程式層協議,不同的協議對應著不同的應用。WWW伺服器使用的主要協議是HTTP協議,即超文體傳輸協議。由於HTTP協議支援的服務不限於WWW,還可以是其它服務,因而HTTP協議允許使用者在統一的介面下,採用不同的協議訪問不同的服務,如FTP、Archie、SMTP、NNTP等。另外,HTTP協議還可用於名字伺服器和分布式對象管理。
2.1 HTTP協議簡介
HTTP是一個屬於應用程式層的物件導向的協議,由於其簡捷、快速的方式,適用於分布式超媒體資訊系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的正常化工作進行中之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。
HTTP協議的主要特點可概括如下:
1.支援客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送要求方法和路徑。要求方法常用的有GET、HEAD, POST。每種方法規定了客戶與伺服器聯絡的類型不同。 由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以標記。
4.無串連:不需連線的含義是限制每次串連只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即中斷連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於交易處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次串連傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
2.2 HTTP協議的幾個重要概念