什麼是網絡?
網絡就是講一些計算機連在一起,並且可以實現計算機與計算機之間的通信。
通常來說將網絡分爲:局域網,城域網和互聯網。
那麼在網絡中計算機之間是如何區分的呢或者說我們在使用計算機通信的時候怎麼才能知道指定的計算機呢?
此時就有一個IP地址標識一臺計算機,IP地址就好像是一個人的身份證一樣或者是一棟房子的地址,具有唯一性。
同時計算機裏面往往有多的進程,那麼計算機是如何區分這些進程的呢?
這個時候計算機就有一個端口編號,用來區分軟件的,大小是2個字節,從0-65535一共65536個,在1024以下的端口是計算機留給系統用的,比如所http的端口號就是80,建議不使用1024以下的端口。
URL:統一資源定位符URL,是用來表示資源在網絡中的位置,簡單來說就是指向網絡資源的指針。
數據的傳輸
TCP:TCP是傳輸控制協議的縮寫,它保障了兩個應用程序之間的可靠通信。通常用於互聯網協議,被稱TCP / IP。
UDP:UDP是用戶數據報協議的縮寫,一個無連接的協議。提供了應用程序之間要發送的數據的數據包。
TCP與UDP區別:
TCP特點:
1、TCP是面向連接的協議,通過三次握手建立連接,通訊完成時要拆除連接,由於TCP是面向連接協議,所以只能用於點對點的通訊。而且建立連接也需要消耗時間和開銷。
2、TCP傳輸數據無大小限制,進行大數據傳輸。
3、TCP是一個可靠的協議,它能保證接收方能夠完整正確地接收到發送方發送的全部數據。
UDP特點:
1、UDP是面向無連接的通訊協議,UDP數據包括目的端口號和源端口號信息,由於通訊不需要連接,所以可以實現廣播發送。
2、UDP傳輸數據時有大小限制,每個被傳輸的數據報必須限定在64KB之內。
3、UDP是一個不可靠的協議,發送方所發送的數據報並不一定以相同的次序到達接收方。
DatagramSocket和DatagramPacket
DatagramSocket:此類表示用來發送和接收數據報包的套接字。
DatagramPacket:數據報包用來實現無連接包投遞服務。
從來面的定義可以看出這兩個類是用來實現UDP編程的。
UDP編程的兩個原則:
1.先將數據打包
2.在將數據發送出去
下面就是實現UDP實現的網絡編程
客戶端:
public class Myclient {
public static void main(String[] args) throws SocketException,IOException {
//創建客戶端
DatagramSocket client = new DatagramSocket(6666);
//準備數據
byte[] b =convert(86.12);
//將數據打包
DatagramPacket packet = new DatagramPacket(b, b.length, new InetSocketAddress("USER-20150414JG",8888));
//發送數據
client.send(packet);
//關閉客戶端
client.close();
}
public static byte[] convert(double num) throws IOException{
//選擇源
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
//讀取數據
dos.writeDouble(num);
byte[] b = bos.toByteArray();
//關閉流
dos.close();
return b;
}
}
服務器端:
public class Myserver {
public static void main(String[] args) throws SocketException,IOException {
//創建服務器
DatagramSocket server = new DatagramSocket(8888);
//準備容器
byte[] contianer = new byte[1024];
//將數據打包
DatagramPacket packet = new DatagramPacket(contianer,contianer.length);
//接受數據
server.receive(packet);
//獲取數據
byte[] b =packet.getData();
//輸出數據
System.out.println(convert(b));
//關閉服務器
server.close();
}
public static double convert(byte[] b) throws IOException{
ByteArrayInputStream bis = new ByteArrayInputStream(b);
DataInputStream dis = new DataInputStream(bis);
//轉換數據
double a =dis.readDouble();
bis.close();
return a;
}
}
運行結果:
86.12
Socket:套接字使用TCP提供了兩臺計算機之間的通信機制。一個客戶端創建一個套接字並請求與服務器的套接字連接。當連接建立時,服務器會創建一個Socket對象。客戶端和服務器現在可以通過對Socket對象的寫入和讀取來進行進行通信。
java.net.Socket類代表一個套接字,並且java.net.ServerSocket類爲服務器程序提供了一種來監聽客戶端,並與他們建立連接的機制。
以下步驟在兩臺計算機之間使用套接字建立TCP連接時會出現:
1.服務器實例化一個ServerSocket對象,表示通過服務器上的端口通信。
2.服務器調用 ServerSocket類 的accept()方法,該方法將一直等待,直到客戶端連接到服務器上給定的端口。
3.服務器正在等待時,一個客戶端實例化一個Socket對象,指定服務器名稱和端口號來請求連接。
4.Socket類的構造函數試圖將客戶端連接到指定的服務器和端口號。如果通信被建立,則在客戶端創建一個Socket對象能夠與服務器進行通信。
5.在服務器端,accept()方法返回服務器上一個新的socket引用,該socket連接到客戶端的socket。
注意:
連接建立後,通過使用I/O流在進行通信。每一個socket都有一個輸出流和一個輸入流。客戶端的輸出流連接到服務器端的輸入流,而客戶端的輸入流連接到服務器端的輸出流。
TCP是一個雙向的通信協議,因此數據可以通過兩個數據流在同一時間發送.以下是一些類提供的一套完整的有用的方法來實現sockets。
ServerSocket:此類實現服務器套接字。服務器套接字等待請求通過網絡傳入。它基於該請求執行某些操作,然後可能向請求者返回結果。
下面是TCP網絡編程的代碼:
客戶端:
public class MyClient {
public static void main(String[] args) throws IOException {
//建立客戶端
Socket socket = new Socket("localhost",9999);
//創建源
DataInputStream dis = new DataInputStream(socket.getInputStream());
String str = dis.readUTF();
System.out.println(str);
//關閉流
dis.close();
socket.close();
}
}
服務器端:
public class MutilServer {
public static void main(String[] args) throws IOException {
//建立服務器端
ServerSocket server = new ServerSocket(9999);
while(true){
//接受請求
Socket socket = server.accept();
String str ="一個服務器連接成功!";
System.out.println(str);
String msg ="歡迎使用!";
//創建源
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(msg);
dos.flush();//強制刷新
dos.close();//關閉流
}
}
}
服務器端運行結果:
一個客戶端連接成功!
歡迎使用!
注意:
在運行客戶端程序之間必須要運行服務器程序不然jvm會拋出一個java.net.ConnectException: Connection refused: connect異常。因爲TCP是面向連接的,在連接的時候接指定了端口和主機,所以服務器沒有運行的時候就會出現這個異常。