這次來簡單討論一下網絡編程有關的東西:
網絡編程三要素+UDP協議講解
1.網絡通信介紹
2.tcp/ip
3.udp/ip
Socket通信
網絡編程三要素:
ip:一個計算的標示(找到這個計算機)
端口:應用程序都會對應一個端口,用來進行通信,有效端口:0~65535,其中0~1024系統使用或保留端口(360查看端口)。
協議:總共有2種協議(TCP,UDP)
三要素詳解:
特殊的IP地址:
127.0.0.1 本地迴環地址 用來做一些本地測試
ping IP地址 ; 用來檢測本機是否可以和指定的IP地址的計算機可以進行正常通訊
ipconfig 用來查看IP地址
xxx.xxx.xxx.255 廣播地址
端口號:
物理端口 物理設備對應的端口 , 網卡口
邏輯端口 用來標示我們的計算機上的進程 , 端口號的有效範圍應該是 0-65535 ,
其中0-1024被系統佔用或者保留
協議:
UDP
把數據打成一個數據包 , 不需要建立連接
數據包的大小有限制不能超過64k
因爲無連接,所以屬於不可靠協議(可能丟失數據)
因爲無連接 ,所以效率高
TCP
需要建立連接,形成連接通道
數據可以使用連接通道直接進行傳輸,無大小限制
因爲有鏈接,所以屬於可靠協議
因爲有鏈接,所以效率低
1.4 (InetAddress)
InetAddress:IP地址的描述類
InetAddress類的概述
爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用
此類表示互聯網協議 (IP) 地址。
InetAddress類的常見功能
public static InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)
public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。
public String getHostName()獲取此 IP 地址的主機名。
案例演示: InetAddress類的常見功能
public class InetAddressDemo { public static void main(String[] args) throws Exception { //通過主機ip獲取InetAddress對象 InetAddress address = InetAddress.getByName("192.168.20.25"); //public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。 System.out.println(address.getHostAddress()); //public String getHostName()獲取此 IP 地址的主機名。 System.out.println(address.getHostName()); } }
(也叫socket編程,套接字編程,網絡編程,叫法不一樣都是一個東西)
Socket套接字:(利用qq聊天的案例畫圖進行講解)
網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。
Socket原理機制:
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO傳輸。
分協議進行講解網絡編程
UDP協議:(寫一個標準demo)
特點:1.把數據打包
2.不需要建立連接,也稱爲面向無連接協議
3.數據需打包,數據大小有限制64k
4.無需建立連接,所以不可靠
5.速度快
UDP通信步驟:
發送端步驟:
UDP發送數據的步驟:
A:創建UDP發送數據端Socket對象
B:創建數據包,並給出數據,把數據打包
C:通過Socket對象發送數據包
D:釋放資源
接收端步驟:
UDP協議接收數據步驟:
A:創建UDP接收數據端Socket對象
B:創建一個接收數據的數據包
C:接收數據,數據在數據包中
D:解析數據包,並把數據顯示在控制檯
E:釋放資源
下面實現一些需求:
鍵盤錄入數據實現數據的動態發送
public class UdpClient { public static void main(String[] args) throws Exception { //1.創建發送端的socket對象 DatagramSocket ds = new DatagramSocket(); InetAddress address = InetAddress.getByName("192.168.20.254"); int port = 9999; //2.創建鍵盤錄入對象 Scanner sc = new Scanner(System.in); String line; while ((line=sc.nextLine())!=null) { //鍵盤錄入的數據line byte[] buf = line.getBytes(); int length = buf.length; DatagramPacket dp = new DatagramPacket(buf, length, address, port); //發送數據包 ds.send(dp); } //釋放資源 ds.close(); } } public class UdpServer { public static void main(String[] args) throws Exception { //創建接收端的socket對象 DatagramSocket ds = new DatagramSocket(9999); //接受來自客戶端的數據 while (true) { //創建數據包 byte[] buf = new byte[1024]; int length = buf.length; DatagramPacket dp = new DatagramPacket(buf, length); //接受來自客戶端的數據 ds.receive(dp); //解析數據包中的數據 byte[] data = dp.getData(); int len = dp.getLength(); System.out.println(new String(data, 0, len)); } } }
多線程實現聊天室(相當於是將發送數據端和接收數據端合併)
詳見第十八天網絡編程,com.edu_05
二:TCP協議要點
2.1
* TCP協議:(寫一個demo) 特點:1.需要建立通道 2.傳送大量數據無限制 3.面向連接 4.可靠 5.速度慢 TCp協議書寫步驟: 發送端: /* * TCP協議發送數據步驟: * A:創建TCP協議發送端Socket對象 * 指定服務器IP及端口 Socket sk = new Socket("192.168.3.120" , 9527) ; * B:獲取輸出流,並寫數據 OutputStream outputStream = sk.getOutputStream() ; outputStream.write("hello,TCP我來了".getBytes()) ; * C:釋放資源 sk.close() ; * * java.net.ConnectException: Connection refused: connect * TCP協議是不能直接運行客戶端的,必須先運行服務器。因爲他是一種可靠的協議。 */ 接收端: /* * TCP協議接收數據步驟: * A:創建TCP協議接收端Socket對象 ServerSocket ss = new ServerSocket(9527) ; * B:監聽客戶端連接 Socket sk = ss.accept() ; * C:獲取輸入流,並讀取數據,顯示在控制檯 // 讀取數據 byte[] bytes = new byte[1024] ; int len = inputStream.read(bytes) ; // public InetAddress getInetAddress()獲取IP地址 InetAddress inetAddress = sk.getInetAddress() ; String ip = inetAddress.getHostAddress() ; // 輸出 System.out.println(ip + "發來數據是: " + new String(bytes , 0 , len)); * D:釋放資源 sk.close() ; *
/
class
同樣,來實現一些需求
用TCP協議寫一個數據的發送和接收,接收端接收到數據之後給發送端一個反饋
public class TcpClient { public static void main(String[] args) throws Exception { //創建tcp發送端的sockt對象 Socket sk = new Socket("192.168.20.254", 10000); //從通道中獲取輸出流 OutputStream os = sk.getOutputStream(); //網通道中寫數據 os.write("今晚約嗎".getBytes()); //接受來自服務器端的反饋 InputStream is = sk.getInputStream(); //解析is byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); //釋放資源 sk.close(); } public class TcpServer{ public static void main(String[] args) throws Exception { //創建服務器端的socket對象 ServerSocket ss = new ServerSocket(10000); //監聽來自客戶端的連接 Socket sk = ss.accept(); //從通道中獲取輸入流讀取數據 InputStream is = sk.getInputStream(); //解析is byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); //給客戶端一個反饋 OutputStream os = sk.getOutputStream(); os.write("不約".getBytes()); //釋放資源 sk.close(); } }
需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出
public class TcpClient { public static void main(String[] args) throws Exception { //創建tcp發送端socket對象 Socket sk = new Socket("192.168.20.254", 20000); //創建鍵盤錄入對象 Scanner sc = new Scanner(System.in); String line; while ((line=sc.nextLine())!=null) { //將line這個數據寫如通道 OutputStream os = sk.getOutputStream(); os.write(line.getBytes()); } sk.close(); } } public class TcpServer { public static void main(String[] args) throws Exception { //創建服務器端的socket對象 ServerSocket ss = new ServerSocket(20000); //監聽來自客戶端的連接 Socket sk = ss.accept(); while (true) { InputStream is = sk.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); } }
需求:客戶端鍵盤錄入數據,服務端將數據寫入文件
與上邊的實現方式相同,不在多寫,只需講接收到的數據寫入文件即可。