在網(wǎng)絡(luò)通訊中,第一次主動發(fā)起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務(wù)器端(Server)程序,簡稱服務(wù)器。一旦通訊建立,則客戶端和服務(wù)器端完全一樣,沒有本質(zhì)的區(qū)別。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比南雄網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南雄網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南雄地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
“請求-響應(yīng)”模式:
Socket類:發(fā)送TCP消息
ServerSocket類:創(chuàng)建服務(wù)器
套接字是一種進程間的數(shù)據(jù)交換機制。這些進程既可以在同一機器上,也可以在通過網(wǎng)絡(luò)連接的不同機器上。換句話說,套接字起到通信端點的作用。單個套接字是一個端點,而一對套接字則構(gòu)成一個雙向通信信道,使非關(guān)聯(lián)進程可以在本地或通過網(wǎng)絡(luò)進行數(shù)據(jù)交換。一旦建立套接字連接,數(shù)據(jù)即可在相同或不同的系統(tǒng)中雙向或單向發(fā)送,直到其中一個端點關(guān)閉連接。套接字與主機地址和端口地址相關(guān)聯(lián)。
主機地址就是客戶端或服務(wù)器程序所在的主機的IP地址。端口地址是指客戶端或服務(wù)器程序使用的主機的通信端口。在客戶端和服務(wù)器中,分別創(chuàng)建獨立的Socket,并通過Socket的屬性,將兩個Socket進行連接,這樣,客戶端和服務(wù)器通過套接字所建立連接使用輸入輸出流進行通信。
TCP/IP套接字是最可靠的雙向流協(xié)議,使用TCP/IP可以發(fā)送任意數(shù)量的數(shù)據(jù)。實際上,套接字只是計算機上已編號的端口。如果發(fā)送方和接收方計算機確定好端口,他們就可以通信了。
TCP/IP通信連接的簡單過程:
位于A計算機上的TCP/IP軟件向B計算機發(fā)送包含端口號的消息,B計算機的TCP/IP軟件接收該消息,并進行檢查,查看是否有他知道的程序正在該端口上接收消息。如果有,他就將該消息交給這個程序。
要使程序有效地運行,就必須有一個客戶端和一個服務(wù)器。
通過Socket的編程順序:
1.創(chuàng)建服務(wù)器ServerSocket,在創(chuàng)建時,定義ServerSocket的監(jiān)聽端口(在這個端口接收客戶端發(fā)來的消息?。?/p>
2.ServerSocket調(diào)用accept()方法,使之處于阻塞狀態(tài)
3.創(chuàng)建客戶機Socket,并設(shè)置服務(wù)器的IP及端口
4.客戶機發(fā)出連接請求,建立連接。
5.分別取得服務(wù)器和客戶端Socket的InputStream和OutputStream
6.利用Socket和ServerSocket進行數(shù)據(jù)傳輸。
【示例1】單向通信服務(wù)器端代碼
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;
/** * 最簡單的服務(wù)器端代碼 * @author Administrator * */ public class BasicSocketServer {
public static void main(String[] args) { try { //建立服務(wù)器端套接字 ServerSocket serverSocket = new ServerSocket(8888); //TCP端口一共多少個?? //監(jiān)聽,等待客戶端請求,并愿意接收連接。 System.out.println("服務(wù)端建立監(jiān)聽"); Socket socket = serverSocket.accept();
//通過流向客戶端發(fā)送數(shù)據(jù) // ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); // oos.writeObject("aaaaa"); // oos.close();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw.write("hhhh"); bw.close();
socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} |
【示例2】單向通信Socket客戶端代碼
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket;
/** * 最簡單的Socket客戶端 * @author Administrator * */ public class BasicSocketClient { public static void main(String[] args) { try { //指定的是所要連接的服務(wù)器的IP和端口。而不是自己機器的端口。發(fā)送端口是隨機的。 Socket socket = new Socket(InetAddress.getLocalHost(),8888); // ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); // String string = (String) ois.readObject(); // System.out.println(string);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(br.readLine()); br.close();
socket.close();
} catch (Exception e) { e.printStackTrace(); } } } |
本節(jié)我們掌握了Socket的單項通訊,那么如何實現(xiàn)Socket的雙向交流?下節(jié)我們重點講解下~
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師、高級工程師、架構(gòu)師。精通Java平臺軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop