天天看點

07網絡程式設計網絡程式設計:

網絡程式設計:

用于不同的計算之間進行資料傳輸

網絡程式設計三要素

IP:裝置在網絡中的唯一辨別
端口:應用在裝置的唯一辨別
協定:資料傳輸所要遵循的規範
           

注意:網絡程式設計本質上就是應用和應用之間的資料傳輸

IP是可以發生變化(換了一個地方聯網)

IP分為四部分,前三部分叫做網段(辨別所在區域),最後一部分為主機号

協定常用UDP,TCP

Java提供了對IP位址操作的類InetAddress

static InetAddress getByName(String host) 确定主機名稱的IP位址,主機名稱可以是機器名稱,也可以是Ip位址

String getHostName() 擷取此IP位址的主機名

String getHostAddress() 傳回IP位址的字元串

UPD接收端

1.建立對象 監聽端口号
new DatagramSocket(int port)
2.建立資料包用于接收資料
new byte[1024];
new DatagramePacket(byte[] bytes,int length);
3.調用receive()
	DatagramSocket對象.receive(DatagramePacket對象)
4.關閉
	DatagramSocket對象.close();
           

UPD發送端

1.建立對象
	new DatagramSocket()
2.建立資料 把資料打成資料包,參數還需要ip,port
	"Hello,UDP".getBytes();
	new DatagramePacket(byte[] bytes,int length,ip,port);
3.調用send();
	DatagramSocket對象.send(DatagramePacket對象)
4.關閉
	DatagramSocket對象.close();
           

注意:如果一個類想要實作發送和接收,目前new DatagramSocket對象需要監聽端口号

發送資料時,指定的端口号,是接收所需要監聽的端口号

TCP用戶端

1.建立對象
	new Socket(String host,int port)
2.建立流 準備資料
	"hello,tcp"。getBytes()
	Socket對象.getOutputStream();
3.調用write()
	IO流對象.write(位元組數組)
4.關閉
	Socket對象.close()		
           

TCP服務端

1.建立對象
	new ServerSocket(int port);
2.監聽端口号 擷取Socket對象
	Socket socket=ServerSocket對象.accept();
3.擷取流的對象
	socket.getInputStream();
4.調用read();
	IO對象.read()
5.關閉
	ServerSocket.close();
           

TCP中循環接收資料時阻塞問題:read()阻塞程式的執行

阻塞出現的原因:

發送的資料,循環讀取,read()不能判斷目前資料發送結束,是以read每讀取一次資料都回去阻塞目前程式的運作,等待下一次資料的輸入

如何解決:發送資料之後,socket調用shutDownOutput() 關閉發送流

注意:調用shutDownOutput可能會出現問題

如果需要循環發送和接收時,不能調用shutDownOutput,因為調用之後會把發送流關閉,之後不能在實作循環發送

如何解決:用戶端和服務端約定資料的大小,new byte[大于約定的大小]