網絡編程


這次來簡單討論一下網絡編程有關的東西:


網絡編程三要素+UDP協議講解


1.網絡通信介紹

2.tcp/ip

3.udp/ip



Socket通信

 網絡編程三要素:

ip:一個計算的標示(找到這個計算機)

端口:應用程序都會對應一個端口,用來進行通信,有效端口:0~65535,其中0~1024系統使用或保留端口(360查看端口)。

協議:總共有2種協議(TCP,UDP)


三要素詳解:

特殊的IP地址:

127.0.0.1 本地迴環地址 用來做一些本地測試

ping IP地址 ; 用來檢測本機是否可以和指定的IP地址的計算機可以進行正常通訊

ipconfig     用來查看IP地址

xxx.xxx.xxx.255 廣播地址

端口號:


物理端口 物理設備對應的端口 , 網卡口

邏輯端口 用來標示我們的計算機上的進程 , 端口號的有效範圍應該是 0-65535 ,

其中0-1024被系統佔用或者保留

協議:


UDP

把數據打成一個數據包 , 不需要建立連接

數據包的大小有限制不能超過64k

因爲無連接,所以屬於不可靠協議(可能丟失數據)

因爲無連接 ,所以效率高

TCP

需要建立連接,形成連接通道

數據可以使用連接通道直接進行傳輸,無大小限制

因爲有鏈接,所以屬於可靠協議

因爲有鏈接,所以效率低


1.4 (InetAddress)

   InetAddress:IP地址的描述類

  

InetAddress類的概述

爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用

此類表示互聯網協議 (IP) 地址。 

InetAddress類的常見功能

public static InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)

public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。

public String getHostName()獲取此 IP 地址的主機名。 


案例演示: InetAddress類的常見功能

public class InetAddressDemo {
public static void main(String[] args) throws Exception {
//通過主機ip獲取InetAddress對象
InetAddress address = InetAddress.getByName("192.168.20.25");
//public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。
System.out.println(address.getHostAddress());
//public String getHostName()獲取此 IP 地址的主機名。 
System.out.println(address.getHostName());
}
}

 

(也叫socket編程,套接字編程,網絡編程,叫法不一樣都是一個東西)  

 Socket套接字:(利用qq聊天的案例畫圖進行講解)

網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。

Socket原理機制:

通信的兩端都有Socket。

網絡通信其實就是Socket間的通信。

數據在兩個Socket間通過IO傳輸。

分協議進行講解網絡編程

 UDP協議:(寫一個標準demo)

    特點:1.把數據打包

 2.不需要建立連接,也稱爲面向無連接協議

 3.數據需打包,數據大小有限制64k

 4.無需建立連接,所以不可靠

 5.速度快

 

 UDP通信步驟:

發送端步驟:

 UDP發送數據的步驟:

 A:創建UDP發送數據端Socket對象

 B:創建數據包,並給出數據,把數據打包

 C:通過Socket對象發送數據包 

 D:釋放資源

 

 

接收端步驟:

 UDP協議接收數據步驟:

 A:創建UDP接收數據端Socket對象

 B:創建一個接收數據的數據包

 C:接收數據,數據在數據包中

 D:解析數據包,並把數據顯示在控制檯

 E:釋放資源

下面實現一些需求:


鍵盤錄入數據實現數據的動態發送

public class UdpClient {
public static void main(String[] args) throws Exception {
//1.創建發送端的socket對象
DatagramSocket ds = new DatagramSocket();
InetAddress address = InetAddress.getByName("192.168.20.254");
int port = 9999;
//2.創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
String line;
while ((line=sc.nextLine())!=null) {
//鍵盤錄入的數據line
byte[] buf = line.getBytes();
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length, address, port);
//發送數據包
ds.send(dp);
}
//釋放資源
ds.close();
}
}
public class UdpServer {
public static void main(String[] args) throws Exception {
//創建接收端的socket對象
DatagramSocket ds = new DatagramSocket(9999);
//接受來自客戶端的數據
while (true) {
//創建數據包
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length);
//接受來自客戶端的數據
ds.receive(dp);
//解析數據包中的數據
byte[] data = dp.getData();
int len = dp.getLength();
System.out.println(new String(data, 0, len));
}
}
}

多線程實現聊天室(相當於是將發送數據端和接收數據端合併)

詳見第十八天網絡編程,com.edu_05


二:TCP協議要點

2.1  

* TCP協議:(寫一個demo)
特點:1.需要建立通道
  2.傳送大量數據無限制
  3.面向連接
  4.可靠
  5.速度慢
  TCp協議書寫步驟:
  發送端:
  /*
 * TCP協議發送數據步驟:
 * A:創建TCP協議發送端Socket對象
 * 指定服務器IP及端口
 Socket sk = new Socket("192.168.3.120" , 9527) ;
 * B:獲取輸出流,並寫數據
 OutputStream outputStream = sk.getOutputStream() ;
 outputStream.write("hello,TCP我來了".getBytes()) ;
 * C:釋放資源
 sk.close() ;
 * 
 * java.net.ConnectException: Connection refused: connect
 * TCP協議是不能直接運行客戶端的,必須先運行服務器。因爲他是一種可靠的協議。
 */
 
 接收端:
 /*
 * TCP協議接收數據步驟:
 * A:創建TCP協議接收端Socket對象
   ServerSocket ss = new ServerSocket(9527) ;
 * B:監聽客戶端連接
   Socket sk = ss.accept() ;
 * C:獲取輸入流,並讀取數據,顯示在控制檯
 // 讀取數據
byte[] bytes = new byte[1024] ;
int len = inputStream.read(bytes) ;
// public InetAddress getInetAddress()獲取IP地址
InetAddress inetAddress = sk.getInetAddress() ;
String ip = inetAddress.getHostAddress() ;
// 輸出
System.out.println(ip + "發來數據是: " + new String(bytes , 0 , len));
 * D:釋放資源
 sk.close() ;
 *

/

class


同樣,來實現一些需求  

用TCP協議寫一個數據的發送和接收,接收端接收到數據之後給發送端一個反饋

public class TcpClient {
public static void main(String[] args) throws Exception {
//創建tcp發送端的sockt對象
Socket sk = new Socket("192.168.20.254", 10000);
//從通道中獲取輸出流
OutputStream os = sk.getOutputStream();
//網通道中寫數據
os.write("今晚約嗎".getBytes());
//接受來自服務器端的反饋
InputStream is = sk.getInputStream();
//解析is
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
//釋放資源
sk.close();
}

public class TcpServer{

public static void main(String[] args) throws Exception {
//創建服務器端的socket對象
ServerSocket ss = new ServerSocket(10000);
//監聽來自客戶端的連接
Socket sk = ss.accept();
//從通道中獲取輸入流讀取數據
InputStream is = sk.getInputStream();
//解析is
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
//給客戶端一個反饋
OutputStream os = sk.getOutputStream();
os.write("不約".getBytes());
//釋放資源
sk.close();
}
}

需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出

public class TcpClient {
public static void main(String[] args) throws Exception {
//創建tcp發送端socket對象
Socket sk = new Socket("192.168.20.254", 20000);
//創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
String line;
while ((line=sc.nextLine())!=null) {
//將line這個數據寫如通道
OutputStream os = sk.getOutputStream();
os.write(line.getBytes());
}
sk.close();
}
}
public class TcpServer {
public static void main(String[] args) throws Exception {
//創建服務器端的socket對象
ServerSocket ss = new ServerSocket(20000);
//監聽來自客戶端的連接
Socket sk = ss.accept();
while (true) {
InputStream is = sk.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
}
}

需求:客戶端鍵盤錄入數據,服務端將數據寫入文件

與上邊的實現方式相同,不在多寫,只需講接收到的數據寫入文件即可。


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