黑馬程序員-java基礎-網絡編程

-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!--------------------------

網絡編程

1、網絡即兩臺電腦進行通訊。
2、端口
第一,數據要發送到對方指定的應用程序上。爲了表示這些應用程序,所以給這些網絡應用程序都用數字進行標識
爲了方便稱呼這個數字,叫做端口。
第二,邏輯端口和物理端口之分:邏輯端口是看不見摸不着的,而物理端口是看的見摸的着的。
第三,端口的劃分
端口的數字0——65535任選
端口0——1024一般被系統的端口所保留
web服務的端口是80
數據庫的端口是3306
3、127.0.0.1本地迴環地址
如果本地機器上沒有配置任何IP地址,那麼這個地址就是默認127.0.0.1 localhost
192 168 是最常用的保留地址段
4、網絡模型:
網絡模型
OSI參考模型,開放式網絡
應用層
表示層
會話層
傳輸層
網絡層
數據鏈路層
物理層

TCP/IP
應用層
傳輸層
網際層
主機至網絡層
5.網絡模型各個層最常用的協議即通訊規則
網絡層最常用的協議時TCP和UDP
傳輸層最常用的協議是IP
應用層基於傳輸層協議是http ftp
---------------------------------------------------------------------------------------------
網絡層協議:TCP和UDP的特點
TCP

特點:
第一,建立連接,形成傳輸數據的通道
第二,在連接中進行大數據量傳輸
第三,通過三次握手完成連接,是可靠協議
第四,必須建立連接,效率會稍低
UDP
特點:
第一,將數據及源和目的封裝成數據包,不需要建立連接
第二,每個數據包的大小限制在64kb內,超過64kb 會封裝成多個包去發
第三,因爲無連接,是不可靠協議
第四,不需要建立連接,速度快
網絡服務的機制
第一,Socket就是爲網絡服務提供的一種機制
第二,通信的兩端都有Socket
第三,網絡通信其實就是Socket間的通信
第四,數據在兩個Socket間通過IO傳輸。
------------------------------------------------------------------------
UDP
分發送端和接收端
1
、建立UDP發送端併發送數據
步驟:
第一,建立updsocket服務。通過DatagramSocket對象
第二,提供數據,並將數據封裝到數據包中。通過DatagramPacket對象
第三,通過socket服務的發送功能,將數據包發出去。通過方法send(包名)
第四,關閉資源。close()
2、建立UDP接收端
步驟:
第一,定義udpsocket服務。通常會監聽一個端口。其實就是給這個接收網絡應用程序定義數字標識。
方便於明確哪些數據過來該應用程序可以處理。通過對象DatagramSocket
第二,定義一個數據包,因爲要存儲接收到的字節數據。DatagramPacket
因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息。
第三,通過socket服務的receive方法將收到的數據存入已定義好的數據包中。receive
第四,通過數據包對象的特有功能。將這些不同的數據取出。打印在控制檯上。
第五,關閉資源。

代碼:

//定義發送端
	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();
			DatagramPacket dp = 
				new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
			//3,通過socket服務,將已有的數據包發送出去。通過send方法。
			ds.send(dp);
			//4,關閉資源。
			ds.close();
		}
	}
	//定義一個應用程序,用於接收udp協議傳輸的數據並處理的。
	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);
			//3,通過服務的receive方法將收到數據存入數據包中。
			ds.receive(dp);//阻塞式方法。
			//4,通過數據包的方法獲取其中的數據。
			String ip = dp.getAddress().getHostAddress();//獲取發送端的IP
			String data = new String(dp.getData(),0,dp.getLength());//獲取數據
			int port = dp.getPort();
			System.out.println(ip+"::"+data+"::"+port);
			}
			//5,關閉資源
		ds.close();
		}
	}
-------------------------------------------------------------------------------------
TCP
1
、分客戶端和服務端,注意和UDP的區別
客戶端對應的對象是Socket。
服務端對應的對象是ServerSocket。
2、客戶端
客戶端,
通過查閱socket對象,發現在該對象建立時,就可以去連接指定主機。
因爲tcp是面向連接的。所以在建立socket服務時,
就要有服務端存在,並連接成功。形成通路後,在該通道進行數據的傳輸。
需求:給服務端發送給一個文本數據。
步驟:
1,創建Socket服務。並指定要連接的主機和端口。
2、獲取socket流中的輸出流
3,通過方法write()向流中寫入數據

import java.io.*;
import java.net.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception 
	{
		//創建客戶端的socket服務。指定目的主機和端口
		Socket s = new Socket("192.168.1.254",10003);
		//爲了發送數據,應該獲取socket流中的輸出流。
		OutputStream out = s.getOutputStream();
		out.write("tcp ge men lai le ".getBytes());
		s.close();
	}
}
3、接收端
步驟:
第一,建立服務端的socket服務。ServerSocket();
並監聽一個端口。
第二,獲取連接過來的客戶端對象。
通過ServerSokcet的 accept方法。沒有連接就會等,所以這個方法阻塞式的。
第三,客戶端如果發過來數據,那麼服務端要使用對應的客戶端對象,並獲取到該客戶端對象的
讀取流來讀取發過來的數據。並打印在控制檯。
第四,關閉服務端。(可選)

class  TcpServer
{
	public static void main(String[] args) throws Exception
	{
		//建立服務端socket服務。並監聽一個端口。
		ServerSocket ss = new ServerSocket(10003);
		//通過accept方法獲取連接過來的客戶端對象。
		while(true)
		{
		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));
		s.close();//關閉客戶端.
		}
		//ss.close();
	}
}		
--------------------------------------------------------------------------------
總結
綜上可以看出,用到網絡的地方就會用到IO流,所以在使用網絡時,要想到用IO流來進行操作。
綜合運用:
需求:演示tcp的傳輸的客戶端和服務端的互訪。
客戶端給服務端發送數據,服務端收到後,給客戶端反饋信息。
分析:
客戶端:
1,建立socket服務。指定要連接主機和端口。
2,獲取socket流中的輸出流。將數據寫到該流中。通過網絡發送給服務端。
3,獲取socket流中的輸入流,將服務端反饋的數據獲取到,並打印。
4,關閉客戶端資源。
服務器端
1,建立服務端的socket服務。ServerSocket();
並監聽一個端口。
2,獲取連接過來的客戶端對象。
通過ServerSokcet的 accept方法。沒有連接就會等,所以這個方法阻塞式的。
3,客戶端如果發過來數據,那麼服務端要使用對應的客戶端對象,並獲取到該客戶端對象的
讀取流來讀取發過來的數據。並打印在控制檯。
4、獲取客戶端對象的輸出流,給客戶端反饋信息。
4,關閉服務端。(可選)
代碼:

//定義客戶端
	class TcpClient
	{
		public static void main(String[] args)throws Exception 
		{
			//建立socket服務。指定要連接主機和端口。
			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();
		}
	}
	//定義服務器端
	class TcpServer
	{
		public static void main(String[] args) throws Exception
		{
			//建立服務端的socket服務。ServerSocket(); 並監聽一個端口。
			ServerSocket ss = new ServerSocket(10004);
			//獲取連接過來的客戶端對象。通過ServerSokcet的 accept方法。
			Socket s = ss.accept();
			//打印此連接進來的客戶端IP
			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();
			out.write("哥們收到,你也好".getBytes());
			s.close();
			ss.close();
		}
	}


-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!--------------------------


詳情請查看:http://edu.csdn.net



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