天天看點

【JavaSE】網絡程式設計---UDP丶TCP

文章目錄

      • 一.UDP
        • 1.常用方法
          • InetAddress
          • DatagramPacket
          • DatagramSocket
        • 2.接收方
        • 3.發送方
      • 二.TCP
        • 1.常用方法
          • Socket
          • ServerSocket
        • 2.伺服器端
        • 3.用戶端

一.UDP

UDP:面向無連接配接通信(發送端不需接收端确認是否能接收),資料不安全,效率高

1.常用方法

InetAddress
  • static InetAddress getLocalHost()

    擷取本地主機
  • static InetAddress getByName(String host)

    根據域名或IP擷取主機
  • String getHostName()

    擷取主機名
  • String getHostAddress()

    擷取IP位址
DatagramPacket
  • DatagramPacket(byte[] buf, int length)

    構造緩沖區接收讀取指定長度的資料包
  • int getLength()

    擷取接收的資料包的大小
  • InetAddress getAddress()

    擷取發送方的IP位址
  • int getPort()

    擷取發送方的端口号
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port)

    構造發送的資料包,并設定接受者的IP位址和端口
DatagramSocket
  • DatagramSocket()

    空構造
  • DatagramSocket(int port)

    建立指定接受者端口的套接字對象
  • void send(DatagramPacket p)

    發送資料包
  • void receive(DatagramPacket p)

    接收資料包
  • void close()

    關閉套接字

2.接收方

/* 測試時應先啟動接收方,再啟動發送方 */

	//用于接收資料的緩沖區
	byte[] data=new byte[1024];
	
	//建立資料包對象
	DatagramPacket dp=new DatagramPacket(data, data.length);
	
	//建立套接字對象,設定接收方端口為3000
	DatagramSocket ds=new DatagramSocket(3000);
	
	//接收資料包
	ds.receive(dp);
	
	//擷取發送者的IP位址
	String senderIP=dp.getAddress().getHostAddress();
	
	//擷取發送者的端口号
	int senderPort=dp.getPort();
	
	//擷取資料包的大小
	int length=dp.getLength();

	System.out.println(senderIP+":"+senderPort+"..."+new String(data,0,length));
	
	//關閉資源
	ds.close();
           

3.發送方

String msg="你好";
	byte[] data=msg.getBytes();
	
	//接收者IP位址
	InetAddress receiverIP=InetAddress.getByName("127.0.0.1");
	
	//接收者端口号
	int receiverPort=3000;
	
	//建立資料包
	DatagramPacket dp=new DatagramPacket(data, data.length,receiverIP,receiverPort);
	
	//建立套接字對象
	DatagramSocket ds=new DatagramSocket();
	
	//發送資料包
	ds.send(dp);
	
	//關閉資源
	ds.close();
           

二.TCP

TCP:面向有連接配接通信,三次握手,資料安全,效率較低,區分用戶端與伺服器端

1.常用方法

Socket
  • Socket(String host, int port)

    建立用戶端的套接字對象,并設定需要通路的伺服器的IP和端口
  • OutputStream getOutputStream()

    擷取輸出流,用于用戶端發送資料或伺服器端響應資料
  • InputStream getInputStream()

    擷取輸入流,用于讀取用戶端發送的資料或伺服器端響應的資料

    -

    void close()

    關閉套接字
ServerSocket
  • ServerSocket(int port)

    建立伺服器端的套接字對象,并綁定端口号
  • Socket accept()

    監聽并接受用戶端的套接字
  • void close()

    關閉套接字

2.伺服器端

//建立伺服器端的套接字對象,并綁定端口号
	ServerSocket server=new ServerSocket(4000);
	
	//監聽并接受用戶端的套接字
	Socket socket= server.accept();
	
	//擷取用戶端發送資料的輸入流
	InputStream in=socket.getInputStream();
	
	byte[] data=new byte[1024];
	
	//讀取用戶端發送的資料
	int len=in.read(data);
	String msg=new String(data,0,len);
	System.out.println(msg);
	if(msg.equals("我要登入")){
		//擷取伺服器端響應給用戶端的輸出流
		OutputStream out=socket.getOutputStream();
		//輸出資料到用戶端
		out.write("登入成功".getBytes());
	}
	
	//關閉資源
	socket.close();
	server.close();
           

3.用戶端

//建立用戶端的套接字對象,并設定需要通路的伺服器的IP和端口
	Socket socket=new Socket("127.0.0.1", 4000);
	
	//擷取發送資料到伺服器端的輸出流
	OutputStream out= socket.getOutputStream();
	
	//發送資料到伺服器端
	out.write("我要登入".getBytes());
	
	//擷取伺服器端響應傳回資料的輸入流
	InputStream in=socket.getInputStream();
	byte[] data=new byte[1024];
	
	//讀取伺服器端傳回的資料
	int len=in.read(data);
	
	System.out.println(new String(data,0,len));
	
	//關閉資源
	socket.close();
           

繼續閱讀