TCP、UDP網路通訊
阿新 • • 發佈:2019-01-05
IP地址和埠號
埠號是用兩個位元組(16位的二進位制數)表示的,它的取值範圍是0~65535,其中,0~1023之間的埠號用於一些知名的網路服務和應用,
使用者的普通應用程式需要使用1024以上的埠號,從而避免埠號被另外一個應用或服務所佔用。
InetAddress
常用方法
程式碼演示:
1 public static void main(String[] args) throws UnknownHostException { 2 //InetAddress inet=InetAddress.getLocalHost(); 3 //主機名+ip地址 4 InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34"); 5 System.out.println(inet); 6 String host=inet.getHostName(); 7 String ip=inet.getHostAddress(); 8 System.out.println(host+"..."+ip); 9 }
UDP通訊
DatagramPacket
DatagramSocket
UDP網路程式
程式碼演示:
1 //傳送端 2 public class UDPSend { 3 public static void main(String[] args) throws IOException { 4 //1.打包 5 //明確資料 6 byte[] bytes="你好嗎".getBytes(); 7 //明確目的地的IP地址 8 InetAddress inet=InetAddress.getByName("127.0.0.1"); 9 //裝包 10 DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888); 11 //2.建立快遞公司 12 DatagramSocket ds=new DatagramSocket(); 13 //3.傳送 14 ds.send(dp); 15 //4.釋放資源 16 ds.close(); 17 } 18 19 }
1 //接收端 2 public class UDPReceive { 3 public static void main(String[] args) throws IOException { 4 //明確埠號 5 DatagramSocket ds=new DatagramSocket(8888); 6 //建立接收資料的位元組陣列 7 byte[] bytes=new byte[1024]; 8 //建立接收的資料包 9 DatagramPacket dp=new DatagramPacket(bytes, bytes.length); 10 //接收 11 ds.receive(dp); 12 //獲取接收包上的資料 13 int length=dp.getLength(); 14 String ip=dp.getAddress().getHostAddress(); 15 int port=dp.getPort(); 16 System.out.println("ip地址為:"+ip+"埠號為:"+port+"傳送的內容為:"+new String(bytes,0,length)); 17 //釋放資源 18 ds.close(); 19 } 20 21 }
TCP通訊
一個是ServerSocket類,用於表示伺服器端,一個是Socket類,用於表示客戶端。
ServerSocket
Socket
方法宣告 |
功能描述 |
int getPort() |
該方法返回一個int型別物件,該物件是Socket物件與伺服器端連線的埠號 |
InetAddress getLocalAddress() |
該方法用於獲取Socket物件繫結的本地IP地址,並將IP地址封裝成InetAddress型別的物件返回 |
void close() |
該方法用於關閉Socket連線,結束本次通訊。在關閉socket之前,應將與socket相關的所有的輸入/輸出流全部關閉,這是因為一個良好的程式應該在執行完畢時釋放所有的資源 |
InputStream getInputStream() |
該方法返回一個InputStream型別的輸入流物件,如果該物件是由伺服器端的Socket返回,就用於讀取客戶端傳送的資料,反之,用於讀取伺服器端傳送的資料 |
OutputStream getOutputStream() |
該方法返回一個OutputStream型別的輸出流物件,如果該物件是由伺服器端的Socket返回,就用於向客戶端傳送資料,反之,用於向伺服器端傳送資料 |
圖解:
程式碼演示:
1 //傳送端 2 public class UDPSend { 3 public static void main(String[] args) throws IOException { 4 //1.打包 5 //明確資料 6 Scanner sc=new Scanner(System.in); 7 //明確目的地的IP地址 8 InetAddress inet=InetAddress.getByName("192.168.1.171"); 9 //2.建立快遞公司 10 DatagramSocket ds=new DatagramSocket(); 11 while(true){ 12 String mes=sc.next(); 13 byte[] bytes=mes.getBytes(); 14 //裝包 15 DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666); 16 //3.傳送 17 ds.send(dp); 18 } 19 //4.釋放資源 20 //ds.close(); 21 22 }
1 //接收端 2 public class UDPReceive { 3 public static void main(String[] args) throws IOException { 4 //明確埠號 5 DatagramSocket ds=new DatagramSocket(8888); 6 //建立接收資料的位元組陣列 7 byte[] bytes=new byte[1024]; 8 //建立接收的資料包 9 while(true){ 10 DatagramPacket dp=new DatagramPacket(bytes, bytes.length); 11 //接收 12 ds.receive(dp); 13 //獲取接收包上的資料 14 int length=dp.getLength();//明確傳送的位元組長度 15 String ip=dp.getAddress().getHostAddress(); 16 int port=dp.getPort(); 17 System.out.println("ip地址為:"+ip+"埠號為:"+port+"傳送的內容為:" 18 +new String(bytes,0,length)); 19 } 20 }
1 //伺服器端 2 public class TCPServer { 3 public static void main(String[] args) throws IOException { 4 //建立伺服器套接字 5 ServerSocket server=new ServerSocket(7777); 6 //呼叫accept方法與客戶端建立連結 7 Socket socket=server.accept(); 8 InputStream in=socket.getInputStream(); 9 byte[] bytes=new byte[1024]; 10 int len=in.read(bytes); 11 System.out.println(new String(bytes,0,len)); 12 //伺服器給客戶端回覆 13 OutputStream out=socket.getOutputStream(); 14 out.write("收到!over!".getBytes()); 15 16 server.close(); 17 }
1 //客戶端 2 public class TCPCLient { 3 public static void main(String[] args) throws IOException { 4 //1.建立Socket物件,連線伺服器 5 Socket socket=new Socket("127.0.0.1",7777); 6 //2.通過客戶端套接字物件Socket物件中的獲取位元組輸出流的方法 7 OutputStream out=socket.getOutputStream(); 8 //3.將資料寫向伺服器 9 out.write("伺服器你好".getBytes()); 10 //接收伺服器端的回覆 11 InputStream in=socket.getInputStream(); 12 byte[] bytes=new byte[1024]; 13 int len=in.read(bytes); 14 System.out.println(new String(bytes, 0, len)); 15 //釋放資源 16 socket.close(); 17 }