大家好,又見面了,我是你們的朋友全棧君
開始之前,先大概說一下吧。計算機網絡研究的是理論,講究的是網絡過程中的連接方式,還有協議制定的原因,為什么這么指定,它不是一個簡單的敲代碼,做碼農就好了的,關鍵是在于創新,先是理解協議為什么這么制定,要怎么樣才可以更加好的指定出下一個協議,怎么才可以做出一個好的東西。
cs即:client/server,是服務器客戶端結構。是一種“一對多”的模式,一臺服務器,處理多個客戶端發來的請求,完成了業務邏輯之后,再返回給客戶端一些信息。其中,服務器不會主動發起請求,都是被動處理的,像一頭牛,拉一下繩子走幾步;而客戶端則主要是提供一個界面,給你點擊一些功能按鈕,其實每一個按鈕就是一個請求,發送到服務器中給你實現這個請求,再把結果返回給你。就像你有一道數學題目不會,打開客戶端(一個app,或者exe)然后輸入你的問題,點擊解答按鈕,就有一個請求通過網絡到了服務器,服務器做出了這道題,把答案返回給你,你的客戶端界面再顯示出這道題的答案,這就是所謂的cs模式的工作流程了。(小猿搜題之類的就是這么個流程了)
socket是一種實現網絡連接的方式,通過兩臺電腦一邊一個socket嵌套字,在兩臺電腦(一臺服務器,一臺主機)之間建立通道,然后他們就可以傳輸數據了。這其實是一種思想的具體化,網絡通信理論提出了要連接兩個電腦,就需要這么個東西去實現功能,人們把它設計出來,就命名為嵌套字。 所以,代碼什么的,只是一種實現,誰都可以,記住,一個好的計算機科學家,不是只能實現,而是要有想法,實現什么的,只要你的理論沒有漏洞,是不會出現bug的。出現了,也是語言底層設計本身有問題,不是你的錯。 那么,下面說一下簡單的socket應用吧: 第一個是實現回聲的cs代碼:所謂回聲,就是客戶端發什么信息xxxx,服務器就回復一個:我是服務器,我收到了你的信息:xxxx。 代碼如下,java實現;
import java.io.*;import java.net.*;import java.text.SimpleDateFormat;import java.util.Date;public class server { //設置端口號/public static int portNo=3333;public static void main(String[] args) throws IOException { //初始化serverSocket類ServerSocket s=new ServerSocket(portNo);System.out.println("The Server is starting...");//建立socket連接(阻塞,直到有客戶端連接)Socket socket=s.accept();//接收數據try{ //構造輸入流緩存BufferedReader bufReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);String time=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());while(true){ //按行讀取輸入內容String strLine=bufReader.readLine();//如果收到byebye則退出循環if(strLine.equals("byebye")){ break;}System.out.println("In the Server reveived the info: "+strLine);//向客戶端發送接收到的數據System.out.println("The server is send the received msg to the client...");out.println("The received msg is: "+strLine+" and The time is:"+time);}}catch(Exception e){ e.printStackTrace();}finally{ System.out.println("close the Server socket and the io");//關閉socket,斷開連接socket.close();s.close();}}}
客戶端
import java.io.*;import java.net.*;public class client { /** * @param args */public static String clientName="laughcry";//設置端口號public static int portNo=3333;public static void main(String[] args) throws IOException { // TODO Auto-generated method stub//設置連接地址類,連接本地,描述使用本socket的ip地址InetAddress addr=InetAddress.getByName("localhost");//初始化socket類Socket socket=new Socket(addr,portNo);try{ System.out.println("socket="+socket);//設置io句柄BufferedReader bufReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//向服務器端發送數據out.println("Hello server ,I am "+clientName);//接受服務器返回的信息String str=bufReader.readLine();System.out.println("The msg from server is: "+str);out.println("byebye");}catch(Exception e){ e.printStackTrace();}finally{ //關閉連接System.out.println("close the client socket and the io.");socket.close();}}}
這個例子只是在一臺電腦上開兩個程序,然后client訪問server而已。是用來理解一下socket的,之后的這個才是通常的cs架構應有的一對多功能,基于第一個代碼加一個多線程處理就好了。
先是客戶端
import java.io.*;import java.net.*;import java.net.Socket;import java.util.Scanner;public class client{ public static int portNo=14444;public static String myname="2號";public static void main(String[] args) throws IOException { InetAddress addr = InetAddress.getByName("localhost");Socket s=new Socket("10.21.22.116",portNo);//第一個參數是你的服務器的ip號,在cmd終端輸入ipconfig,找到ipv4對應的就好了。System.out.println(s.getInputStream());System.out.println(s.getOutputStream());System.out.println("socket=" + s);try { BufferedReader bufRead=new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);out.println("Hello server ,I am " + myname);while (true) { String line= bufRead.readLine();System.out.println("接收到服務器回復:"+line);System.out.println("開始輸入");Scanner scanner=new Scanner(System.in);out.println(scanner.nextLine());}} catch (IOException e) { e.printStackTrace();}finally { s.close();}}}
然后是服務器了,下面是開了多線程的服務器,原理如下圖:
關鍵是紅色字體部分,要啟動多線程就好了,先要新建一個線程類。
import java.io.*;import java.net.Socket;import java.text.SimpleDateFormat;import java.util.Date;public class aThread extends Thread { private Socket socket;public aThread(String s){ super(s);}public aThread(Socket s){ socket=s;}public void run(){ try { //BufferedReader bufReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader bufReader1=new BufferedReader(new InputStreamReader(socket.getInputStream()));//PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//String time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());String time = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());while (true) { String Line=bufReader1.readLine();if (Line.equals("over")) { break;}System.out.println("接收到了客戶端信息:" + Line);//向客戶端發送接收到的數據out.println("客戶,我在" + time+ "已經收到了你的信息: " + Line );}} catch (Exception e) { e.printStackTrace();} finally { System.out.println("關閉連接");try { socket.close();} catch (IOException e) { e.printStackTrace();}}}}
然后是服務器的啟動類。
import java.io.*;import java.net.*;import java.text.SimpleDateFormat;import java.util.Date;public class server { //public static int portNo = 3333;public static int portNob=14444;public static void main(String[] args) throws IOException { // TODO Auto-generated method stub//初始化serverSocket類//ServerSocket s = new ServerSocket(portNo);ServerSocket s=new ServerSocket(portNob);System.out.println("啓動服務器");//建立socket連接(阻塞,直到有客戶端連接)//Socket socket = s.accept();int i=1;while (true){ System.out.println("等待連接"+i++);Socket socket=s.accept();new aThread(socket).start();}}}
好了,到這里,cs的基礎模式和代碼就寫完了。那么,對于代碼實現入門,你應該明白了吧?其實,通常情況下,客戶端自己也有很強的業務邏輯處理能力,一些不用發請求就可以解決的問題,本地就搞定了,只有一些要同步到網絡的操作,才會特意聯網傳送的,比如:賬號驗證,下載數據,或者一些要同步數據庫的操作。 那么,說完了cs模式之后,我們要講接下來的另一種網絡通信模型:p2p。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
193291.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
辦理騰訊王卡有什么要求或限制?每個用戶僅可網上預約1張騰訊大王卡或天王卡。用戶識別條件為:、身份證號碼、設備識別碼,其中一個條件反復重復都不可以哦再度辦理申請??梢栽谀穷A約辦聯通騰訊王卡寬帶?河南王卡寬帶限網齡三個月騰訊王卡用戶去辦理,線上預約入口:【河南客服】公眾號,路徑:【專屬服務】—【寬帶服務】—【王卡寬帶預約專區】怎樣登錄騰訊視頻大王卡?方法1:把王卡可以設置為系統默認撥號和設置電腦上網方...
騰訊圖書網加入書簽后怎么看書簽加在哪?打開騰訊圖書網的收藏列表,您可以直觀地看到您最近收藏的章節名稱。每次你點擊哪個章節的“書簽”,它都會顯示你的章節名稱,但它只會記錄你上一次收集的章節名稱,其他時間不會。先安裝QQ工具欄!然后登錄QQ,就可以看到書簽了!單擊以查找上一個書簽添加書簽里刪除的怎么恢復?1. 登錄QQ賬號,同步書簽檢索原來,QQ瀏覽器保存了很多書簽,但清理完瀏覽器緩存后,就不見了。不...
保定地區郵編?保定郵政編碼:071000保定市新市區郵政編碼:071000保定市北市區郵政編碼:071000保定市南市區郵政編碼:071000保定市滿城縣郵政編碼:072150保定市清苑縣郵政編碼:071100保定市淶水縣郵政編碼:074100保定市阜平縣郵政編碼:073200保定市徐水縣郵政編碼:072550保定市定興縣郵政編碼:072650保定唐縣郵政編碼:072350保定市高陽縣郵政編碼:0...