日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Socket通信機(jī)制(學(xué)習(xí)總結(jié))

Socket通信機(jī)制(學(xué)習(xí)總結(jié))

來源:程序員人生   發(fā)布時(shí)間:2016-06-30 16:05:07 閱讀次數(shù):2593次

1、甚么是Socket:
1、Socket是兩個(gè)程序進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通訊的端點(diǎn),由1個(gè)地址和1個(gè)端口來標(biāo)識(shí)。
2、兩種通訊方式:有連接方式TCP、無連接方式UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。

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

  • 創(chuàng)建ServerSocket對(duì)象,綁定監(jiān)聽端口,并監(jiān)聽。
  • 通過accept()方法監(jiān)聽客戶真?zhèn)€要求。
  • 連接建立后,通過輸入流(InputStream)讀取客戶端發(fā)送到要求信息
  • 通過輸出流(OutputStream)向客戶端發(fā)送響應(yīng)信息。
  • 關(guān)閉相干資源

(2)客戶端步驟:

  • 創(chuàng)建Socket對(duì)象,知名需要連接的服務(wù)器真?zhèn)€地址和端口號(hào)
  • 連接建立后,通過輸出流OutputStream向服務(wù)器端發(fā)送要求信息。
  • 通過輸入流InputStream獲得服務(wù)器端響應(yīng)的信息。
  • 關(guān)閉相干資源

多個(gè)客戶端與服務(wù)器通訊例子:

服務(wù)器線程處理類

//省略導(dǎo)入的包展現(xiàn) //服務(wù)器線程處理類 public class ServerThread extends Thread{ //和本線程相干的socket Socket socket=null; public ServerThread(Socket socket){ this.socket=socket; } //線程履行的操作,響應(yīng)客戶真?zhèn)€要求 public void run(){ InputStream is=null; InputStreamReader isr=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; try { //獲得輸入流,并讀取客戶端信息 is=socket.getInputStream();//字節(jié)流 //將字節(jié)流包裝為字符流 isr=new InputStreamReader(is); //為字符流添加緩沖 br=new BufferedReader(isr); String info=null; //循環(huán)讀取客戶真?zhèn)€信息 while((info=br.readLine())!=null){ System.out.println("我是服務(wù)器,客戶端說:"+info); } socket.shutdownInput();//關(guān)閉輸入流 //獲得輸出流,響應(yīng)客戶真?zhèn)€要求 os=socket.getOutputStream(); pw=new PrintWriter(os);//將字節(jié)流包裝為打印流 pw.write("客戶端,歡迎您!"); pw.flush();//調(diào)用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(); } } } }

服務(wù)器端代碼

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

客戶端代碼:

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

顯示結(jié)果:
這里寫圖片描述
這里寫圖片描述

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

DatagramPacket類:
此對(duì)象封裝了數(shù)據(jù)報(bào)(數(shù)據(jù))、數(shù)據(jù)長度、數(shù)據(jù)報(bào)地址等信息。
用處:

  • 接收外來數(shù)據(jù)的數(shù)據(jù)報(bào)(創(chuàng)建Socket的receive()方法)
    DatagramPacket(byte[] buf, int length)
    構(gòu)造 DatagramPacket,用來接收長度為 length 的數(shù)據(jù)包。
    DatagramPacket(byte[] buf, int offset, int length)
    構(gòu)造 DatagramPacket,用來接收長度為 length 的包,在緩沖區(qū)中指定了偏移量。
  • 要向外發(fā)送到數(shù)據(jù)報(bào)(調(diào)用send()方法)
    DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    構(gòu)造數(shù)據(jù)報(bào)包,用來將長度為 length 的包發(fā)送到指定主機(jī)上的指定端口號(hào)。
    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
    構(gòu)造數(shù)據(jù)報(bào)包,用來將長度為 length 偏移量為 offset 的包發(fā)送到指定主機(jī)上的指定端口號(hào)。

1個(gè)客戶端與服務(wù)器端通訊例子

服務(wù)器端:

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

客戶端:

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

顯示結(jié)果:
這里寫圖片描述
這里寫圖片描述

基于數(shù)據(jù)報(bào)的多播通訊

/* * 服務(wù)器端,基于UDP */ public class UDPServer { DatagramSocket socket=null; BufferedReader br=null; boolean moreQuotes=true; public void serverWork() throws IOException{ //創(chuàng)建數(shù)據(jù)包 socket=new DatagramSocket(4445); while(moreQuotes){ //構(gòu)造發(fā)往多播組的數(shù)據(jù)報(bào)并發(fā)送 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; } //所有句子發(fā)送終了,關(guān)閉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.創(chuàng)建多播數(shù)據(jù)報(bào),并加入到1個(gè)多播組 MulticastSocket socket=new MulticastSocket(4446); //目的主機(jī)地址組 InetAddress group=InetAddress.getByName("228.5.6.7"); //創(chuàng)建MulticastSocket并綁定4446端口,并加入到228.5.6.7多播組中 socket.joinGroup(group); /* * 接收伏務(wù)器端響應(yīng)的數(shù)據(jù) */ //創(chuàng)建數(shù)據(jù)報(bào),用于接收伏務(wù)器端響應(yīng)的數(shù)據(jù) DatagramPacket packet; for(int i=0;i<5;i++){ byte[] data=new byte[1024]; packet=new DatagramPacket(data,data.length); //接收伏務(wù)器響應(yīng)的數(shù)據(jù) socket.receive(packet); String received=new String(packet.getData()); System.out.println("服務(wù)器廣播給客戶真?zhèn)€數(shù)據(jù)是:"+received); } socket.leaveGroup(group);//離開多播組 //4.關(guān)閉資源 socket.close(); } }

顯示結(jié)果:
這里寫圖片描述

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产一区二区欧美 | 中文字幕一区在线观看视频 | 曰韩av | 五月激情网址 | 久久国产精品二国产精品 | 国产一二区在线 | 国产精品久久久久久久 | 久久久久久国产精品久久 | 看毛片的网址 | 国产欧美精品一区二区 | 国产高清一区二区 | 亚洲欧洲无码一区二区三区 | 九九热在线观看 | 亚洲福利一区二区三区 | 免费黄色在线看 | 91网站视频在线观看 | 日韩电影一区二区三区 | 毛片免费观看视频 | 亚洲成人网一区 | av在线播放免费 | 国产在线播放av | 亚洲成人网在线 | 国产精品久久久久久久久久免 | 在线电影一区二区三区 | 亚洲国产一区二区三区 | 国产精品一区二区在线播放 | 欧美成人免费在线 | 国产日产久久高清欧美一区 | 国产精品国产三级国产在线观看 | 久久精品99国产精品日本 | 日本欧美中文字幕 | 最近中文免费字幕 | 亚洲精品一区 | 亚洲福利一区二区 | 日韩综合色 | 日韩av电影网站 | 中文 日韩 欧美 | 91精品国产综合久久精品图片 | 国产在线国偷精品免费看 | 亚洲一本大道在线 | 国产黄色片在线观看 |