c++ socket線程池_java 網絡編程,Socket編程

Java的網絡編程主要涉及到的內容是Socket編程,那么什么是Socket呢?簡單地說,Socket,套接字,就是兩臺主機之間邏輯連接的端點。TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。Socket,本質上就是一組接口,是對TCP/IP協議的封裝和應用(程序員層面上)。

套接字使用TCP提供了兩臺計算機之間的通信機制。 客戶端程序創建一個套接字,并嘗試連接服務器的套接字。

當連接建立時,服務器會創建一個 Socket 對象。客戶端和服務器現在可以通過對 Socket 對象的寫入和讀取來進行通信。

java.net.Socket 類代表一個套接字,并且 java.net.ServerSocket 類為服務器程序提供了一種來監聽客戶端,并與他們建立連接的機制。

以下步驟在兩臺計算機之間使用套接字建立TCP連接時會出現:

服務器實例化一個 ServerSocket 對象,表示通過服務器上的端口通信。

服務器調用 ServerSocket 類的 accept() 方法,該方法將一直等待,直到客戶端連接到服務器上給定的端口。

服務器正在等待時,一個客戶端實例化一個 Socket 對象,指定服務器名稱和端口號來請求連接。

Socket 類的構造函數試圖將客戶端連接到指定的服務器和端口號。如果通信被建立,則在客戶端創建一個 Socket 對象能夠與服務器進行通信。

在服務器端,accept() 方法返回服務器上一個新的 socket 引用,該 socket 連接到客戶端的 socket。

連接建立后,通過使用 I/O 流在進行通信,每一個socket都有一個輸出流和一個輸入流,客戶端的輸出流連接到服務器端的輸入流,而客戶端的輸入流連接到服務器端的輸出流。

TCP 是一個雙向的通信協議,因此數據可以通過兩個數據流在同一時間發送.以下是一些類提供的一套完整的有用的方法來實現 socket。

整體流程

Socket編程主要涉及到客戶端和服務器端兩個方面,首先是在服務器端創建一個服務器套接字(ServerSocket),并把它附加到一個端口上,服務器從這個端口監聽連接。端口號的范圍是0到65536,但是0到1024是為特權服務保留的端口號,我們可以選擇任意一個當前沒有被其他進程使用的端口。

客戶端請求與服務器進行連接的時候,根據服務器的域名或者IP地址,加上端口號,打開一個套接字。當服務器接受連接后,服務器和客戶端之間的通信就像輸入輸出流一樣進行操作。

00abf6836c9496e25969fc6aeeb87d8a.png

實例

下面是一個客戶端和服務器端進行數據交互的簡單例子,客戶端輸入正方形的邊長,服務器端接收到后計算面積并返回給客戶端,通過這個例子可以初步對Socket編程有個把握。

服務器端

public class SocketServer { public static void main(String[] args) throws IOException { // 端口號 int port = 7000; // 在端口上創建一個服務器套接字 ServerSocket serverSocket = new ServerSocket(port); // 監聽來自客戶端的連接 Socket socket = serverSocket.accept(); DataInputStream dis = new DataInputStream( new BufferedInputStream(socket.getInputStream())); DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(socket.getOutputStream())); do { double length = dis.readDouble(); System.out.println("服務器端收到的邊長數據為:" + length); double result = length * length; dos.writeDouble(result); dos.flush(); } while (dis.readInt() != 0); socket.close(); serverSocket.close(); }}

客戶端

public class SocketClient { public static void main(String[] args) throws UnknownHostException, IOException { int port = 7000; String host = "localhost"; // 創建一個套接字并將其連接到指定端口號 Socket socket = new Socket(host, port); DataInputStream dis = new DataInputStream( new BufferedInputStream(socket.getInputStream())); DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(socket.getOutputStream())); Scanner sc = new Scanner(System.in); boolean flag = false; while (!flag) { System.out.println("請輸入正方形的邊長:"); double length = sc.nextDouble(); dos.writeDouble(length); dos.flush(); double area = dis.readDouble(); System.out.println("服務器返回的計算面積為:" + area); while (true) { System.out.println("繼續計算?(Y/N)"); String str = sc.next(); if (str.equalsIgnoreCase("N")) { dos.writeInt(0); dos.flush(); flag = true; break; } else if (str.equalsIgnoreCase("Y")) { dos.writeInt(1); dos.flush(); break; } } } socket.close(); }}

實例二

可以看到上面的服務器端程序和客戶端程序是一對一的關系,為了能讓一個服務器端程序能同時為多個客戶提供服務,可以使用多線程機制,每個客戶端的請求都由一個獨立的線程進行處理。下面是改寫后的服務器端程序。

public class SocketServerM { public static void main(String[] args) throws IOException { int port = 7000; int clientNo = 1; ServerSocket serverSocket = new ServerSocket(port); // 創建線程池 ExecutorService exec = Executors.newCachedThreadPool(); try { while (true) { Socket socket = serverSocket.accept(); exec.execute(new SingleServer(socket, clientNo)); clientNo++; } } finally { serverSocket.close(); } }}class SingleServer implements Runnable { private Socket socket; private int clientNo; public SingleServer(Socket socket, int clientNo) { this.socket = socket; this.clientNo = clientNo; } @Override public void run() { try { DataInputStream dis = new DataInputStream( new BufferedInputStream(socket.getInputStream())); DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(socket.getOutputStream())); do { double length = dis.readDouble(); System.out.println("從客戶端" + clientNo + "接收到的邊長數據為:" + length); double result = length * length; dos.writeDouble(result); dos.flush(); } while (dis.readInt() != 0); } catch (IOException e) { e.printStackTrace(); } finally { System.out.println("與客戶端" + clientNo + "通信結束"); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }}

上面改進后的服務器端代碼可以支持不斷地并發響應網絡中的客戶請求。關鍵的地方在于多線程機制的運用,同時利用線程池可以改善服務器程序的性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532198.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android簽名忘記密碼,修改Android簽名證書keystore的密碼、別名alias以及別名密碼

之前在測試Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需證書規格,提到過自定義調試證書的密碼和1. 首先當然是先復制一份正式證書出來作為要修改為的臨時調試證書。2. 修改keystore密碼的命令(keytool為JDK帶的命令行工具):keytoo…

python列表轉換成數字_Python中列表元素轉為數字的方法分析

本文實例講述了Python中列表元素轉為數字的方法。分享給大家供大家參考,具體如下: 有一個數字字符的列表: numbers [1, 5, 10, 8] 想要把每個元素轉換為數字: numbers [1, 5, 10, 8] 用一個循環來解決: new_numbers …

android 繪圖軟件,安卓最強大的繪圖軟件 妙筆生花最新評測

妙筆生花——繪畫體驗(一)看過使用教程之后,就能進入到真正的功能頁面了。功能頁面的首頁只有一個按鈕,點擊頁面下端的這個按鈕之后,就能跳出功能強大的工具選擇頁面。【妙筆生花】——工具選擇頁OK,接下來,小編會使用…

識別物體是否存在_【科學實踐Vol.1】帶你玩轉“人臉識別”

隨著時代的發展,人臉識別在我們的生活中變得隨處可見:商場里的人臉識別儲物柜,校園里的人臉識別刷卡機,手機里的面部解鎖……這些應用極大的便利了我們的日常生活。今天,就讓我們一起走進人臉識別的原理世界。首先我們…

html 自動適應手機屏幕大小,HTML5 canvas自適應手機屏幕大小的一種解決方案

一、最終效果為了不浪費大家時間,先展示最終效果,看看是不是大家需要的解決方案:標準分辨率:其他分辨率的適配情況:二、需求1.canvas的內容能全部展示在屏幕上2.盡量能保證圖像不變形3.繪制的文字也能自適應三、解決方…

編寫一個能夠排序的函數模板。_LeetCode刷題——9.給出n對括號,請編寫一個函數來生成所有的由n對括號組成的合法組合...

難度(medium)題目描述:給出n對括號,請編寫一個函數來生成所有的由n對括號組成的合法組合。例如n3,解集為: "((()))", "(()())", "(())()", "()(())", "()()()" 思路&#xf…

html5怎么產生手風琴效果,Html5 js如何實現手風琴效果

Html5 js如何實現手風琴效果發布時間:2020-08-03 09:54:10來源:億速云閱讀:92作者:小豬這篇文章主要為大家展示了Html5 js如何實現手風琴效果,內容簡而易懂,希望大家可以學習一下,學習完之后肯定…

c++進制轉換_一文了解進制之間的原理和轉換

點擊這段文字: 獲取2020年,最強Python學習資料進制這塊,可以做簡單的了解。生活中我們使用的數字都是十進制的,而二進制是機器能夠識別的最直接的語言。但是二進制又太大,記錄起來非常的不方便。所以通常會將二進制轉化…

用HTML做一個簡單的web登錄頁面,簡單的JavaWeb注冊登錄案例

簡單的JavaWeb注冊登錄案例1.注冊頁面register.htmlregister姓名:電話:郵箱:qq:2.注冊案例實現程序register.java/*** 注冊案例實現程序* author lucky**/public class register extends HttpServlet {public void doGet(HttpServ…

一層循環時間復雜度_算法的時間與空間復雜度(一看就懂)

算法(Algorithm)是指用來操作數據、解決程序問題的一組方法。對于同一個問題,使用不同的算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。那么我們應該如何去衡量不同算法之間的優劣呢&…

用ajax替換html代碼,替換Ajax響應一個div的內部HTML(Replace inner HTML of a div w

我試圖一些時間間隔后改變一個div的內部HTML。 我得到我想要使用Ajax正確的反應。 但無法取代內HTML的后,并用Ajax響應地選擇。 什么是錯我的代碼..HTML51 seconds ago58 seconds ago.....10 minute ago?查詢setInterval(function() {$( ".time" ).each(…

java 審批流_一文讀懂工作流

網上關于工作流引擎有比較多的簡介,也有很多工作流的實際應用場景。本文結合筆者多年對工作流的經驗來闡述一下對工作流的理解。一、什么是工作流?先貼上wiki百科對于工作流的定義工作流(Workflow),是對工作流程及其各…

html制作卡通圖案代碼,CSS畫的卡通動畫圖案

CSS語言:CSSSCSS確定* {padding: 0;margin: 0;}body {background: #26ad00;}.head {background: #ff8cb2;width: 70vw;height: 50vw;position: absolute;top: calc(50% - 25vw);left: calc(50% - 35vw);z-index: 2;border-radius: 90% 90% 80% 80% / 120% 120% 60% …

postgresql 查詢序列_時間序列數據庫(TSDB)初識與選擇

作者:碼哥字節 如需轉載聯系我的公眾號背景 這兩年互聯網行業掀著一股新風,總是聽著各種高大上的新名詞。大數據、人工智能、物聯網、機器學習、商業智能、智能預警啊等等。以前的系統,做數據可視化,信息管理,流程控制…

開發html,HTML開發基礎

常用標簽1、各種符號2、p和br3、a標簽4、H標簽5、select6、input:checkbox7、input:radio8、input:password9、input:button10、input:file11、textarea12、label13、ul or dl14、table15、fieldset16、form17、divHTML代碼演示html>頁面一這是div塊級標簽,占一行…

concurrenthashmap實現原理_Mybatis:PageHelper分頁插件源碼及原理剖析

PageHelper是一款好用的開源免費的Mybatis第三方物理分頁插件,其實我并不想加上好用兩個字,但是為了表揚插件作者開源免費的崇高精神,我毫不猶豫的加上了好用一詞作為贊美。原本以為分頁插件,應該是很簡單的,然而PageH…

計算機網絡dst,計算機網絡基礎課程—Socket接口

什么是TCP/IP------本課程的主要部分TCP/IP如何工作-----TCP/IP軟件結構與實現如何用TCP/IP-------TCP/IP應用程序編程接口前面說過,TCP/IP標準并不指定應用程序與TCP/IP協議軟件的接口,但并不是說沒有提供任何指導,首先,它指定了…

python輸入圓的半徑公式_[圖文]鐵路曲線正矢的計算公式

一、圓曲線正矢的計算1.1 圓曲線正矢的計算公式取圓曲線上兩點拉一直線,叫做弦。弦上任意點至曲線上的垂直距離叫矢或叫矢距。在弦中央點的矢距叫正矢(下圖)。AB一弦;AC、CB一半弦;CD一正矢;EF一矢距正矢計算公式為其中: f-正矢 C-弦長 R-半徑 式中單位均為m。公式用文字表示即…

2021高考成績查詢抖音,2021抖音很火的高考唯美的文案20個

1、用孜孜不倦去追求,拼搏的精神來鉆研,讓知識澆灌心田,用激情去迎接困難,用青春寫意一片贊嘆,祝愿大學生活充實飽滿,學富五車,才高八斗,開創美麗的明天。2、如食糖蜜心里甜&#xf…

docker 安裝nacos_康過來!Nacos配置和管理微服務的使用

Nacos 具有如下特性:服務發現和服務健康監測:支持基于DNS和基于RPC的服務發現,支持對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求;動態配置服務:動態配置服務可以讓您以中心化、外部化和動態化的方式管…