java 網絡編程基礎知識

22人閱讀 評論(0) 收藏 舉報

TCP/IP協議,,IP地址,4個字節表示;IPV4

127.0.0.1迴路IP,不經過網卡的特殊IP地址。

PORT端口號,一個佔用兩個字節的整數,用於表示數據包該交給哪個網絡程序。同樣也要指定接受哪個端口號上的數據。

一臺計算機上不允許有兩個相同端口號得應用程序。

範圍在0-65535之間,0-1023之間的端口是用於知名的網絡服務和應用。我們編寫要用1024以上的··以免衝突。

TCP,,,傳輸控制協議,面向連接的通信協議。需要建立連接。就像電話

UDP,,,用戶數據報協議,是無連接通信協議。不保證數據的可靠傳輸。

數據幀格式

協議類型--源IP--目標IP--源端口--目標端口--幀序號--幀數據

 

TCP一問一答的方式。。UDP不會等待,直接不停的發送。

 

Socket 網絡驅動層是提供給應用程序編程的接口和一種機制

通過一種綁定機制與驅動程序建立關係。告訴對應的IP和PORT  接受方同理;

 

java.net包中

DatagramSocket 類對應udp通信

ServerSocket 類用於TCP通信的服務器端 創建於客戶端連接的

Socket 類用於TCP通信的服務器和客戶端  這裏的服務器是用於向客戶端傳輸數據的

如果沒有創建端口號,會自動選擇一個沒有被使用的。

如果沒有指定IP地址,驅動會隨機指定計算機上的一個IP;

對於只有一個IP地址的計算機,一般不用指定IP地址

 

udp網絡程序

DatagramSocket類    發送數據時最好用無參構造,如果有可能接受數據選擇帶端口號參數的構造函數,如果有多個IP地址選擇帶端口號和IP的構造函數,,,close方法調用後,此端口號就可以被驅動分配給別的應用程序。

send(DatagramPacket p )發送數據報方法     receive(DatagramPacket p)接受數據報方法

DatagramPacket數據容器   接受數據時的構造函數,  發送數據時的構造函數

getInetAddress()和getPort()接受數據可以獲取發送方IP和PORT,,,getData和getLength方法獲取實際接受數據和數據長度。

 

 

InetAddress 用於表示IP地址的類   getByName放回此類得示例。getHostAddress放回此對象當中用點分割的地址

 

 

  1. //發送方   
  2. public class UdpSend{  
  3.            public static void main(String[] args){  
  4.                 DatagramSocket ds = new DatagramSocket();  
  5.                 String strInfo = "hello ww.it315.org";  
  6.                 ds.send(new DatagramPacket(strInfo.getBytes()),strInfo.getBytes().length,InetAddress.getByName("192.168.1.100"),3000));  
  7.                 ds.close();  
  8.            }  
  9. }  
  10. //接受數據方   
  11. public class UdpRecv{  
  12.             public static void main(String[] args){  
  13.                 DatagramSocket ds = new DatagramSocket(3000);  
  14.                 byte[] buf = new byte[1024];  
  15.                 DatagramPacket dp = new DatagramPacket(buf,1024);  
  16.                 //啓動接受數據方,如果沒有數據可接受,當前線程將被阻塞   
  17.                 ds.receive(dp);  
  18.                 String str = new String(buf,0,dp.getLength());  
  19.                 System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+str);  
  20.                 ds.close();  
  21.            }  
  22. }  

 

 

 

只有UDP才能發送和接受廣播地址數據,,廣播地址需要根據子網掩碼來計算。。如果是255.255.254.0,那麼廣播地址就是192.168.1.255。。。 

私有IP通過網關代理上網的計算機不能與具有合法internetIP地址的計算機進行對話。

網關中有一張轉發映射表,發送和接受數據,都會根據映射表來中轉。轉發映射表有失效性。一段時間內沒有數據來往,網關就會清楚掉轉發映射表中的記錄,那麼外部計算機就不能訪問到網關內部的計算機了。

 網關上也可以配置靜態的轉發映射記錄。實現網關內計算機與inter網上計算機進行數據交換····

 

 

TCP網絡:

 

TCP程序有主從之分,分爲客戶端機和服務器端機。。

 客戶端機對應socket類,服務器對應serverSocket類

 

服務器端首先創建ServerSocket類,調用accept方法等待客戶端的連接。客戶端程序創建一個socket並請求與服務器建立連接,

接着服務器接受客戶端連接並創建一個新的socket於客戶機建立專線連接!

建立了連接的兩個socket在服務器端創建的一個新的線程上進行對話。接着ServerSocket又開始等待客戶端機請求連接,

並重復執行這些步驟。

 

 

ServerSocket(int port 端口號(如果寫入0,計算機將會自動給服務器程序分配端口號),,,int backlog  默認爲50,指定服務器建立於客戶端機請求連接的最大等待連接數。。InetAddress 綁定到的本地 IP 地址創建服務器),一般只用指定端口號    同樣擁有close方法

accept,等待客戶端連接請求,一旦接受後方法返回一個與客戶端專線連接的socket對象。如果沒有客戶端請求連接,將使線程處於阻塞狀態。

 

Socket(綁定服務器IP(接受字符串類型和InetAddress類型),綁定服務器端口號)也可以指定本機IP和端口,,一般不指定。

不用將socket構造函數用於服務器端創建socket對象。

 

連接後他們以網絡字節流的方式進行數據交換,,,getInputStream方法,以及getOutputStream方法,用於返回socket的輸入輸出流對象。

  1. package socketTest;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5. import java.net.Socket;  
  6. /** 
  7. *  socket客戶端機 
  8. */  
  9. public class TcpClient {  
  10.     public static void main(String[] args) {  
  11.           
  12.         try {  
  13.             Socket s= new Socket("192.168.1.101",8001);  
  14.             InputStream ips = s.getInputStream();  
  15.             OutputStream ops = s.getOutputStream();  
  16.             byte[] bur = new byte[1024];  
  17.             int len = ips.read(bur);  
  18.             System.out.println(new String(bur,0,len));  
  19.             ops.write("建立連接成功啦!!".getBytes());  
  20.             ops.close();  
  21.             ips.close();  
  22.             s.close();  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.           
  27.     }  
  28. }  
  29. package socketTest;  
  30.   
  31. import java.io.*;  
  32. import java.net.*;  
  33. /** 
  34. *  socket服務器端 
  35. */  
  36. public class TcpTest {  
  37.     public static void main(String[] args) {  
  38.         try {  
  39.             ServerSocket ss = new ServerSocket(8001);  
  40.             Socket s = ss.accept();  
  41.             InputStream ips = s.getInputStream();  
  42.             OutputStream ops = s.getOutputStream();  
  43.             ops.write("welcome to My House!!陳亮宇".getBytes());  
  44.             byte[] bur = new byte[1024];  
  45.             int len = ips.read(bur);  
  46.             System.out.println(new String(bur,0,len));  
  47.             ops.close();  
  48.             ips.close();  
  49.             s.close();  
  50.             ss.close();  
  51.         } catch (IOException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.           
  55.     }  
  56. }  
  57. /** 
  58. *一臺服務器,多臺客戶端機進行對話! 
  59. */  
  60.   
  61.   
  62. import java.io.BufferedReader;  
  63. import java.io.InputStreamReader;  
  64. import java.io.OutputStreamWriter;  
  65. import java.io.PrintWriter;  
  66. import java.net.Socket;  
  67.   
  68. public class Servicer implements Runnable {  
  69.     private Socket s ;  
  70.     public Servicer(Socket s){  
  71.         this.s = s;  
  72.     }  
  73.     @Override  
  74.     public void run() {  
  75.         try{  
  76.               
  77.             BufferedReader bf = new BufferedReader(  
  78.                     new InputStreamReader(  
  79.                             s.getInputStream()));  
  80.             PrintWriter pw = new PrintWriter(  
  81.                     new OutputStreamWriter(  
  82.                             s.getOutputStream()),true);  
  83.             while(true)  
  84.             {  
  85.                 String msg = bf.readLine();  
  86. System.out.println(msg);  
  87.                 if(msg.equalsIgnoreCase("exit"))  
  88.                     break;  
  89.                 StringBuffer sb = new StringBuffer(msg).reverse();  
  90.                 pw.println(msg+"-------->"+sb.toString());  
  91.             }  
  92.             pw.close();  
  93.             bf.close();  
  94.             s.close();  
  95.         }catch(Exception ex){  
  96.             ex.printStackTrace();  
  97.         }  
  98.     }  
  99.       
  100. }  
  101.   
  102. import java.io.*;  
  103. import java.net.*;  
  104.   
  105. public class TcpTest {  
  106.     public static void main(String[] args) {  
  107.         try {  
  108.             ServerSocket ss = new ServerSocket(8001);  
  109.             boolean isRunning = true;  
  110.             while(isRunning){  
  111.                 Socket s = ss.accept();  
  112.                 Servicer svr = new Servicer(s);  
  113.                 new Thread(svr).start();  
  114.             }  
  115.               
  116.         } catch (IOException e) {  
  117.             e.printStackTrace();  
  118.         }  
  119.           
  120.     }  
  121. }  
  122.   
  123.   
  124.   
  125.   
  126. import java.io.BufferedReader;  
  127. import java.io.InputStreamReader;  
  128. import java.io.OutputStreamWriter;  
  129. import java.io.PrintWriter;  
  130. import java.net.Socket;  
  131. import java.util.Scanner;  
  132.   
  133. public class TcpClient {  
  134.     public static void main(String[] args) {  
  135.         Socket s = null;  
  136.         BufferedReader br =null;  
  137.         PrintWriter pw =null;  
  138.         try {  
  139.             s= new Socket("192.168.1.101",8001);  
  140.             br = new BufferedReader(  
  141.                     new InputStreamReader(s.getInputStream()));  
  142.             pw = new PrintWriter(new OutputStreamWriter(  
  143.                     s.getOutputStream()),true);  
  144.             while(true){  
  145.                 Scanner input = new Scanner(System.in);  
  146.                 pw.println(input.nextLine());  
  147.                 System.out.println(br.readLine());  
  148.             }  
  149.         } catch (Exception e) {  
  150.             e.printStackTrace();  
  151.         }finally{  
  152.             try{  
  153.             pw.close();  
  154.             br.close();  
  155.             s.close();  
  156.             }catch(Exception e)  
  157.             {  
  158.                 e.printStackTrace();  
  159.             }  
  160.         }  
  161.           
  162.     }  
  163. }  

 

 

TCP服務器端要想於多個客戶端程序進行連接就要循環調用serversocket的accept方法。。。

每一個服務器創建的與某個客戶端之間的連接之間不能互相干擾,應該放在單獨的線程當中運行。

一個服務器端對象於一個單獨的線程相關聯,來獨立完成於客戶端的會話過程。

 

解決TCP服務器程序端口號衝突問題:  使用netstat -n 查詢正在使用中的端口號。

通過配置信息來指定程序端口號。用戶可以通過修改配置文件來指定程序指定的端口

 

通過指定參數編寫客戶端機代碼,將服務器IP和端口號作爲參數。可以使程序更加靈活。。

 

ASP和JSP是用於編寫網站內容的,並不是網絡編程!!!!

 

 

訪問網絡資源:

URL統一資源定位符   URL編碼規則空格將轉換爲+號,,普通數字和字母正常顯示,特殊符號將用%打頭加上它的十六進制表現形式。

java中提供了URLEncoder類和URLDecoder類來實現URL的編碼和解碼。。。

 

HTTP請求消息,,請求行,,消息頭,,空格,,(實體)一般是表單提交的值

HTTP響應消息,,狀態行,,消息頭,,空格,,實體,網頁內容。

 

HTTP消息頭字段,

Connection,,,,默認爲Keep-Alive,返回消息保持連接,,,close返回消息關閉連接。

Accept-Lanuage,,,,指定客戶端所期望返回消息的國家語言,可以指定多個,以逗號分隔

Range :bytes = 100-588      顯示指定位置內容,單位爲字節100>= <=588

              bytes = 100-            100後所有

              bytes = -100             最後100

Content-Range : bytes 1234-5678/10000

 

 

出自:http://blog.csdn.net/a15874647/article/details/6381560

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章