黑馬程式員_網路編程

來源:互聯網
上載者:User

標籤:blog   http   io   os   使用   java   strong   資料   sp   

網路編程的實現方式

網路編程有兩種實現方式:即通過TCP協議和UDP協議。

問:TCP和UDP有什麼區別:

答:

1)        TCP協議:屬於可靠的串連,在發送資料報之前建立串連,採用三向交握原則,可以保證資料能夠完整的傳輸到目的地,因而傳輸速度也會比較慢。

2)        UDP協議:屬於不可靠的串連,發送資料包之前不會建立串連,不會保證資料報到沒到達目的地。

(1)UDP:
  a、將資料及源和目的封裝成資料包,不需要建立串連
  b、每個資料包的大小限制在64K內
  c、因無串連,是不可靠協議
  d、不需要建立串連,速度快
 (2)TCP:
  a、建立串連,形成傳輸資料的通道
  b、在串連中進行大資料量傳輸
  c、通過三向交握完成串連,是可靠協議
  d、必須建立串連,效率會稍低

TCP程式

在Java中TCP程式的實現:

|-  使用ServerSocket類來代表格服務器端,public class ServerSocket extends Object

。

|-  使用Socket類來代表用戶端,public class Socket extends Object。

 

2、UDP傳輸

 (1)DatagramSocket,建立發送端send(DatagramPacket p)、接收端receive(DatagramPacket p)
 (2)DatagramPacket,資料報包用來實現無串連包投遞服務,建構函式有DatagramPacket(byte[] buf,int length,InetAddress address,int port)等
 (3)通訊實現(發送端):
  a、建立udpsocket服務,例如DatagramSocket ds = new DatagramSocket()對象
  b、提供資料,並將資料封裝到資料包中,即將資料轉換成位元組數組,再使用DatagramPacket進行封裝,例如byte[] buf = "udp is sending".getByte();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByname("192.168.0.100"),10000)
  c、通過socket服務的發送功能,將資料包發出去,ds.send(dp);
  d、關閉資源,例如ds.close();
 (4)通訊實現(接收端):
  a、建立udpSocket服務,例如 DatagramSocket ds = new DatagramSocket(10000);
  b、建立一個資料包,因為接收到的是一個位元組資料,資料包對象中有更多的功能用於提取位元組資料的資訊,例如 byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);
  c、通過socket服務的接收方法將收到的資料擷取到DatagramPacket中,ds.receive(dp);
  d、通過DatagramPacket的功能將資料流解讀出來,並輸出到需要的地方,例如,String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());
  e、關閉資源,ds.close();

3、TCP傳輸

 (1)Socket建立用戶端,SeverSocket建立伺服器端
 (2)建立串連後,通過Socket中的IO流進行資料轉送
 (3)關閉Socket
 (4)通訊實現(用戶端):
  a、建立socket服務,tcp是連線導向的,在建立socket服務時就要指定要串連的主機和連接埠以建立串連,例如Socket soc = new Socket("192.168.0.100",10003);
  b、建立用於擷取或寫入socket輸入輸出資料流的IO流對象,例如OutputStream out = s.getOutputStream;InputStream in = new InputStream();
  c、向輸出資料流寫入資料,資料即可從socket輸出資料流輸出,out.write("tcpmsg is sending".getByte());使用輸入資料流讀取即可擷取socket輸入資料流的資料,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
  d、關閉資源,soc.close();
 (5)通訊實現(服務端):
  a、建立SeverSocket服務,並監聽一個連接埠,SeverSocket ss = newSeverSocket(10003);
  b、通過accept方法擷取串連過來的用戶端對象,Socket s = ss.accept();
  c、用戶端如果發來資料,服務端使用上一步擷取的對應用戶端對象讀取資料,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
  d、關閉用戶端,釋放資源,s.close()
  e、關閉服務端,(如果還要等待下一個用戶端串連的話,也可以不關閉服務端),ss.close();

TCP傳輸

Socket和ServerSocket

建立用戶端和伺服器端

建立串連後,通過Socket中的IO流進行資料的傳輸

關閉socket


同樣,用戶端與伺服器端是兩個獨立的應用程式。

 

 基本思路(用戶端)

用戶端需要明確伺服器的ip地址以及連接埠,這樣才可以去試著建立串連,如果串連失敗,會出現異 常。

串連成功,說明用戶端與服務端建立了通道,那麼 通過IO流就可以進行資料的傳輸,而Socket對象已經提供了輸入資料流和輸出資料流對象,通過 getInputStream(),getOutputStream()擷取即可。

與服務端通訊結束後,關閉Socket。


通過Socket建立對象並指定要已連線的服務端主機以及連接埠。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();

 

 基本思路(服務端)

服務端需要明確它要處理的資料是從哪個 連接埠進入的。

當有用戶端訪問時,要明確是哪個客戶 端,可通過accept()擷取已串連的用戶端對象,並通過該對象與用戶端通過IO流進行資料轉送。

當該用戶端訪問結束,關閉該用戶端。


建立服務端需要監聽一個連接埠
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();

黑馬程式員_網路編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.