目錄
- 網路編程概述
- 計算機網路
- 目的
- 問題
- 網路通信的要素
- IP和埠號
- 網路通信協議
- TCP/IP四層概念模型
- IP
- 埠port
- 通信協議
- TCP/IP協議簇
- TCP與UDP對比
- TCP傳輸控制協議
- Socket客戶端套接字
- ServerSocket服務端套接字
- TCP訊息發送
- TCP檔案上傳
- UDP用戶資料報協議
- DatagramPacket資料報包
- DatagramSocket發送和接收資料報包的套接字
- UDP訊息發送
- UDP控制臺多次輸入發送
- UDP多執行緒聊天
- URL
- URL下載網路資源
網路編程概述
計算機網路
計算機網路是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網路作業系統,網路管理軟體及網路通信協議的管理和協調下,實作資源共享和資訊傳遞的計算機系統,
目的
傳播交流資訊,資料交換,通信,
問題
- 如何準確的定位網路上的一臺或多臺主機?
- 找到主機之后如何進行通信?
網路通信的要素
IP和埠號
網路通信協議
TCP/IP四層概念模型

IP
- ip對應java類java.net.InetAddress,
- 唯一定位一臺網路上的計算機,
- 127.0.0.1:本機 localhost,
- ip地址分類
- ipv4/ipv6
- ipv4:4個位元組組成,0-255,43億,
- ipv6:128位,8段4位16進制數,如:fe80:0001:0f2c:23ac:e46f:fce1:ace6:6a2f
- 公網/私網
- 公網:互聯網
- ABCDE類地址
- 私網:局域網
- 公網:互聯網
- ipv4/ipv6
- 域名
package com.qing.demo01;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 測驗IP
*/
public class TestInetAddress {
public static void main(String[] args) {
try {
InetAddress address1 = InetAddress.getLocalHost();
System.out.println(address1);
InetAddress address2 = InetAddress.getByName("127.0.0.1");
System.out.println(address2);
InetAddress address3 = InetAddress.getByName("localhost");
System.out.println(address3);
InetAddress address4 = InetAddress.getByName("www.baidu.com");
System.out.println(address4);
InetAddress address5 = InetAddress.getByName("www.ali.com");
System.out.println(address5);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
L87Y12K91TH8M2R/192.168.75.1
/127.0.0.1
localhost/127.0.0.1
www.baidu.com/182.61.200.7
www.ali.com/72.52.10.14
埠port
- 不同的行程有不同的埠號,
- 0~65535,
- TCP,UDP:65536 * 2,不同協議埠可以相同,如:tcp:80,udp:80是可以的,相同協議下,埠號不能相同,
- 埠分類
- 公有埠:0~1023
- http:80
- https:443
- ftp:21
- ssh:22
- Telnet:23
- 程式注冊埠:1024~49151,分配給用戶和程式
- tomcat:8080
- MySQL:3306
- Oracle:1521
- 動態、私有埠:49152~65535
- 公有埠:0~1023
#查看所有埠
netstat -ano
#查看指定埠
netstat -ano | findstr "3306"
package com.qing.demo01;
import java.net.InetSocketAddress;
public class TestInetSocketAddress {
public static void main(String[] args) {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
InetSocketAddress socketAddress1 = new InetSocketAddress("localhost", 8080);
System.out.println(socketAddress);
System.out.println(socketAddress1);
System.out.println(socketAddress1.getAddress());
System.out.println(socketAddress1.getHostName());
System.out.println(socketAddress1.getPort());
}
}
/127.0.0.1:8080
localhost/127.0.0.1:8080
localhost/127.0.0.1
localhost
8080
通信協議
TCP/IP協議簇
- TCP/IP協議簇:實際上是一組協議,
- 傳輸層協議
- TCP:傳輸控制協議
- UDP:用戶資料報協議
- 網路層協議
- IP:網際互連協議
- 傳輸層協議

TCP與UDP對比
- TCP
- 連接,穩定
- 三次握手,四次揮手
- 連接:三次握手
- A通知B:請求連接
- B通知A:同意連接
- A通知B:收到同意
- 斷開連接:四次揮手
- A通知B:請求斷開連接
- B通知A:同意斷開連接
- B通知A:再次確認斷開連接
- A通知B:確認斷開連接
- 連接:三次握手
- 客戶端、服務端
- 傳輸完成,釋放連接,效率低
- UDP
- 不連接,不穩定
- 客戶端和服務端沒有明確的界限
- 不連接,直接發送
TCP傳輸控制協議
- 客戶端
- 連接服務器 Socket
- 發送訊息
- 服務端
- 建立服務的埠 ServerSocket
- 等待用戶的連接 accept
- 接受用戶的訊息
Socket客戶端套接字
ServerSocket服務端套接字
TCP訊息發送
package com.qing.demo02;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 客戶端
*/
public class TestClient01 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
Scanner scanner = null;
try {
//1.宣告服務端的IP和埠號
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
//2.創建socket連接
socket = new Socket(serverIP,port);
//3.發送訊息
os = socket.getOutputStream();
os.write("歡迎進入武俠世界!".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.qing.demo02;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服務端
*/
public class TestServer01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket client = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1.設定埠
serverSocket = new ServerSocket(9999);
while (true) {
//2.等待客戶端連接
client = serverSocket.accept();
System.out.println(client.getInetAddress());
System.out.println(client.getPort());
//3.讀取客戶端的訊息
is = client.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1) {
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
歡迎進入武俠世界!
/127.0.0.1
13650
歡迎進入武俠世界!
/127.0.0.1
13666
歡迎進入武俠世界!
TCP檔案上傳
package com.qing.demo02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* 客戶端
*/
public class TestClient02 {
public static void main(String[] args) throws IOException {
//1.創建socket連接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
//2.創建輸出流
OutputStream os = socket.getOutputStream();
//3.讀取檔案
FileInputStream fis = new FileInputStream("D:\\code\\JavaSE\\net\\qing.jpg");
//4.寫出檔案
byte[] buffer = new byte[1024];
int len;
while ((len=fis.read(buffer)) != -1) {
os.write(buffer,0,len);
}
//通知服務端,已經傳輸完畢
socket.shutdownOutput();
//5.確認服務端接受完畢,才能斷開連接
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2=is.read(buffer2)) != -1) {
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
//6.關閉資源
fis.close();
os.close();
socket.close();
}
}
package com.qing.demo02;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服務端
*/
public class TestServer02 {
public static void main(String[] args) throws IOException {
//1.創建服務
ServerSocket serverSocket = new ServerSocket(9999);
//2.監聽客戶端的連接
Socket client = serverSocket.accept();//阻塞式監聽,會一直等待客戶端連接
//3.獲取輸入流
InputStream is = client.getInputStream();
//4.檔案輸出
FileOutputStream fos = new FileOutputStream("D:\\code\\JavaSE\\net\\receive.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1) {
fos.write(buffer,0,len);
}
//5.通知客戶端,已接受完畢
OutputStream os = client.getOutputStream();
os.write("服務端已接受完畢,可以斷開連接".getBytes());
//6.關閉資源
fos.close();
is.close();
client.close();
serverSocket.close();
}
}
UDP用戶資料報協議
- 不需要連接服務端,
DatagramPacket資料報包
DatagramSocket發送和接收資料報包的套接字
UDP訊息發送
package com.qing.demo03;
import java.io.IOException;
import java.net.*;
/**
* udp發送端,udp不需要連接服務端
*/
public class UdpSend01 {
public static void main(String[] args) throws IOException {
//1.創建socket
DatagramSocket socket = new DatagramSocket();
//2.創建資料報包
String msg = "秋風掃落葉";
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,InetAddress.getByName("localhost"),9999);
//3.發送資料報包
socket.send(packet);
//4.關閉資源
socket.close();
}
}
package com.qing.demo03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* udp接收端,udp沒有服務端
*/
public class UdpReceive01 {
public static void main(String[] args) throws IOException {
//1.開放埠
DatagramSocket socket = new DatagramSocket(9999);
//2.接收資料報包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//阻塞接收
System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getPort());
System.out.println(new String(packet.getData()));
//關閉資源
socket.close();
}
}
127.0.0.1
64144
秋風掃落葉
UDP控制臺多次輸入發送
package com.qing.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class UdpSender01 {
public static void main(String[] args) throws IOException {
//1.開放埠
DatagramSocket socket = new DatagramSocket(8888);
//2.讀取控制臺輸入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String data = https://www.cnblogs.com/wl3pb/p/reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
//3.發送資料報包
socket.send(packet);
if ("bye".equals(data)) {
break;
}
}
//4.關閉資源
socket.close();
}
}
左一拳
右一拳
上一拳
下一拳
bye
package com.qing.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive01 {
public static void main(String[] args) throws IOException {
//1.開放埠
DatagramSocket socket = new DatagramSocket(9999);
//2.接收資料報包
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//阻塞式接收
byte[] datas = packet.getData();
String data = https://www.cnblogs.com/wl3pb/p/new String(datas).trim();
System.out.println(data);
if ("bye".equals(data)) {
break;
}
}
//3.關閉資源
socket.close();
}
}
左一拳
右一拳
上一拳
下一拳
bye
UDP多執行緒聊天
package com.qing.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TalkSend implements Runnable {
private String toIP;
private int toPort;
private DatagramSocket socket = null;
private BufferedReader reader = null;
public TalkSend(String toIP, int toPort) {
this.toIP = toIP;
this.toPort = toPort;
reader = new BufferedReader(new InputStreamReader(System.in));
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
String data = https://www.cnblogs.com/wl3pb/p/null;
try {
data = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(toIP,toPort));
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
if ("bye".equals(data)) {
break;
}
}
socket.close();
}
}
package com.qing.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceive implements Runnable {
private int port;
private String msgFrom;
private DatagramSocket socket = null;
public TalkReceive(int port,String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
try {
socket.receive(packet);//阻塞式接收
} catch (IOException e) {
e.printStackTrace();
}
byte[] datas = packet.getData();
String data = https://www.cnblogs.com/wl3pb/p/new String(datas).trim();
System.out.println(msgFrom +"->" + data);
if ("bye".equals(data)) {
break;
}
}
//3.關閉資源
socket.close();
}
}
package com.qing.chat;
public class TalkStudent {
public static void main(String[] args) {
//開啟兩個執行緒
new Thread(new TalkSend("localhost",9999)).start();
new Thread(new TalkReceive(8888,"老師")).start();
}
}
package com.qing.chat;
public class TalkTeacher {
public static void main(String[] args) {
//開啟兩個執行緒
new Thread(new TalkSend("localhost",8888)).start();
new Thread(new TalkReceive(9999,"學生")).start();
}
}
老師好
老師->同學好
老師辛苦了
老師->為學生服務
學生->老師好
同學好
學生->老師辛苦了
為學生服務
URL
- URL統一資源定位符:定位資源的,定位互聯網上的某一個資源,
https://192.168.10.217:80/demo/index.html
協議://IP:埠/專案名/資源
URL下載網路資源
package com.qing.demo04;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* URL下載網路資源
*/
public class UrlDown {
public static void main(String[] args) throws IOException {
//1.下載地址
URL url = new URL("https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/[email protected]");
//2.連接資源
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
InputStream is = httpURLConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("urlDown.png");
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1) {
fos.write(buffer,0,len);
}
fos.close();
is.close();
httpURLConnection.disconnect();//斷開連接
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235631.html
標籤:Java
上一篇:3分鐘快速搞懂Java的橋接方法
