天天看點

網絡程式設計網絡程式設計:基于TCP網絡程式設計:基于UDP網絡程式設計UDP接收資訊循環接收資訊TCP循環接收資訊

網絡程式設計:

網絡: 
網絡的分類:
	 廣域網  城域網  區域網路
網絡層: IP協定
傳輸層: TCP/UDP協定
應用層: http


TCP 長連接配接   http短連接配接

TCP: 面向連接配接 ,可靠的傳輸層協定, 傳輸資料的大小無限制,不安全
UDP: 面向無連接配接的, 不可靠的傳輸層協定, 傳輸資料的大小是不能超過64kb, 安全

IP: 給網絡中每一台裝置,設定的唯一辨別
	255.255.255.255    4個位元組   32 位
           

基于TCP網絡程式設計:

用戶端(發送,接受回複)      服務端(接受和回複)
	    Socket                ServerSocekt
	 基于位元組流實作的  寫socket.getOutputStream
	 			  讀:socket.getInputStream
	 	                       
	 	                       accept() 接受用戶端,有阻塞功能
	 	                       		
	
	  1.建立Socket對象		1.建立ServerSocket對象
	  2. 準備資料				2. accept() 接受用戶端
	  3. 擷取輸出流			3. 擷取輸入流對象
	  4. 将資料通過輸出發送出去      4. 讀取資料
	  5. 關閉流和socket		5. 關閉流和socket
           

基于UDP網絡程式設計

發送方							接受方
	DatagramSocket         			DatagramSocket  
    DatagramPacket        			 DatagramPacket
    
    
    1. DatagramSocket不需要添加參數      1. DatagramSocket(端口号)
    2. DatagramPacket 5個參數		   2. receive() 接受,需要準備一個空包裹
    3. socket.send(packet)		    	3. 通過packet.getData(). getOffset()  getLength
    4. 關閉socket				 	  4. 閉關socket
           

UDP

接收資訊

Recieve

1. 接收方的快遞點
 2. 接受
 3. 從倉庫中讀取資料
 3. 關閉socket
	注意: 
	 發送方的端口号是預設提供的, 與接收方法的端口号一定不同
  	 回複資料的時候 一定要用  p.getPort()
           
public class Recieve {
	public static void main(String[] args) throws IOException {
		System.out.println("接收方啟動了");
		// 接收方 需要設定端口号
		DatagramSocket socket = new DatagramSocket(7777);
		
		// 2. 接受   提前準備好一個空倉庫
		byte[] bs = new byte[1024];
		DatagramPacket packet = new DatagramPacket(bs,bs.length);// 能裝資料, 
		
		// 接受資料  如果一直沒等到發送方的資料, receive方法阻塞  , 類似于TCP 中的 accept
		socket.receive(packet);
		
		
		String str = new String(packet.getData(),packet.getOffset(),packet.getLength());
		
		System.out.println("發送方發送過來的資料:"+str);
		
		
		System.out.println(packet.getAddress());
		System.out.println(packet.getPort());
		//   以下就是回複
		DatagramPacket p = new DatagramPacket("不開心".getBytes(), 0, "不開心".getBytes().length, packet.getAddress(), packet.getPort());
		socket.send(p);
		
		//3. 關閉socket
		socket.close();
	}
}
           

Send

.  發送方法
 	  快遞點
      要發送的資料
      将資料打包
      發送
      關閉
           
public class Send {
	public static void main(String[] args) throws IOException {
		// 快遞點
		DatagramSocket socket = new DatagramSocket();
		//要發送的資料
		String str = "開心";
		//将資料打包
		DatagramPacket packet = new DatagramPacket(str.getBytes(), 0, str.getBytes().length, InetAddress.getByName("127.0.0.1"), 7777);
		//  發送
		socket.send(packet);
		
		// 以下是接收
		byte[] bs = new byte[1024];
		DatagramPacket p = new DatagramPacket(bs,bs.length);
		socket.receive(p);
		
		String str2 = new String(p.getData(),p.getOffset(),p.getLength());
		System.out.println("接收方回複數:"+str2);
		
		//關閉
		socket.close();
	}
}
           

循環接收資訊

Recieve

public class Recieve {
	public static void main(String[] args) throws IOException {
		System.out.println("====接收方啟動====");
		// 1.建立快遞點  套接字對象  接收方 快遞點需要添加端口号
		DatagramSocket socket = new DatagramSocket(5858);
		Scanner sc = new Scanner(System.in);
		// 2.接收
		byte[] bs = new byte[1024];
		
		while(true) {
			// 自己準備一個空包裹,将接收到的資料裝起來
			DatagramPacket packet = new DatagramPacket(bs, bs.length);
			// 在接收到發送方發送過來的資料之前一直阻塞
			socket.receive(packet); // 阻塞程式向下執行的
			
			// 3.使用的資料都在packet中,從這裡面取
			// packet.getData()代表發送過來的資料數組
			String str = new String(packet.getData(),0,packet.getLength());
			System.out.println("發送方發送過來的資料:"+str);
			if(str.equals("再見")) {
				break;
			}
			
			// 準備回複
			String str2 = sc.next();
			DatagramPacket packet2 = new DatagramPacket(str2.getBytes(),str2.getBytes().length,packet.getAddress(),packet.getPort());
			socket.send(packet2);
			if(str2.equals("再見")) {
				break;
			}
		}
		socket.close();
	}
}
           

Send

public class Send {
	public static void main(String[] args) throws IOException {
		System.out.println("====發送方啟動=====");
		// 1. 建立套接字, 也就是快遞點對象
		DatagramSocket socket = new DatagramSocket();
		Scanner sc = new Scanner(System.in);
		// 2 建立一個快遞點對象
		while (true) {
			String str = sc.next(); // 是位元組數組的長度
			DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length,
					InetAddress.getByName("127.0.0.1"), 5858);

			// 3. 發送
			socket.send(packet);
			if(str.equals("再見")) {
				break;
			}
			
			// 接收
			byte[] bs = new byte[1024];
			DatagramPacket packet2 = new DatagramPacket(bs, bs.length);
			socket.receive(packet2); // receive就會将發送過來的資料放到了空包裹中
			String str2 = new String(packet2.getData(), 0, packet2.getLength());
			System.out.println("接收方回複資料" + str2);
			if (str2.equals("再見")) {
				break;
			}
		}

		socket.close();
	}
}
           

TCP

循環接收資訊

Client

public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("192.168.43.132",7777);
		OutputStream os = socket.getOutputStream();
		InputStream is = socket.getInputStream();
		
		// 先發送
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("請輸入要發送給服務端的資訊");
			String str = sc.next();
			os.write(str.getBytes());
			os.flush();
			
			// 後接收用資料流
			byte[] bs = new byte[1024];
			int num = is.read(bs);
			String str2 = new String(bs,0,num);
			System.out.println("服務端給的回複:"+str2);
		}
	}

}

           

Server

public class Server {
	public static void main(String[] args) throws IOException {
		System.out.println("服務端啟動了");
		ServerSocket serversocket = new ServerSocket(7777);
		Socket accept = serversocket.accept();// 服務端接收用戶端消息
		// accept 等着用戶端發送資訊,如果用戶端一直沒有發送,就阻塞線程向下執行
		// 先接受
		InputStream is = accept.getInputStream();
		OutputStream os = accept.getOutputStream();
		
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			byte[] bs = new byte[1024];
			int num = is.read(bs);
			String str = new String(bs,0,num);
			System.out.println("用戶端發送過來的資訊是:"+str);
			
			// 後發送
			System.out.println("請輸入給用戶端的回複");
			String str2 = sc.next();
			os.write(str2.getBytes());
			os.flush();
		}
		
		// 關閉流和socket
		//os.close();
		//is.close();
		//accept.close();
		//serverSocket.close();
	}
}