標籤: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();
黑馬程式員_網路編程