1、概述
想要達到網路通訊效果需要什么:
- 如何準確定位網上的一臺主機,192.168.16.124: 埠,定位到這個計算機的某個資源
- 找到了這個主機,如何傳播資料
JavaWeb與網路編程的區別
JavaWeb:網頁編程 B/C. (Brower/Server)
網路編程:TCP/IP 使用 C/S 架構 (Client/Server)
2、IP
IP地址在 JavaInetAddress 類中
-
唯一定位一臺網路上的計算機
-
本機127.0.0.1: localhost.
public static void main(String[] args) { try{ //查詢本機地址 InetAddress inetAddress1= InetAddress.getByName("127.0.0.1"); System.out.println(inetAddress1); InetAddress inetAddress2= InetAddress.getByName("localhost"); System.out.println(inetAddress2); InetAddress inetAddress3= InetAddress.getLocalHost(); System.out.println(inetAddress3); //查詢網路ip地址 InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress4); }catch (UnknownHostException e){ e.printStackTrace(); } }
3、網路通信協議
各個端間通信的標準,使得接收方和發送方對資料沒有歧義,同時規定端間資料傳輸的速率、包/幀結構、實作傳輸控制等,
3.1TCP
? TCP協議的特點是面向連接的通信協議,保證資料的安全和完整性即在傳輸資料前先在發送端和接收端建立邏輯連接,然后再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸,在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”,
-
三次握手、 四次揮手,面向連接相對穩定,
-
客戶端
- 連接服務器Socket
- 發送訊息
-
服務器
- 建立服務埠ServerSocket
- 等待用戶的連接accept
- 接受用戶的訊息
客戶端:
package SunSocket;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Socket_01 {
public static void main(String[] args) throws Exception {
//要知道服務器地址
//InetAddress.getByName()
InetAddress sAddress=InetAddress.getByName("127.0.0.1");
//埠號
int port=9999;
//創建socket連接
Socket socket=new Socket(sAddress,port);
//發送訊息,IO流
OutputStream stream = socket.getOutputStream();
stream.write("我愛學網路通訊".getBytes());
stream.write('\n');
stream.write("我真的很愛學網路通訊".getBytes());
stream.close();
socket.close();
}
}
服務端:
package SunSocket;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Socket_02 {
public static void main(String[] args) throws Exception {
//需要有一個地址
ServerSocket serverSocket = new ServerSocket(9999);
//等待客戶端連接
Socket socket=serverSocket.accept();
//讀取訊息
InputStream is=socket.getInputStream();
//管道流
ByteArrayOutputStream 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());
baos.close();
is.close();
socket.close();
serverSocket.close();
}
}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lpZVndvF-1604669401312)(https://i.loli.net/2020/11/05/u4eJ7TqtkgIPcWU.png)]
3.2UDP
3.2.1發送訊息
? UDP協議的特點是面向無連接的通信協議,不保證資料的完整性,即在資料傳輸時,資料的發送端和接收端不建立邏輯連接,簡單來說,當一臺計算機向另外一臺計算機發送資料時,發送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向發送端反饋是否收到資料,例如:我們的供屏軟體,
發送端:
package SunSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSocket_01 {
public static void main(String[] args) throws Exception {
//建立Socket
DatagramSocket socket=new DatagramSocket();
//打包資料包
String msg="我愛學UDP協議";
new DatagramPacket(msg.getBytes(),0,msg.getBytes().length);
//發送
InetAddress address= InetAddress.getByName("127.0.0.1");
int post=9090;
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,address,post);
socket.send(packet);
socket.close();
}
}
接受端:
package SunSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//服務器端,等待客戶端的資料包
public class UdpSocket_02 {
public static void main(String[] args) throws Exception {
//開放埠
DatagramSocket socket=new DatagramSocket(9090);
//接受資料包
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//阻塞接受
System.out.println(new String(packet.getData()));
//關閉連接
socket.close();
}
}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VzhKjP6K-1604669401315)(https://i.loli.net/2020/11/06/Y8ionwBpqGAm5lK.png)]
3.2.2回圈發送訊息
發送端:
package SunSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class UdpSocket_03 {
public static void main(String[] args) throws Exception {
//構造資料報套接字并將其系結到本地主機上的9999埠,
DatagramSocket socket = new DatagramSocket(9999);
while (true) {
//準備資料,從控制臺讀取System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String data = reader.readLine();
//準備封裝發送包
byte[] dataBytes = data.getBytes();
//構造用于發送長度的分組的資料報包 length指定主機上到指定的埠號,
//InetSocketAddress從IP地址和埠號創建套接字地址,
DatagramPacket packet = new DatagramPacket(dataBytes, 0, dataBytes.length, new InetSocketAddress("localhost", 6666));
//發送
socket.send(packet);
if(data.equals("bye")){
break;
}
}
socket.close();
}
}
接收端:
package SunSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpSocket_04 {
public static void main(String[] args) throws Exception {
//構造資料報套接字并將其系結到本地主機上的6666埠,
DatagramSocket socket = new DatagramSocket(6666);
while (true) {
//準備接收包裹
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);//阻塞接受
byte[] data = packet.getData();
//此處的Length選用receivedPacket的Length,若選用data的Length,可能會變成1024,并沒有進行動態生成長度
String receiveMsg = new String(data, 0, packet.getLength());
System.out.println(receiveMsg);
if (receiveMsg.equals("bye")) {
break;
}
}
socket.close();
}
}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BiUyLyXd-1604669401318)(https://i.loli.net/2020/11/06/K2V6EM18DzuWtH5.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nH7t9hIH-1604669401322)(https://i.loli.net/2020/11/06/NpPtJvxLVzsrnHQ.png)]
3.2.3多執行緒實作在線咨詢
發送端:
package SunSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSocket_05 implements Runnable{
DatagramSocket socket=null;
BufferedReader reader=null;
private int fromPost;
private String toIp;
private int toPost;
public UdpSocket_05(int fromPost, String toIp, int toPost) {
this.fromPost = fromPost;
this.toIp = toIp;
this.toPost = toPost;
try{
//構造資料報套接字并將其系結到本地主機上的9999埠,
socket = new DatagramSocket(this.fromPost);
//準備資料,從控制臺讀取System.in
reader = new BufferedReader(new InputStreamReader(System.in));
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String data = reader.readLine();
//準備封裝發送包
byte[] dataBytes = data.getBytes();
//構造用于發送長度的分組的資料報包 length指定主機上到指定的埠號,
//InetSocketAddress從IP地址和埠號創建套接字地址,
DatagramPacket packet = new DatagramPacket(dataBytes, 0, dataBytes.length, new InetSocketAddress(this.toIp,this.toPost));
//發送
socket.send(packet);
if (data.equals("bye")) {
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
接收端:
package SunSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpSocket_06 implements Runnable{
DatagramSocket socket;
DatagramPacket packet;
private String name;
private int port;
public UdpSocket_06(int port,String name) {
this.port = port;
this.name=name;
try{
socket=new DatagramSocket(this.port);
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try{
//準備接收包裹
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);//阻塞接受
byte[] data = packet.getData();
//此處的Length選用receivedPacket的Length,若選用data的Length,可能會變成1024,并沒有進行動態生成長度
String receiveMsg = new String(data, 0, packet.getLength());
System.out.println(name+":"+receiveMsg);
if (receiveMsg.equals("bye")) {
break;
}
}catch (Exception e) {
e.printStackTrace();
}
}
socket.close();
}
}
學生測驗:
package SunSocket;
//測驗多執行緒UDP1
public class UdpSocket_07 {
public static void main(String[] args) {
new Thread(new UdpSocket_05(7777,"127.0.0.1",8888)).start();
new Thread(new UdpSocket_06(9999,"老師")).start();
}
}
老師測驗:
package SunSocket;
//測驗UDP2
public class UdpSocket_08 {
public static void main(String[] args) {
new Thread(new UdpSocket_05(5555,"127.0.0.1",9999)).start();
new Thread(new UdpSocket_06(8888,"學生")).start();
}
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OhoOcSrT-1604669401327)(https://i.loli.net/2020/11/06/F9wUW8dZ2cbjqCB.png)]
1.4URL
統一資源定位符:Uniform Resource Locator
協議://ip地址:埠//專案名/資源
package SunSocket;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Url_01 {
public static void main(String[] args) throws Exception {
//1、下載資源(引數為地址)
URL url = new URL("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
System.out.println(url.getProtocol()); //協議名
System.out.println(url.getHost()); //IP名字
System.out.println(url.getPort()); //埠號
System.out.println(url.getPath()); //檔案
System.out.println(url.getFile()); //檔案全路徑
System.out.println(url.getQuery()); //引數
//2、連接到這個資源 HTTP
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("D:\\Desktop\\DownLoad.png");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len); //寫出這個資料
}
//關閉資源
fos.close();
is.close();
urlConnection.disconnect();
}
}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5nkd24RK-1604669401327)(https://i.loli.net/2020/11/06/P8YtvkHTX9AcLfI.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lWghWs13-1604669401328)(https://i.loli.net/2020/11/06/r5OwjEfxtuSBaDl.png)]
自學習于嗶哩嗶哩狂神說JAVA(侵刪);
作為自己的筆記,歡迎大家斧正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/207567.html
標籤:其他
上一篇:JAVA第十四課:網路編程
下一篇:《劍指offer》的編程思想
