網絡編程

一、網絡架構

1C/S client/server

            特點:

             該結構的軟件,客戶端和服務端都需要編寫。

             開發成本較高,維護較爲麻煩。             

      好處:

             客戶端在本地可以分擔一部分運算。

2B/S browser/server

      特點:

             該結構的軟件,只開發服務器端,不開發客戶端,因爲客戶端直接由瀏覽器取代。

             開發成本相對低,維護更爲簡單。

      缺點:所有運算都要在服務端完成。

二、網絡編程中的網絡要素:

      1IP地址:InetAddress

             1)網絡中設備的標示

             2)不易於記憶,可用計算機名

             3)本地迴環地址127.0.0.1,主機名localhost

      2、端口號:

             1)用於標示進程的邏輯地址,不同進程的標識

             2)有效斷開0——65535,其中0——1024是系統使用或者保留的端口

      3、協議:

             1)通訊的規則

             2)常見的協議:UDPTCP

三、UDP網絡傳輸協議

1UDP特點

1)將數據源和目的封裝在數據包中,不需要建立連接;

2)每一個數據報的大小限制在64K內;

3)因無連接,是不可靠的協議;

4)不需要建立連接,速度快

2UDP發送端的建立

       1)發送端的建立的步驟

             1,建立updsocket服務。

2,提供數據,並將數據封裝到數據包中。

3,通過socket服務的發送功能,將數據包發出去。

4,關閉資源。

       2)示例代碼

class UdpSend

{

      public static void main(String[] args) throws Exception

      {

             //1,創建udp服務。通過DatagramSocket對象。

             DatagramSocket ds = new DatagramSocket(8888);

 

             //2,確定數據,並封裝成數據包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)

 

             byte[] buf = "udp ge men lai le ".getBytes();//怎麼在定義了byte數組的大小之後再給byte數組初始化呢?

             DatagramPacket dp =

                    new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);

 

             //3,通過socket服務,將已有的數據包發送出去。通過send方法。

             ds.send(dp);

 

             //4,關閉資源。

 

             ds.close();

 

      }

}

3UDP接收端的建立

       1)接收端的建立的步驟

1,定義udpsocket服務。通常會監聽一個端口。其實就是給這個接收網絡應用程序定義數字標識。方便於明確哪些數據過來該應用程序可以處理。

2,定義一個數據包,因爲要存儲接收到的字節數據。

因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息。

3,通過socket服務的receive方法將收到的數據存入已定義好的數據包中。

4,通過數據包對象的特有功能。將這些不同的數據取出。打印在控制檯上。

5,關閉資源。

       2)示例代碼

class UdpRece

{

      public static void main(String[] args) throws Exception

      {

             //1,創建udp socket,建立端點。

             DatagramSocket ds = new DatagramSocket(10000);

             while(true)

             {

             //2,定義數據包。用於存儲數據。

             byte[] buf = new byte[1024];

             DatagramPacket dp = new DatagramPacket(buf,buf.length);//length難道不是要實際接收的包的長度嗎?//如果不是此length到底有什麼用啊?

 

             //3,通過服務的receive方法將收到數據存入數據包中。

             ds.receive(dp);//阻塞式方法。

             

 

             //4,通過數據包的方法獲取其中的數據。

             String ip = dp.getAddress().getHostAddress();

 

             String data = new String(dp.getData(),0,dp.getLength());//接收數據時,好像接收的就是自定義的byte[]數組buf,但取出數據時只要其中的實際長度,即從0--dp.getLength();

 

             int port = dp.getPort();

 

             System.out.println(ip+"::"+data+"::"+port);

 

             }

             //5,關閉資源

             //ds.close();

 

      }

}

 

四、TCP網絡傳輸協議

1TCP的特點

1)建立連接,形成網絡數據的通道;

2)在連接中進行大量數據傳輸;

3)通過三次握手完成連接,是可靠協議;

4)必須建立連接,效率會稍低;

2TCP客戶端的建立

       1)客戶端建立的步驟

1,建立socket服務。指定要連接主機和端口。

2,獲取socket流中的輸出流。將數據寫到該流中。通過網絡發送給服務端。

3,獲取socket流中的輸入流,將服務端反饋的數據獲取到,並打印。

4,關閉客戶端資源。

       2)示例代碼

class TcpClient2

{

      public static void main(String[] args)throws Exception

      {

             Socket s = new Socket("192.168.1.254",10004);

             

             OutputStream out = s.getOutputStream();

 

             out.write("服務端,你好".getBytes());

 

             

             InputStream in = s.getInputStream();

 

             byte[] buf = new byte[1024];

 

             int len = in.read(buf);

 

             System.out.println(new String(buf,0,len));

 

             s.close();

      }

}

3TCP服務器端的建立

       1)服務端建立的步驟

1,建立服務端的socket服務。ServerSocket();

      並監聽一個端口。

2,獲取連接過來的客戶端對象。

      通過ServerSokcet accept方法。沒有連接就會等,所以這個方法阻塞式的。

3,客戶端如果發過來數據,那麼服務端要使用對應的客戶端對象,並獲取到該客戶端對象的讀取流來讀取發過來的數據。

      並打印在控制檯。

 

4,關閉服務端。(可選)

       2)示例代碼

class TcpServer2

{

      public static void main(String[] args) throws Exception

      {

             ServerSocket ss = new ServerSocket(10004);

 

             Socket s = ss.accept();

 

             String ip = s.getInetAddress().getHostAddress();

             System.out.println(ip+"....connected");

             InputStream in = s.getInputStream();

 

             byte[] buf = new byte[1024];

 

             int len = in.read(buf);

 

             System.out.println(new String(buf,0,len));

 

 

             OutputStream out = s.getOutputStream();

 

 

             Thread.sleep(10000);

             out.write("哥們收到,你也好".getBytes());

 

             s.close();

 

             ss.close();

      }

}

 

 

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