-------------------------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培訓、期待與您交流!--------------------------