您好,登錄后才能下訂單哦!
在網絡通訊中,第一次主動發起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務器端(Server)程序,簡稱服務器。一旦通訊建立,則客戶端和服務器端完全一樣,沒有本質的區別。
“請求-響應”模式:
Socket類:發送TCP消息
ServerSocket類:創建服務器
套接字是一種進程間的數據交換機制。這些進程既可以在同一機器上,也可以在通過網絡連接的不同機器上。換句話說,套接字起到通信端點的作用。單個套接字是一個端點,而一對套接字則構成一個雙向通信信道,使非關聯進程可以在本地或通過網絡進行數據交換。一旦建立套接字連接,數據即可在相同或不同的系統中雙向或單向發送,直到其中一個端點關閉連接。套接字與主機地址和端口地址相關聯。
主機地址就是客戶端或服務器程序所在的主機的IP地址。端口地址是指客戶端或服務器程序使用的主機的通信端口。在客戶端和服務器中,分別創建獨立的Socket,并通過Socket的屬性,將兩個Socket進行連接,這樣,客戶端和服務器通過套接字所建立連接使用輸入輸出流進行通信。
TCP/IP套接字是最可靠的雙向流協議,使用TCP/IP可以發送任意數量的數據。實際上,套接字只是計算機上已編號的端口。如果發送方和接收方計算機確定好端口,他們就可以通信了。
TCP/IP通信連接的簡單過程:
位于A計算機上的TCP/IP軟件向B計算機發送包含端口號的消息,B計算機的TCP/IP軟件接收該消息,并進行檢查,查看是否有他知道的程序正在該端口上接收消息。如果有,他就將該消息交給這個程序。
要使程序有效地運行,就必須有一個客戶端和一個服務器。
通過Socket的編程順序:
1.創建服務器ServerSocket,在創建時,定義ServerSocket的監聽端口(在這個端口接收客戶端發來的消息!)
2.ServerSocket調用accept()方法,使之處于阻塞狀態
3.創建客戶機Socket,并設置服務器的IP及端口
4.客戶機發出連接請求,建立連接。
5.分別取得服務器和客戶端Socket的InputStream和OutputStream
6.利用Socket和ServerSocket進行數據傳輸。
【示例1】單向通信服務器端代碼
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;
/** * 最簡單的服務器端代碼 * @author Administrator * */ public class BasicSocketServer {
public static void main(String[] args) { try { //建立服務器端套接字 ServerSocket serverSocket = new ServerSocket(8888); //TCP端口一共多少個?? //監聽,等待客戶端請求,并愿意接收連接。 System.out.println("服務端建立監聽"); Socket socket = serverSocket.accept();
//通過流向客戶端發送數據 // 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 { //指定的是所要連接的服務器的IP和端口。而不是自己機器的端口。發送端口是隨機的。 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(); } } } |
本節我們掌握了Socket的單項通訊,那么如何實現Socket的雙向交流?下節我們重點講解下~
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數據庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰
E-Java高級框架精解
F-Linux和Hadoop
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。