Java利用Socket類實現(xiàn)TCP通信程序
TCP通信能實現(xiàn)兩臺計算機之間的數(shù)據(jù)交互,通信的兩端,要嚴格區(qū)分為客戶端(Client)與服務端(Server)。
兩端通信時步驟:
- 服務端程序需要先啟動,等待客戶端的連接。
- 客戶端主動連接服務器端,連接成功才能通信。服務端不可以主動連接客戶端。
在Java中,提供了兩個類用于實現(xiàn)TCP通信程序:
客戶端:java.net.Socket類表示。創(chuàng)建Socket對象,向服務端發(fā)出連接請求,服務端響應請求,兩者建立連接開始通信。
服務端:java.net.ServerSocket類表示。創(chuàng)建ServerSocket對象,相當于開啟一個服務,并等待客戶端的連接。
InetAddress類
這個類代表一個互聯(lián)網(wǎng)協(xié)議(IP)地址。
常用方法
- static InetAddress getLocalHost():返回本地主機的地址。
- static InetAddress getByName(String host):根據(jù)主機名獲取主機信息。
- String getHostAddress():根據(jù)InetAddress對象獲取ip地址。
- String getHostName():根據(jù)InetAddress對象獲取主機名。
public static void main(String[] args) throws UnknownHostException { // 獲取本機的InetAddress對象 InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost); // 根據(jù)本機的主機名獲取InetAddress對象 InetAddress host = InetAddress.getByName("DESKTOP-3G22U7M"); System.out.println(host); // 根據(jù)域名獲取InetAddress對象 InetAddress host2 = InetAddress.getByName("www.baidu.com"); System.out.println(host2); // 根據(jù)InetAddress對象獲取ip地址 String hostAddress = host2.getHostAddress(); System.out.println(hostAddress); // 根據(jù)InetAddress對象獲取主機名 String hostName = host2.getHostName(); System.out.println(hostName); }
Socket類
java.net.Socket類實現(xiàn)客戶端套接字(也可以就叫“套接字”)。該類實現(xiàn)客戶端套接字,套接字指的是兩臺設備之間通訊的端點。
Socket允許程序把網(wǎng)絡連接當成一個流,數(shù)據(jù)在兩個Socket間通過IO傳輸。
構(gòu)造方法
public Socket(String host, int port):創(chuàng)建套接字對象并將其連接到指定主機上的指定端口號。如果指定的host是null ,則相當于指定地址為回送地址。
String host:服務器主機的名稱/服務器的IP地址。
int port:服務器的端口號。
Socket client = new Socket("127.0.0.1", 6666);
回送地址(127.x.x.x) 是本機回送地址(Loopback Address),主要用于網(wǎng)絡軟件測試以及本地機進程間通信,無論什么程序,一旦使用回送地址發(fā)送數(shù)據(jù),立即返回,不進行任何網(wǎng)絡傳輸。
常用方法
public InputStream getInputStream()
:返回此套接字的輸入流。
如果此Scoket具有相關(guān)聯(lián)的通道,則生成的InputStream 的所有操作也關(guān)聯(lián)該通道。
關(guān)閉生成的InputStream也將關(guān)閉相關(guān)的Socket。
public OutputStream getOutputStream()
: 返回此套接字的輸出流。
如果此Scoket具有相關(guān)聯(lián)的通道,則生成的OutputStream 的所有操作也關(guān)聯(lián)該通道。
關(guān)閉生成的OutputStream也將關(guān)閉相關(guān)的Socket。
public void close()
:關(guān)閉此套接字。
一旦一個socket被關(guān)閉,它不可再使用。
關(guān)閉此socket也將關(guān)閉相關(guān)的InputStream和OutputStream 。
public void shutdownOutput()
: 禁用此套接字的輸出流。
任何先前寫出的數(shù)據(jù)將被發(fā)送,隨后終止輸出流。
ServerSocket類
java.net.ServerSocket類:這個類實現(xiàn)了服務器套接字,該對象等待通過網(wǎng)絡的請求。
構(gòu)造方法
public ServerSocket(int port):使用該構(gòu)造方法在創(chuàng)建ServerSocket對象時,就可以將其綁定到一個指定的端口號上,參數(shù)port就是端口號。
ServerSocket server = new ServerSocket(6666);
常用方法
public Socket accept():偵聽并接受連接,返回一個新的Socket對象,用于和客戶端實現(xiàn)通信。該方法會一直阻塞直到建立連接。
TCP網(wǎng)絡程序
TCP通信分析
【服務端】啟動,創(chuàng)建ServerSocket對象,等待連接。
【客戶端】啟動,創(chuàng)建Socket對象,請求連接。
【服務端】接收連接,調(diào)用accept方法,并返回一個Socket對象。
【客戶端】Socket對象,獲取OutputStream,向服務端寫出數(shù)據(jù)。
【服務端】Scoket對象,獲取InputStream,讀取客戶端發(fā)送的數(shù)據(jù)。
到此,客戶端向服務端發(fā)送數(shù)據(jù)成功。
【服務端】Socket對象,獲取OutputStream,向客戶端回寫數(shù)據(jù)。
【客戶端】Scoket對象,獲取InputStream,解析回寫數(shù)據(jù)。
【客戶端】釋放資源,斷開連接。
自此,服務端向客戶端回寫數(shù)據(jù)。
服務端實現(xiàn)
public class ServerTCP { public static void main(String[] args) throws IOException { System.out.println("服務端啟動 , 等待連接 .... "); // 1.創(chuàng)建 ServerSocket對象,綁定端口,開始等待連接 ServerSocket ss = new ServerSocket(6666); // 2.接收連接 accept 方法, 返回 socket 對象. Socket server = ss.accept(); // 3.通過socket 獲取輸入流 InputStream is = server.getInputStream(); // 4.一次性讀取數(shù)據(jù) // 4.1 創(chuàng)建字節(jié)數(shù)組 byte[] b = new byte[1024]; // 4.2 據(jù)讀取到字節(jié)數(shù)組中. int len = is.read(b); // 4.3 解析數(shù)組,打印字符串信息 String msg = new String(b, 0, len); System.out.println(msg); // =================回寫數(shù)據(jù)======================= // 5. 通過 socket 獲取輸出流 OutputStream out = server.getOutputStream(); // 6. 回寫數(shù)據(jù) out.write("我很好,謝謝你".getBytes()); // 7.關(guān)閉資源. out.close(); is.close(); server.close(); } }
客戶端實現(xiàn)
public class ClientTCP { public static void main(String[] args) throws Exception { System.out.println("客戶端 發(fā)送數(shù)據(jù)"); // 1.創(chuàng)建 Socket ( ip , port ) , 確定連接到哪里. Socket client = new Socket("localhost", 6666); // 2.通過Scoket,獲取輸出流對象 OutputStream os = client.getOutputStream(); // 3.寫出數(shù)據(jù). os.write("你好么? tcp ,我來了".getBytes()); // ==============解析回寫========================= // 4. 通過Scoket,獲取 輸入流對象 InputStream in = client.getInputStream(); // 5. 讀取數(shù)據(jù)數(shù)據(jù) byte[] b = new byte[100]; int len = in.read(b); System.out.println(new String(b, 0, len)); // 6. 關(guān)閉資源 . in.close(); os.close(); client.close(); } }
到此這篇關(guān)于Java利用Socket類實現(xiàn)TCP通信程序的文章就介紹到這了,更多相關(guān)Java TCP通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式
這篇文章主要介紹了Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03IDEA使用Maven創(chuàng)建父與子多模塊項目的圖文教程
在?IntelliJ?IDEA?中使用?Maven?創(chuàng)建父與子多模塊項目是一個常見的開發(fā)實踐,有助于更好地組織和管理代碼,所以本文小編給大家介紹了IDEA使用Maven創(chuàng)建父與子多模塊項目的圖文教程,需要的小伙伴跟著小編一起來看看吧2025-03-03淺談DetachedCriteria和Criteria的使用方法(必看)
下面小編就為大家?guī)硪黄獪\談DetachedCriteria和Criteria的使用方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05