多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Socket通信機制(學習總結)

Socket通信機制(學習總結)

來源:程序員人生   發布時間:2016-06-30 16:05:07 閱讀次數:2587次

1、甚么是Socket:
1、Socket是兩個程序進行雙向數據傳輸的網絡通訊的端點,由1個地址和1個端口來標識。
2、兩種通訊方式:有連接方式TCP、無連接方式UDP(用戶數據報協議)。

2、有連接方式TCP
1、通訊雙方在開始時必須進行1次連接進程(3次握手),建立1條通訊鏈路。通訊鏈路提供了可靠的,全雙工的字節流服務。
Socket是兩個進程間通訊鏈的端點,每一個socket有兩個流:1個輸入流和輸出流;其中:
(1)只要向Socket的輸出流寫,1個進程就能夠通過網絡連接向其他進程發送數據;
(2)通過讀Socket的輸入流,就能夠讀取傳輸來的數據。
2、基于TCP協議進行通訊
(1)服務器端步驟:

  • 創建ServerSocket對象,綁定監聽端口,并監聽。
  • 通過accept()方法監聽客戶真個要求。
  • 連接建立后,通過輸入流(InputStream)讀取客戶端發送到要求信息
  • 通過輸出流(OutputStream)向客戶端發送響應信息。
  • 關閉相干資源

(2)客戶端步驟:

  • 創建Socket對象,知名需要連接的服務器真個地址和端口號
  • 連接建立后,通過輸出流OutputStream向服務器端發送要求信息。
  • 通過輸入流InputStream獲得服務器端響應的信息。
  • 關閉相干資源

多個客戶端與服務器通訊例子:

服務器線程處理類

//省略導入的包展現 //服務器線程處理類 public class ServerThread extends Thread{ //和本線程相干的socket Socket socket=null; public ServerThread(Socket socket){ this.socket=socket; } //線程履行的操作,響應客戶真個要求 public void run(){ InputStream is=null; InputStreamReader isr=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; try { //獲得輸入流,并讀取客戶端信息 is=socket.getInputStream();//字節流 //將字節流包裝為字符流 isr=new InputStreamReader(is); //為字符流添加緩沖 br=new BufferedReader(isr); String info=null; //循環讀取客戶真個信息 while((info=br.readLine())!=null){ System.out.println("我是服務器,客戶端說:"+info); } socket.shutdownInput();//關閉輸入流 //獲得輸出流,響應客戶真個要求 os=socket.getOutputStream(); pw=new PrintWriter(os);//將字節流包裝為打印流 pw.write("客戶端,歡迎您!"); pw.flush();//調用flush()方法將緩沖輸出 } catch (IOException e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(os!=null) os.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); if(is!=null) is.close(); if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

服務器端代碼

public class TCPServer { public static void main(String[] args) { try { //創建1個服務器端ServerSocket,指定綁定端口,并監聽 ServerSocket server=new ServerSocket(8866); Socket socket=null; //記錄客戶真個數量 int count=0; System.out.println("####服務器行將啟動,等待客戶真個連接####"); //循環監聽等待客戶真個連接 while(true){ //調用accept()方法開始監聽。等待客戶真個連接 socket=server.accept(); //創建1個新的線程 ServerThread serverThread=new ServerThread(socket); serverThread.start();//啟動線程 count++;//統計客戶真個數量 System.out.println("客戶真個數量:"+count); InetAddress address=socket.getInetAddress(); System.out.println("當前客戶真個IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }

客戶端代碼:

public class TCPClient { public static void main(String[] args) { try { //1.創建客戶端Socket,指定服務器地址和端口 Socket socket=new Socket("localhost",8866); //2.獲得輸出流,向服務器端發送信息 OutputStream os=socket.getOutputStream();//字節輸出流 //將輸出流包裝為打印流 PrintWriter pw=new PrintWriter(os); pw.write("用戶名:fyz;密碼:111222"); pw.flush(); socket.shutdownOutput();//關閉輸出流 //3.獲得輸入流,并讀取服務器真個響應信息 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String info=null; while((info=br.readLine())!=null){ System.out.println("我是客戶端,服務器說:"+info); } //4.關閉資源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }

顯示結果:
這里寫圖片描述
這里寫圖片描述

3、無連接方式UDP(用戶數據報協議)
1、通訊雙方不存在1個連接進程,1次網絡I/O以1個數據包情勢進行,而且每次網絡I/O可以和不同主機的不同進程進行。 無連接方式開消小于有連接方式,但是無連接方式所提供的數據傳輸服務不可靠,不能保證數據報1定到達目的地。
2、DatagramSocket對象用來表示數據報通訊的端點,利用程序通過該Socket接收或發送數據報,然后使用DatagramPacket對象封裝數據報。
DatagramSocket類:
這里寫圖片描述

DatagramPacket類:
此對象封裝了數據報(數據)、數據長度、數據報地址等信息。
用處:

  • 接收外來數據的數據報(創建Socket的receive()方法)
    DatagramPacket(byte[] buf, int length)
    構造 DatagramPacket,用來接收長度為 length 的數據包。
    DatagramPacket(byte[] buf, int offset, int length)
    構造 DatagramPacket,用來接收長度為 length 的包,在緩沖區中指定了偏移量。
  • 要向外發送到數據報(調用send()方法)
    DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    構造數據報包,用來將長度為 length 的包發送到指定主機上的指定端口號。
    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
    構造數據報包,用來將長度為 length 偏移量為 offset 的包發送到指定主機上的指定端口號。

1個客戶端與服務器端通訊例子

服務器端:

/* * 服務器端,實現基于UDP的用戶登陸 */ public class UDPServer { public static void main(String[] args) throws IOException { /* * 接收客戶端發送的數據 */ //1.創建服務器端DatagramSocket,指定端口 DatagramSocket socket=new DatagramSocket(8800); //2.創建數據報,用于接收客戶端發送的數據 byte[] data=new byte[1024];//創建字節數組,指定接收的數據包的大小 DatagramPacket packet=new DatagramPacket(data,data.length); //3.接收客戶端發送的數據 System.out.println("****服務器端已啟動,等待客戶端發送數據****"); socket.receive(packet);//此方法在接收到數據報之前會1直阻塞 //4.讀取數據 String info=new String(data,0,packet.getLength()); System.out.println("我是服務器,客戶端說:"+info); /* * 向客戶端響應數據 */ //1.定義客戶真個地址、端口號、數據 InetAddress address=packet.getAddress(); int port=packet.getPort(); byte[] data2="歡迎您!".getBytes(); //2.創建數據報,包括響應的數據信息 DatagramPacket packet2=new DatagramPacket(data2,data2.length,address,port); //3.響應客戶端 socket.send(packet2); //4.關閉資源 socket.close(); } }

客戶端:

/* * 客戶端 */ public class UDPClient { public static void main(String[] args) throws IOException { /* * 向服務器端發送數據 */ //1.定義服務器的地址、端口號、數據 InetAddress address=InetAddress.getByName("localhost"); int port=8800; byte[] data="用戶名:admin;密碼:123".getBytes(); //2.創建數據報,包括發送的數據信息 DatagramPacket packet=new DatagramPacket(data,data.length,address,port); //3.創建DatagramSocket對象 DatagramSocket socket=new DatagramSocket();//與本機任意可用的端口綁定 //4.向服務器端發送數據報 socket.send(packet); /* * 接收伏務器端響應的數據 */ //1.創建數據報,用于接收伏務器端響應的數據 byte[] data2=new byte[1024]; DatagramPacket packet2=new DatagramPacket(data2,data2.length); //2.接收伏務器響應的數據 socket.receive(packet2); //3.讀取數據 String reply=new String(data2,0,packet2.getLength()); System.out.println("我是客戶端,服務器說:"+reply); //4.關閉資源 socket.close(); } }

顯示結果:
這里寫圖片描述
這里寫圖片描述

基于數據報的多播通訊

/* * 服務器端,基于UDP */ public class UDPServer { DatagramSocket socket=null; BufferedReader br=null; boolean moreQuotes=true; public void serverWork() throws IOException{ //創建數據包 socket=new DatagramSocket(4445); while(moreQuotes){ //構造發往多播組的數據報并發送 byte[] data="歡迎大家!".getBytes(); DatagramPacket packet; InetAddress addrgroup=InetAddress.getByName("228.5.6.7"); packet=new DatagramPacket(data,data.length,addrgroup,4446); socket.send(packet); try { Thread.sleep(5000);//間隔5秒鐘 } catch (InterruptedException e) { e.printStackTrace(); } //moreQuotes=false; } //所有句子發送終了,關閉socket //socket.close(); } public static void main(String[] args) throws IOException { UDPServer server=new UDPServer(); try { server.serverWork(); } catch (Exception e) { e.printStackTrace(); } } }
/* * 客戶端 */ public class UDPClient { public static void main(String[] args) throws IOException { //1.創建多播數據報,并加入到1個多播組 MulticastSocket socket=new MulticastSocket(4446); //目的主機地址組 InetAddress group=InetAddress.getByName("228.5.6.7"); //創建MulticastSocket并綁定4446端口,并加入到228.5.6.7多播組中 socket.joinGroup(group); /* * 接收伏務器端響應的數據 */ //創建數據報,用于接收伏務器端響應的數據 DatagramPacket packet; for(int i=0;i<5;i++){ byte[] data=new byte[1024]; packet=new DatagramPacket(data,data.length); //接收伏務器響應的數據 socket.receive(packet); String received=new String(packet.getData()); System.out.println("服務器廣播給客戶真個數據是:"+received); } socket.leaveGroup(group);//離開多播組 //4.關閉資源 socket.close(); } }

顯示結果:
這里寫圖片描述

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人毛片免费视频播放 | 在线观看欧美精品 | 亚洲一区二区三区免费 | 爱爱小视频在线观看网站 | 欧美日韩成人高清在线播放 | 亚洲免费视频在线观看 | 在线亚洲精品视频 | 性生交酡 | 波多野结中文字幕在线69视频 | 亚洲欧洲精品视频在线观看 | 亚洲成人综合网站 | 亚洲视屏在线 | 婷婷在线免费视频 | 欧美成人aⅴ | 久久大 | 性做久久久久久久免费看 | 亚洲香蕉一区二区三区在线观看 | 欧美日本亚洲 | 一级aa免费视频毛片 | 欧美一区二区三区网站 | a资源在线 | 精品国免费一区二区三区 | 中文字幕亚洲精品日韩精品 | 欧美日本在线一区二区三区 | 最近好中文字幕国语免费高清 | 成年人视频在线观看免费 | 免费大片黄在线观看日本 | 欧美18av | 欧美性a欧美在线 | 欧美激情站| 国产一国产一级毛片视频在线 | 2021年最新久久久视精品爱 | 国产欧美日韩精品高清二区综合区 | 亚洲午夜a| 亚洲精品成人 | 日韩一级欧美一级 | 中文字幕最新中文字幕中文字幕 | 亚洲乱码专区一区二区三区 | 国产一国产一级毛片视频在线 | 精品亚洲综合在线第一区 | 美国黄色一级毛片 |