java-网络编程篇
1.TCP/IP協議
?? 在Internet中TCP/IP協議是使用最廣泛的通訊協議。“傳輸控制協議/網際協議”/Transmission Control Protocol/Internet Protocol
- ?? TCP/IP實際上是一組協議,它包括上百個各種功能的協議。如:“遠程登錄”,“文件傳輸”等,而
- ????? TCP協議和IP協議只是保證數據完整傳輸的兩個重要協議。通常說TCP/IP是internet協議族,而
- ???? ?不單單只是指TCP協議和IP協議。
- ? TCP/IP協議的基本傳輸單位是數據包(datagram).
2.TCP協議
???TCP(transmission control protocol)傳輸控制協議。
- 是專門設計用于在不可靠的因特網上提供可靠的,端到端的字節流通信協議。
- 如果IP數據包中有已經封好的TCP數據包,那么IP將把它們向‘上’傳送到TCP層。
- ?? TCP將包排序并進行錯誤檢查,同時實現虛電路間的連接(通過三路握手實現)。
- ?? TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
?? TCP是一種面向連接的通信協議,TCP連接提供兩臺計算機之間可靠無差錯的字節流數據傳輸。
3.IP地址和端口號
?? IP地址:網絡中每臺計算機的一個標識符,是一個邏輯地址。127.0.0.1代表本機地址。
?? 端口號:具有網絡功能的應用軟件的標識符。
- 端口號總共有2的16次方個(65536),0-1023是公認端口號,
- ???? 1024-65535是還沒有定義的端口號,用戶可以自己使用
- 端口與協議有關:TCP和UDP的端口互不相干。
4.IP地址
?? IP地址是使用32位(4個字節)二進制表示。一般用十進制顯示如:182.168.1.3。
?? IP地址分類:5類,A類:給政府機構用。B類:給中等規模公司用。C類:給有任何需要的人用
??????????????????? D類:用于組播。E類:用于實驗。
??
? 在實際中可以使用127.0.0.1表示本機(本機IP地址或回路地址),或者直接使用localhost代表本機。
? ping 127.0.0.1 是用來測試網卡是否正常。
? 后三位都為0的和后三位都為255的不在其中,另有他用。
4.1 域名
http://www.sina.com.cn?? 域名
??http:協議
??www:www組織
??sina:主機名
??com;商業? net :非盈利組織 org:政府,edu:教育
??cn:中國
5.Socket套接字
- 兩個應用程序可以通過一個雙向的網絡通信連接實現數據交換,這個雙向鏈路的一端稱為一個Socket。
- Socket可以看成在兩個程序在進行通訊連接中的一個端點,一個程序將一段信息寫入一個Socket中,
- ? 該Socket將這段信息發送給另一個Socket中,使這段信息能傳送到其他程序中。
- Socket通常用來實現client-server連接,建立連接需要的尋址信息為IP和端口號(Port Number)。
6.網絡編程的四個基本步驟
- 創建Socket;
- 打開鏈接到Socket的輸入/輸出流;
- 按照一定的協議對Socket進行讀/寫操作;
- 關閉Socket;
???? 演示Demo
public class TCPServer //Server端 {public static void main (String []args){try{ServerSocket ss=new ServerSocket (8888);//建立服務端while(true){Socket s1=ss.accept();//返回Socket端BufferedWriter bw=new BufferedWriter //建立寫入流;(new OutputStreamWriter(s1.getOutputStream()));//向寫入流寫入內容bw.write("你好"+s1.getInetAddress()+":"+s1.getPort()); //關閉資源 bw.close(); s1.close(); } }catch (Exception e) { } }} public class TCPClient //客戶端 { public static void main (String []args) { try{ Socket s=new Socket ("127.0.0.1",8888); BufferedReader br=new BufferedReader (new InputStreamReader(s.getInputStream())); System.out.println("服務器說:"+br.readLine()); br.close(); s.close(); }catch (Exception e) { } }}7.TCP Socket通信模型
java.net包中定義了兩個類:Socket和ServerSocket ,分別用來實現TCP的Client和Server端
7.1 TCP/IP中的協議
- UDP(User Datagram Protocol)用戶數據報協議
- UDP和TCP位于同一層(傳輸層),但它對數據包的順序錯誤和重發沒有TCP來的可靠。因此,UDP不被應用
- ? 于那些使用虛電路的面向直接服務,UDP主要用于面向查詢-應答的服務。
- UDP是一種面向無連接(只發送無需建立連接)的通信協議,UDP向應用程序提供一種發送封裝的原始IP數據報
- ? 的方法,并且發生時無需建立連接,不保證可靠數據的傳輸。
8.UDP網絡編程
- 面向無連接的數據傳輸,不可靠,效率高。常用于音頻,視頻...
- UDP一次發送的數據不能超過64KB。
? UDP編程所需要的類。
????? DatagramSocket?此類表示用來發送和接收數據報包的套接字
????? DatagramSocket (int port) ;//創建本地主機的指定端口
????? DatagramSocket (int port ,InetAddress laddr) ;//
????? DatagramPacket?此類表示數據報包。(多個包發送時會選擇不同的路由發送,且按不同的順序到達)
??????DatagramPacket (byte[] buf,int length,InetAddress address,int port);
????? DatagramPacket(byte[] buf,int length,SocketAddress address);
??????InetAddress類。
????? static?InetAddress?getByName(String host);//靜態方法,其沒有構造方法
????? //eg:?InetAddress?ia=InetAddress.getByName("192.168.1.1");返回一個指定iP的對象。
??????SocketAddress是抽象類,其實現的子類為InetSocketAddress。
????? 構造方法:
?????????? InetSocketAddress (InetAddress addr,int port);
?????????? InetSocketAddress (int port);//創建套接字地址,其中IP地址為通配符地址。
?????????? InetSocketAddress (String hostname,int port);//hostname為IP地址
?發送端:?1:建立DatagramSocket,(此socket端口隨機)。
???????????? 2:建立DatagramPacket,(指定發送地址的ip和端口)。
???????????? 3:使用socket的send方法發送。
?????????????4:關閉資源
?接收端:1:建立DatagramSocket,(監聽的端口為發送端packet的指定端口)。
????????????2:建立DatagramPacket,(無需指定ip和端口)。
??????????? 3:使用socket的receive方法接收。?
??????????? 4:關閉資源
?發送端代碼:
import java.io.IOException ; import java.net.*; //發送端 public class UDPSender {public static void main (String[]args){String str="你好嗎!";DatagramSocket ds=null; DatagramPacket dp=null; try{ //定義一個發送包的socket ,端口使用9999 ds=new DatagramSocket(9999); //要發送的數據包,一定要指定ip和port String ip="127.0.0.1"; byte[]buf=str.getBytes(); dp=new DatagramPacket (buf,buf.length,InetAddress.getByName(ip),8888); //發送數據 ds.send(dp); }catch(Exception e) {} finally{ if(ds!=null) ds.close(); } } }?接收端代碼:
import java.io.IOException ; import java.net.*; //發送端 public class UDPSender {public static void main (String[]args){String str="你好嗎!";DatagramSocket ds=null; DatagramPacket dp=null; try{ //定義一個發送包的socket ,端口使用9999 ds=new DatagramSocket(9999); //要發送的數據包,一定要指定ip和port String ip="127.0.0.1"; byte[]buf=str.getBytes(); dp=new DatagramPacket (buf,buf.length,InetAddress.getByName(ip),8888); //發送數據 ds.send(dp); }catch(Exception e) {} finally{ if(ds!=null) ds.close(); } } } //接收端 public class UDPReceiver { public static void main (String []args) { byte[]buf=new byte[1024]; DatagramSocket ds=null; DatagramPacket dp=null; try{ //在8888端口監聽并接受數據包 ds=new DatagramSocket("8888"); dp=new DatagramPacket(buf,buf.length); while(true) { //收數據--此方法在接收到數據報前一直阻塞 ds.receive(dp); //dp.getLength();得到dp里的有效數據的長度 System.out.println(new String (buf,0,dp.getLength())); } }catch(Exception e) {} finally { if(ds!=null) ds.close(); } } }?
轉載于:https://www.cnblogs.com/beyondbycyx/p/4643285.html
總結
以上是生活随笔為你收集整理的java-网络编程篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Discuz!X安装配置
- 下一篇: [ccf 4] 网络延时