1. 程式人生 > >JAVA中的網路協議,UDP,TCP案例分析及筆記總結

JAVA中的網路協議,UDP,TCP案例分析及筆記總結

今日內容介紹
1、網路三要素及傳輸協議
2、實現UDP協議的傳送端和接收端
3、實現TCP協議的客戶端和伺服器
4、TCP上傳檔案案例
今日內容總結
5.1知識點總結
IP地址:用來唯一表示我們自己的電腦的,是一個網路標示
埠號: 用來區別當前電腦中的應用程式的
UDP: 傳送速度快,但是容易丟資料,如視訊聊天,語音聊天
TCP: 傳送穩定,不會丟失資料,如檔案的上傳、下載
UDP程式互動的流程
傳送端
1,建立DatagramSocket物件
2,建立DatagramPacket物件,並封裝資料
3,傳送資料
4,釋放流資源
接收端
1,建立DatagramSocket物件
2,建立DatagramPacket物件
3,接收資料儲存到DatagramPacket物件中
4,獲取DatagramPacket物件的內容
5,釋放流資源
TCP程式互動的流程
客戶端
1,建立客戶端的Socket物件
2,獲取Socket的輸出流物件
3,寫資料給伺服器
4,獲取Socket的輸入流物件
5,使用輸入流,讀反饋資訊
6,關閉流資源
伺服器端
1,建立伺服器端ServerSocket物件,指定伺服器端埠號
2,開啟伺服器,等待著客戶端Socket物件的連線,如有客戶端連線,返回客戶端的Socket物件
3,通過客戶端的Socket物件,獲取客戶端的輸入流,為了實現獲取客戶端發來的資料
4,通過客戶端的輸入流,獲取流中的資料
5,通過客戶端的Socket物件,獲取客戶端的輸出流,為了實現給客戶端反饋資訊
6,通過客戶端的輸出流,寫資料到流中
7,關閉流資源

=======================第一節課開始=============================================

01網路模型

*A:網路模型
TCP/IP協議中的四層分別是應用層、傳輸層、網路層和鏈路層,每層分別負責不同的通訊功能,接下來針對這四層進行詳細地講解。
鏈路層:鏈路層是用於定義物理傳輸通道,通常是對某些網路連線裝置的驅動協議,例如針對光纖、網線提供的驅動。
網路層:網路層是整個TCP/IP協議的核心,它主要用於將傳輸的資料進行分組,將分組資料傳送到目標計算機或者網路。
傳輸層:主要使網路程式進行通訊,在進行網路通訊時,可以採用TCP協議,也可以採用UDP協議。
應用層:主要負責應用程式的協議,例如HTTP協議、FTP協議等。

02IP地址

*A:IP地址
在TCP/IP協議中,這個標識號就是IP地址,它可以唯一標識一臺計算機,
目前,IP地址廣泛使用的版本是IPv4,它是由4個位元組大小的二進位制數來表示,如:00001010000000000000000000000001。
由於二進位制形式表示的IP地址非常不便記憶和處理,因此通常會將IP地址寫成十進位制的形式,
每個位元組用一個十進位制數字(0-255)表示,數字間用符號“.”分開,如 “192.168.1.100”
127.0.0.1 為本地主機地址(本地迴環地址)

03埠號

*A:埠號
通過IP地址可以連線到指定計算機,但如果想訪問目標計算機中的某個應用程式,還需要指定埠號。
在計算機中,不同的應用程式是通過埠號區分的。
埠號是用兩個位元組(16位的二進位制數)表示的,它的取值範圍是0~65535,
其中,0~1023之間的埠號用於一些知名的網路服務和應用,使用者的普通應用程式需要使用1024以上的埠號,從而避免埠號被另外一個應用或服務所佔用

04InetAddress類

*A:InetAddress類
/*
* 表示網際網路中的IP地址
* java.net.InetAddress
* 靜態方法
* static InetAddress getLocalHost() LocalHost本地主機
* 返回本地主機,返回值InetAddress物件
*
* static InetAddress getByName(String hostName)傳遞主機名,獲取IP地址物件
*
* 非靜態方法
* String getHoustAddress()獲取主機IP地址
* String getHoustName()獲取主機名
*
*/
public class InetAddressDemo {
public static void main(String[] args)throws UnknownHostException {
function_1();
}
/*
* static InetAddress getByName(String hostName)傳遞主機名,獲取IP地址物件
*/
public static void function_1()throws UnknownHostException {
InetAddress inet = InetAddress.getByName(“www.baidu.com”);
System.out.println(inet);
}

  /*
   *  static InetAddress  getLocalHost()   LocalHost本地主機
   */
  public static void function() throws UnknownHostException{
    InetAddress inet = InetAddress.getLocalHost();
    //輸出結果就是主機名,和 IP地址
    System.out.println(inet.toString());

    String ip = inet.getHostAddress();
    String name = inet.getHostName();
    System.out.println(ip+"   "+name);

    /*String host = inet.toString();
    String[] str = host.split("/");
    for(String s : str){
      System.out.println(s);
    }*/
  }
 }

05UDP協議

A:UDP協議
a:UDP協議概述:
UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。
簡單來說,當一臺計算機向另外一臺計算機發送資料時,傳送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向傳送端反饋是否收到資料。
b:UDP協議特點:
由於使用UDP協議消耗資源小,通訊效率高,所以通常都會用於音訊、視訊和普通資料的傳輸例如視訊會議都使用UDP協議,
因為這種情況即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。

06TCP協議

*A:TCP協議
TCP協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸。
在TCP連線中必須要明確客戶端與伺服器端,
由客戶端向服務端發出連線請求,每次連線的建立都需要經過“三次握手”。
第一次握手,客戶端向伺服器端發出連線請求,等待伺服器確認
第二次握手,伺服器端向客戶端回送一個響應,通知客戶端收到了連線請求
第三次握手,客戶端再次向伺服器端傳送確認資訊,確認連線

========================================第二節課=========================================

07資料包和傳送物件介紹

*A:資料包和傳送物件介紹:
DatagramPacket資料包的作用就如同是“集裝箱”,
可以將傳送端或者接收端的資料封裝起來。然而運輸貨物只有“集裝箱”是不夠的,還需要有碼頭。
在程式中需要實現通訊只有DatagramPacket資料包也同樣不行,為此JDK中提供的一個DatagramSocket類。
DatagramSocket類的作用就類似於碼頭,使用這個類的例項物件就可以傳送和接收DatagramPacket資料包
DatagramPacket:封裝資料
DatagramSocket:傳送DatagramPacket
埠號

08UDP傳送端

*A:UDP傳送端
/*
* 實現UDP協議的傳送端:
* 實現封裝資料的類 java.net.DatagramPacket 將你的資料包裝
* 實現資料傳輸的類 java.net.DatagramSocket 將資料包發出去
*
* 實現步驟:
* 1. 建立DatagramPacket物件,封裝資料, 接收的地址和埠
* 2. 建立DatagramSocket
* 3. 呼叫DatagramSocket類方法send,傳送資料包
* 4. 關閉資源
*
* DatagramPacket構造方法:
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
*
* DatagramSocket構造方法:
* DatagramSocket()空引數
* 方法: send(DatagramPacket d)
*
*/
public class UDPSend {
public static void main(String[] args) throws IOException{
//建立資料包物件,封裝要傳送的資料,接收端IP,埠
byte[] date = “你好UDP”.getBytes();
//建立InetAddress物件,封裝自己的IP地址
InetAddress inet = InetAddress.getByName(“127.0.0.1”);
DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000);
//建立DatagramSocket物件,資料包的傳送和接收物件
DatagramSocket ds = new DatagramSocket();
//呼叫ds物件的方法send,傳送資料包
ds.send(dp);
//關閉資源
ds.close();
}
}

09UDP接收端

*A:UDP接收端
/*
* 實現UDP接收端
* 實現封裝資料包 java.net.DatagramPacket 將資料接收
* 實現輸出傳輸 java.net.DatagramSocket 接收資料包
*
* 實現步驟:
* 1. 建立DatagramSocket物件,繫結埠號
* 要和傳送端埠號一致
* 2. 建立位元組陣列,接收發來的資料
* 3. 建立資料包物件DatagramPacket
* 4. 呼叫DatagramSocket物件方法
* receive(DatagramPacket dp)接收資料,資料放在資料包中
* 5. 拆包
* 傳送的IP地址
* 資料包物件DatagramPacket方法getAddress()獲取的是傳送端的IP地址物件
* 返回值是InetAddress物件
* 接收到的位元組個數
* 資料包物件DatagramPacket方法 getLength()
* 傳送方的埠號
* 資料包物件DatagramPacket方法 getPort()傳送埠
* 6. 關閉資源
*/
public class UDPReceive {
public static void main(String[] args)throws IOException {
//建立資料包傳輸物件DatagramSocket 繫結埠號
DatagramSocket ds = new DatagramSocket(6000);
//建立位元組陣列
byte[] data = new byte[1024];
//建立資料包物件,傳遞位元組陣列
DatagramPacket dp = new DatagramPacket(data, data.length);
//呼叫ds物件的方法receive傳遞資料包
ds.receive(dp);

    }
   }

10UDP接收端的拆包

*A:UDP接收端的拆包

  /*
   *  實現UDP接收端
   *    實現封裝資料包 java.net.DatagramPacket 將資料接收
   *    實現輸出傳輸     java.net.DatagramSocket 接收資料包
   *    
   *  實現步驟:
   *     1. 建立DatagramSocket物件,繫結埠號
   *         要和傳送端埠號一致
   *     2. 建立位元組陣列,接收發來的資料
   *     3. 建立資料包物件DatagramPacket
   *     4. 呼叫DatagramSocket物件方法
   *        receive(DatagramPacket dp)接收資料,資料放在資料包中
   *     5. 拆包
   *          傳送的IP地址
   *            資料包物件DatagramPacket方法getAddress()獲取的是傳送端的IP地址物件
   *            返回值是InetAddress物件
   *          接收到的位元組個數
   *            資料包物件DatagramPacket方法 getLength()
   *          傳送方的埠號
   *            資料包物件DatagramPacket方法 getPort()傳送埠
   *     6. 關閉資源
   */
  public class UDPReceive {
    public static void main(String[] args)throws IOException {
      //建立資料包傳輸物件DatagramSocket 繫結埠號
      DatagramSocket ds = new DatagramSocket(6000);
      //建立位元組陣列
      byte[] data = new byte[1024];
      //建立資料包物件,傳遞位元組陣列
      DatagramPacket dp = new DatagramPacket(data, data.length);
      //呼叫ds物件的方法receive傳遞資料包
      ds.receive(dp);

      //獲取傳送端的IP地址物件
      String ip=dp.getAddress().getHostAddress();

      //獲取傳送的埠號
      int port = dp.getPort();

      //獲取接收到的位元組個數
      int length = dp.getLength();
      System.out.println(new String(data,0,length)+"..."+ip+":"+port);
      ds.close();
    }
  }

11鍵盤輸入的聊天

*A:鍵盤輸入的聊天
*a:傳送端:
/*
* 實現UDP傳送,鍵盤輸入的形式
* 輸入完畢,傳送給接收端
*/
public class UDPSend {
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
InetAddress inet = InetAddress.getByName(“127.0.0.1”);
while(true){
String message = sc.nextLine();
/*if(“886”.equals(message)){
break;
}*/
byte[] date = message.getBytes();
DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000);
ds.send(dp);
}
// ds.close();
}
}

   /*
    *  實現UDP接收端
    *  永不停歇的接收端
    */
   public class UDPReceive {
    public static void main(String[] args)throws IOException {
      //建立資料包傳輸物件DatagramSocket 繫結埠號
      DatagramSocket ds = new DatagramSocket(6000);
      //建立位元組陣列
      byte[] data = new byte[1024];
      //建立資料包物件,傳遞位元組陣列
      while(true){
      DatagramPacket dp = new DatagramPacket(data, data.length);
      //呼叫ds物件的方法receive傳遞資料包
      ds.receive(dp);

      //獲取傳送端的IP地址物件
      String ip=dp.getAddress().getHostAddress();

      //獲取傳送的埠號
      int port = dp.getPort();

      //獲取接收到的位元組個數
      int length = dp.getLength();
      System.out.println(new String(data,0,length)+"..."+ip+":"+port);
      }
      //ds.close();
    }
   }

=======================第三節課======================================

12TCP的客戶端和伺服器

*A:TCP的客戶端和伺服器
TCP通訊同UDP通訊一樣,都能實現兩臺計算機之間的通訊,通訊的兩端都需要建立socket物件。
區別在於,UDP中只有傳送端和接收端,不區分客戶端與伺服器端,計算機之間可以任意地傳送資料。
而TCP通訊是嚴格區分客戶端與伺服器端的,在通訊時,必須先由客戶端去連線伺服器端才能實現通訊,
伺服器端不可以主動連線客戶端,並且伺服器端程式需要事先啟動,等待客戶端的連線。
在JDK中提供了兩個類用於實現TCP程式,一個是ServerSocket類,用於表示伺服器端,一個是Socket類,用於表示客戶端。
通訊時,首先建立代表伺服器端的ServerSocket物件,該物件相當於開啟一個服務,並等待客戶端的連線,然後建立代表客戶端的Socket物件向伺服器端發出連線請求,伺服器端響應請求,兩者建立連線開始通訊。

13TCP的客戶端程式

*A:TCP的客戶端程式
/*
* 實現TCP客戶端,連線到伺服器
* 和伺服器實現資料交換
* 實現TCP客戶端程式的類 java.net.Socket
*
* 構造方法:
* Socket(String host, int port) 傳遞伺服器IP和埠號
* 注意:構造方法只要執行,就會和伺服器進行連線,連線失敗,丟擲異常
*
* OutputStream getOutputStream() 返回套接字的輸出流
* 作用: 將資料輸出,輸出到伺服器
*
* InputStream getInputStream() 返回套接字的輸入流
* 作用: 從伺服器端讀取資料
*
* 客戶端伺服器資料交換,必須使用套接字物件Socket中的獲取的IO流,自己new流,不行
*/
public class TCPClient {
public static void main(String[] args)throws IOException {
//建立Socket物件,連線伺服器
Socket socket = new Socket(“127.0.0.1”, 8888);
//通過客戶端的套接字物件Socket方法,獲取位元組輸出流,將資料寫向伺服器
OutputStream out = socket.getOutputStream();
out.write(“伺服器OK”.getBytes());

  socket.close();
}

}

14TCP的伺服器程式accept方法

A:TCP的伺服器程式accept方法
/*
* 實現TCP伺服器程式
* 表示伺服器程式的類 java.net.ServerSocket
* 構造方法:
* ServerSocket(int port) 傳遞埠號
*
* 很重要的事情: 必須要獲得客戶端的套接字物件Socket
* Socket accept()
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8888);
//呼叫伺服器套接字物件中的方法accept() 獲取客戶端套接字物件
Socket socket = server.accept();
//通過客戶端套接字物件,socket獲取位元組輸入流,讀取的是客戶端傳送來的資料
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));

    socket.close();
    server.close();
  }
 }

15TCP的伺服器程式讀取客戶端資料

A:TCP的伺服器程式讀取客戶端資料

  /*
   *  實現TCP客戶端,連線到伺服器
   *  和伺服器實現資料交換
   *  實現TCP客戶端程式的類 java.net.Socket
   *  
   *  構造方法:
   *      Socket(String host, int port)  傳遞伺服器IP和埠號
   *      注意:構造方法只要執行,就會和伺服器進行連線,連線失敗,丟擲異常
   *      
   *    OutputStream  getOutputStream() 返回套接字的輸出流
   *      作用: 將資料輸出,輸出到伺服器
   *      
   *    InputStream getInputStream() 返回套接字的輸入流
   *      作用: 從伺服器端讀取資料
   *      
   *    客戶端伺服器資料交換,必須使用套接字物件Socket中的獲取的IO流,自己new流,不行
   */
  public class TCPClient {
    public static void main(String[] args)throws IOException {
      //建立Socket物件,連線伺服器
      Socket socket = new Socket("127.0.0.1", 8888);
      //通過客戶端的套接字物件Socket方法,獲取位元組輸出流,將資料寫向伺服器
      OutputStream out = socket.getOutputStream();
      out.write("伺服器OK".getBytes());
      socket.close();
    }
  }
  /*
   *  實現TCP伺服器程式
   *  表示伺服器程式的類 java.net.ServerSocket
   *  構造方法:
   *    ServerSocket(int port) 傳遞埠號
   *  
   *  很重要的事情: 必須要獲得客戶端的套接字物件Socket
   *    Socket  accept()
   */
  public class TCPServer {
    public static void main(String[] args) throws IOException{
      ServerSocket server = new ServerSocket(8888);
      //呼叫伺服器套接字物件中的方法accept() 獲取客戶端套接字物件
      Socket socket = server.accept();
      //通過客戶端套接字物件,socket獲取位元組輸入流,讀取的是客戶端傳送來的資料
      InputStream in = socket.getInputStream();
      byte[] data = new byte[1024];
      int len = in.read(data);
      System.out.println(new String(data,0,len));

    }
  }

16TCP的伺服器和客戶端的資料交換

A:TCP的伺服器和客戶端的資料交換
/*
* 實現TCP客戶端,連線到伺服器
* 和伺服器實現資料交換
* 實現TCP客戶端程式的類 java.net.Socket
*
* 構造方法:
* Socket(String host, int port) 傳遞伺服器IP和埠號
* 注意:構造方法只要執行,就會和伺服器進行連線,連線失敗,丟擲異常
*
* OutputStream getOutputStream() 返回套接字的輸出流
* 作用: 將資料輸出,輸出到伺服器
*
* InputStream getInputStream() 返回套接字的輸入流
* 作用: 從伺服器端讀取資料
*
* 客戶端伺服器資料交換,必須使用套接字物件Socket中的獲取的IO流,自己new流,不行
*/
public class TCPClient {
public static void main(String[] args)throws IOException {
//建立Socket物件,連線伺服器
Socket socket = new Socket(“127.0.0.1”, 8888);
//通過客戶端的套接字物件Socket方法,獲取位元組輸出流,將資料寫向伺服器
OutputStream out = socket.getOutputStream();
out.write(“伺服器OK”.getBytes());

      //讀取伺服器發回的資料,使用socket套接字物件中的位元組輸入流
      InputStream in = socket.getInputStream();
      byte[] data = new byte[1024];
      int len = in.read(data);
      System.out.println(new String(data,0,len));

      socket.close();
    }
  }
  /*
   *  實現TCP伺服器程式
   *  表示伺服器程式的類 java.net.ServerSocket
   *  構造方法:
   *    ServerSocket(int port) 傳遞埠號
   *  
   *  很重要的事情: 必須要獲得客戶端的套接字物件Socket
   *    Socket  accept()
   */
  public class TCPServer {
    public static void main(String[] args) throws IOException{
      ServerSocket server = new ServerSocket(8888);
      //呼叫伺服器套接字物件中的方法accept() 獲取客戶端套接字物件
      Socket socket = server.accept();
      //通過客戶端套接字物件,socket獲取位元組輸入流,讀取的是客戶端傳送來的資料
      InputStream in = socket.getInputStream();
      byte[] data = new byte[1024];
      int len = in.read(data);
      System.out.println(new String(data,0,len));

      //伺服器向客戶端回資料,位元組輸出流,通過客戶端套接字物件獲取位元組輸出流
      OutputStream out = socket.getOutputStream();
      out.write("收到,謝謝".getBytes());

      socket.close();
      server.close();
    }
  }

17TCP的中的流物件

*A:TCP的中的流物件
    參見圖解TCP中的流物件.jpg  

======================================第四節課=================================================

18TCP圖片上傳案例分析

*A:圖片上傳案例分析
     參見圖解TCP上傳圖片案例.jpg  

19TCP上傳客戶端

*A TCP上傳客戶端
/*
* 實現TCP圖片上傳客戶端
* 實現步驟:
* 1. Socket套接字連線伺服器
* 2. 通過Socket獲取位元組輸出流,寫圖片
* 3. 使用自己的流物件,讀取圖片資料來源
* FileInputStream
* 4. 讀取圖片,使用位元組輸出流,將圖片寫到伺服器
* 採用位元組陣列進行緩衝
* 5. 通過Socket套接字獲取位元組輸入流
* 讀取伺服器發回來的上傳成功
* 6. 關閉資源
*/
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket(“127.0.0.1”, 8000);
//獲取位元組輸出流,圖片寫到伺服器
OutputStream out = socket.getOutputStream();
//建立位元組輸入流,讀取本機上的資料來源圖片
FileInputStream fis = new FileInputStream(“c:\t.jpg”);
//開始讀寫位元組陣列
int len = 0 ;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
//給伺服器寫終止序列
//socket.shutdownOutput();

  //獲取位元組輸入流,讀取伺服器的上傳成功
  InputStream in = socket.getInputStream();

  len = in.read(bytes);
  System.out.println(new String(bytes,0,len));

  fis.close();
  socket.close();
}

}

20TCP上傳伺服器

A:TCP上傳伺服器
/*
* TCP圖片上傳伺服器
* 1. ServerSocket套接字物件,監聽埠8000
* 2. 方法accept()獲取客戶端的連線物件
* 3. 客戶端連線物件獲取位元組輸入流,讀取客戶端傳送圖片
* 4. 建立File物件,繫結上傳資料夾
* 判斷資料夾存在, 不存,在建立資料夾
* 5. 建立位元組輸出流,資料目的File物件所在資料夾
* 6. 位元組流讀取圖片,位元組流將圖片寫入到目的資料夾中
* 7. 將上傳成功會寫客戶端
* 8. 關閉資源
*
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();
//通過客戶端連線物件,獲取位元組輸入流,讀取客戶端圖片
InputStream in = socket.getInputStream();
//將目的資料夾封裝到File物件
File upload = new File(“d:\upload”);
if(!upload.exists())
upload.mkdirs();

  //建立位元組輸出流,將圖片寫入到目的資料夾中                         
  FileOutputStream fos = new FileOutputStream(upload+"t.jpg");
  //讀寫位元組陣列
  byte[] bytes = new byte[1024];
  int len = 0 ;
  while((len = in.read(bytes))!=-1){
    fos.write(bytes, 0, len);
  }
  //通過客戶端連線物件獲取位元組輸出流
  //上傳成功寫回客戶端
  socket.getOutputStream().write("上傳成功".getBytes());

  fos.close();
  socket.close();
  server.close();
}

}

21TCP圖片上傳問題解決

/*
* 實現TCP圖片上傳客戶端
* 實現步驟:
* 1. Socket套接字連線伺服器
* 2. 通過Socket獲取位元組輸出流,寫圖片
* 3. 使用自己的流物件,讀取圖片資料來源
* FileInputStream
* 4. 讀取圖片,使用位元組輸出流,將圖片寫到伺服器
* 採用位元組陣列進行緩衝
* 5. 通過Socket套接字獲取位元組輸入流
* 讀取伺服器發回來的上傳成功
* 6. 關閉資源
*/
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket(“127.0.0.1”, 8000);
//獲取位元組輸出流,圖片寫到伺服器
OutputStream out = socket.getOutputStream();
//建立位元組輸入流,讀取本機上的資料來源圖片
FileInputStream fis = new FileInputStream(“c:\t.jpg”);
//開始讀寫位元組陣列
int len = 0 ;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
//給伺服器寫終止序列
socket.shutdownOutput();//想服務端寫入一個結束標誌

//獲取位元組輸入流,讀取伺服器的上傳成功
InputStream in = socket.getInputStream();

len = in.read(bytes);
System.out.println(new String(bytes,0,len));

fis.close();
socket.close();

}
}

TCP上傳檔名

*A:TCP上傳檔名
/*
* TCP圖片上傳伺服器
* 1. ServerSocket套接字物件,監聽埠8000
* 2. 方法accept()獲取客戶端的連線物件
* 3. 客戶端連線物件獲取位元組輸入流,讀取客戶端傳送圖片
* 4. 建立File物件,繫結上傳資料夾
* 判斷資料夾存在, 不存,在建立資料夾
* 5. 建立位元組輸出流,資料目的File物件所在資料夾
* 6. 位元組流讀取圖片,位元組流將圖片寫入到目的資料夾中
* 7. 將上傳成功會寫客戶端
* 8. 關閉資源
*
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();
//通過客戶端連線物件,獲取位元組輸入流,讀取客戶端圖片
InputStream in = socket.getInputStream();
//將目的資料夾封裝到File物件
File upload = new File(“d:\upload”);
if(!upload.exists())
upload.mkdirs();

  //防止檔案同名被覆蓋,從新定義檔名字
  //規則:  域名+毫秒值+6位隨機數
  String filename="itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
  //建立位元組輸出流,將圖片寫入到目的資料夾中                         
  FileOutputStream fos = new FileOutputStream(upload+File.separator+filename);
  //讀寫位元組陣列
  byte[] bytes = new byte[1024];
  int len = 0 ;
  while((len = in.read(bytes))!=-1){
    fos.write(bytes, 0, len);
  }
  //通過客戶端連線物件獲取位元組輸出流
  //上傳成功寫回客戶端
  socket.getOutputStream().write("上傳成功".getBytes());

  fos.close();
  socket.close();
  server.close();
}

}

多執行緒上傳案例

*A:多執行緒上傳案例
public class TCPThreadServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8000);
while (true) {
// 獲取到一個客戶端,必須開啟新執行緒,為這個客戶端服務
Socket socket = server.accept();
new Thread(new Upload(socket)).start();
}
}
}

public class Upload implements Runnable {

private Socket socket;

public Upload(Socket socket) {
  this.socket = socket;
}

public void run() {
  try {
    // 通過客戶端連線物件,獲取位元組輸入流,讀取客戶端圖片
    InputStream in = socket.getInputStream();
    // 將目的資料夾封裝到File物件
    File upload = new File("d:\\upload");
    if (!upload.exists())
      upload.mkdirs();

    // 防止檔案同名被覆蓋,從新定義檔名字
    // 規則: 域名+毫秒值+6位隨機數
    String filename = "itcast" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";
    // 建立位元組輸出流,將圖片寫入到目的資料夾中
    FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
    // 讀寫位元組陣列
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = in.read(bytes)) != -1) {
      fos.write(bytes, 0, len);
    }
    // 通過客戶端連線物件獲取位元組輸出流
    // 上傳成功寫回客戶端
    socket.getOutputStream().write("上傳成功".getBytes());

    fos.close();
    socket.close();
  } catch (Exception ex) {

  }
}

}

相關推薦

JAVA網路協議,UDP,TCP案例分析筆記總結

今日內容介紹 1、網路三要素及傳輸協議 2、實現UDP協議的傳送端和接收端 3、實現TCP協議的客戶端和伺服器 4、TCP上傳檔案案例 今日內容總結 5.1知識點總結 IP地址:用來唯一表示我們自己的電腦的,是一個網路標示 埠號: 用來區別當

網路協議TCPUDP

    應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分割成適當長度的報文段(通常受該計算機連線的網路的資料鏈路層的最大傳送單元(MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層

27 網路通訊協議 udp tcp

四 網路通訊協議(網際網路協議) 第二天再講這裡,大家第二天再看這裡把~~~ 網路通訊協議是網路傳輸的靈魂,非常重要,協議即準則,準則是傳輸訊息的格式要求,那麼我們從電腦上發出一個訊息,到底是以什麼樣的訊息格式發到了對方的手上呢,來看一看這裡>>>,網路通訊協議 &

JAVA 網路程式設計UDP TCP

UDP協議   UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。簡單來說,當一臺計算機向另外一臺計算機發送資料時,傳送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向傳送端反饋是否收到資料UDP的交換過程如下圖所示。 優

java程式碼,如何獲取請求 網路協議、IP、埠號、專案根路徑

pubulic static String getRequestPrefix(HttpServletRequest request){           //獲取網路協議            String networkProtocol = request.getSche

網路協議TCP的四大定時器

    前言     對於每個TCP連線,TCP一般要管理4個不同的定時器:重傳定時器、堅持定時器、保活定時器、2MSL定時器。    重傳定時器     很明顯重傳定時器是用來計算TCP報文段的超時重

網路協議TCP分段與UDP/IP分片 (MTU最大傳輸單元,MSS最大分段大小)

 我們在學習TCP/IP協議時都知道,TCP報文段如果很長的話,會在傳送時發生分段,在接受時進行重組,同樣IP資料報在長度超過一定值時也會發生分片,在接收端再將分片重組。     我們先來看兩個與TCP報文段分段和IP資料報分片密切相關的概念。     MTU(最大傳

網路協議TCP協議和UDP協議

網路協議:1、網路協議分層:    OSI模型是國際標準化組織ISO創立的。這是一個理論模型,並無實際產品完全符合OSI模型。制定OSI模型只是為了分析網路通訊方便而引進的一套理論。也為以後制定實用協議或產品打下基礎。    OSI模型總共分7層,各層的作用:從上到下    

網路協議TCP/IP 和UDP/IP 、滑動視窗

TCP TCP/IP(Transmission Control Protocol/Internet Protocol)是一種可靠的網路資料傳輸控制協議。定義了主機如何連入因特網以及資料如何在他們之間傳

java請給出TCP的ServerSocket通信的例子?

ava throws sim clas servers server ali sys lose 2.TCP協議的通信實例 馬克-to-win:(視頻下載) (全部書籍)我們首先給出一個最最簡單的helloworld通信程序。讓大家體會一把兩臺機器的通信,大家之後就

javaFuture與FutureTask使用與分析

strac 構造 沒有 設置 就是 wap 什麽 其中 實例化 Future與FutureTask都是用於獲取線程執行的返回結果。下面我們就對兩者之間的關系與使用進行一個大致的介紹與分析 一、Future與FutureTask介紹: Future位於java.util.co

網路協議 8 - TCP協議(上):性惡就要套路深

系列文章: 網路協議 1 - 概述 網路協議 2 - IP 是怎麼來,又是怎麼沒的? 網路協議 3 - 從物理層到 MAC 層 網路協議 4 - 交換機與 VLAN:辦公室太複雜,我要回學校 網路協議 5 - ICMP 與 ping:投石問路的偵察兵 網路協議 6 - 路由協議:敢

Javaspring boot2整合ES案例詳解

一:執行環境 JDK:1.8 ES:5.6.4 二:學習內容 如何構建spring-data-elasticsearch環境? 如何實現常用的增刪改查? 如何實現物件巢狀也就是1對多這種關係? 三:JAVA依賴環境 根據spring-data-elasticsearch官網說明,我這採用的

趣談網路協議---UDP協議:因性善而簡單,難免碰到“城會玩”

TCP 和 UDP 有哪些區別? TCP是面向連線的,UDP是面向無連線的。 所謂的建立連線,是為了在客戶端和服務端維護連線,而建立一定的資料結構來維護雙方互動的狀態,用這樣的資料結構來保證所謂的面向連線的特性。 例如: TCP提供可靠交付。通過TCP連線傳輸

後端---JavaIterator(迭代器)原理分析

Java中Iterator(迭代器)的用法及其背後機制的探究 一.背景延伸  在Java中遍歷List時會用到Java提供的Iterator,Iterator十分好用,原因是: 迭代器是一種設計模式,它是一個物件,它可以遍歷並選擇序列中的物件,而開發人員不需要了解該序列的底層結

java多型的經典問題分析

Question package demo; /** * Created by zwj on 2016/3/26. */ class A { public String show(D obj) { return ("A a

Java網路IO的實現方式-BIO、NIO、AIO

在網路程式設計中,接觸到最多的就是利用Socket進行網路通訊開發。在Java中主要是以下三種實現方式BIO、NIO、AIO。 關於這三個概念的辨析以前一直都是好像懂,但是表達的不是很清楚,下面做個總結完全辨析清楚。 1. BIO方式

matlab安裝軟體 Matlab視訊教程李大勇 MATLAB程式開發入門課程 MATLAB神經網路30個案例分析源程式

數學建模10大演算法詳解_程式原始碼打包 matlab安裝軟體  Matlab視訊教程李大勇 MATLAB程式開發入門課程 MATLAB神經網路30個案例分析及源程式 百度雲連結  http://download.csdn.net/download/wocao1226/10

Linux 核心網路協議棧 ------ tcp重傳資料包 tcp_retransmit_skb 函式

/* This retransmits one SKB. Policy decisions and retransmit queue * state updates are done by the caller. Returns non-zero if an

JavaAtomic包的原理和分析

原文地址:http://blog.csdn.net/zhangerqing/article/details/43057799 Atomic簡介 Atomic包是Java.util.concurrent下的另一個專門為執行緒安全設計的Java包,包含多個原子操作類。這個