這篇文章主要介紹了java如何實(shí)現(xiàn)Socket通信之單線程服務(wù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
甕安網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,甕安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為甕安上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的甕安做網(wǎng)站的公司定做!前言
使用基于TCP 協(xié)議的雙向通信時(shí),網(wǎng)絡(luò)中的兩個(gè)應(yīng)用程序之間必須首先建立一個(gè)連接,這兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。
建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。
Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進(jìn)程通信機(jī)制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個(gè)多孔插座。一臺(tái)主機(jī)猶如布滿各種插座的房間,每個(gè)插座有一個(gè)編號(hào),有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)。
使用 socket 的通信模式
java.net 程序包將基于TCP 通信的socket 封裝為兩個(gè)類:類Socket 表達(dá)了一個(gè)用于建立TCP 連接的socket,該socket 既可由客戶程序使用,也可由服務(wù)程序
使用;類ServerSocket 則是一個(gè)服務(wù)端專門監(jiān)聽客戶程序連接請(qǐng)求的socket 的抽象,僅在服務(wù)程序中使用。
Socket通信過程
服務(wù)器端:
① 創(chuàng)建ServerSocket對(duì)象,綁定監(jiān)聽端口
② 通過accept()方法監(jiān)聽客戶端請(qǐng)求
③ 連接建立后,通過輸入流讀取客戶端發(fā)送的請(qǐng)求信息
④ 通過輸出流向客戶端發(fā)送響應(yīng)信息
⑤ 關(guān)閉連接
客戶端:
① 創(chuàng)建Socket對(duì)象,指明需要連接的服務(wù)器的地址和端口號(hào)
② 連接建立后,通過輸出流想服務(wù)器端發(fā)送請(qǐng)求信息
③ 通過輸入流獲取服務(wù)器響應(yīng)的信息
④ 關(guān)閉連接
單線程服務(wù)程序代碼
服務(wù)端:
import java.net.*; import java.io.*; public class EchoServer { public static void main(String[] args)throws IOException { if (args.length != 1) { System.out.println("用法:EchoServer <端口號(hào)>"); return ; } // 監(jiān)聽客戶程序的連接請(qǐng)求 ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0])); System.out.println("服務(wù)程序正在監(jiān)聽端口" + args[0]); Socket socket = listenSocket.accept(); // 從與客戶程序的新建連接獲取輸入流和輸出流 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader (socket.getInputStream())); // 從客戶端讀取數(shù)據(jù),并寫回?cái)?shù)據(jù)的加工結(jié)果 String message; while ((message = in.readLine()) != null) { System.out.println("收到請(qǐng)求:" + message); out.println(message.toUpperCase()); } // 關(guān)閉連接 out.close(); in.close(); socket.close(); listenSocket.close(); } }
客戶端:
import java.net.*; import java.io.*; public class EchoClient { public static void main(String[] args)throws Exception { if (args.length != 2) { System.out.println("用法:EchoClient <主機(jī)名> <端口號(hào)>"); return ; } // 建立連接并打開相關(guān)聯(lián)的輸入流和輸出流 Socket socket = new Socket(args[0], Integer.parseInt(args[1])); System.out.println("當(dāng)前socket信息:" + socket); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader (socket.getInputStream())); // 將控制臺(tái)輸入的字符串發(fā)送給服務(wù)端,并顯示從服務(wù)端獲取的處理結(jié)果 BufferedReader stdIn = new BufferedReader(new InputStreamReader (System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("返回:" + in.readLine()); } stdIn.close(); // 關(guān)閉連接 out.close(); in.close(); socket.close(); } }
運(yùn)行結(jié)果示例(基于windows)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java如何實(shí)現(xiàn)Socket通信之單線程服務(wù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!