Python基礎——Python
阿新 • • 發佈:2020-08-16
1、InetAddress類
概念
- 表示網際網路協議(IP)地址物件,封裝了與該IP地址相關的所有資訊,並提供獲取資訊的常用方法。
方法
// 獲得本地 主機地址物件 public static InetAddress getLoclHost() // 根據主機名稱獲得地址物件 public static InetAddress getByName(String host) // 獲得所有相關地址物件 public static InetAddress[] getAllByName(String host) // 獲取IP地址字串 public String getHostAddress() // 獲得IP地址主機名 public String getHostName()
package com.kingtl.NetCode; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; /** * InetAddress類 * 1、建立本機IP地址物件 * 2、建立區域網IP地址物件 * 3、建立外網IP地址物件 */ public class Demo01 { public static void main(String[] args) throws Exception { // 1、建立本機IP地址物件 //1.1 getLocalhost() 方法 InetAddress ia1 = InetAddress.getLocalHost(); System.out.println("ip地址:"+ia1.getHostAddress()+" 主機名:"+ia1.getHostName()); // 1.2 getByName("ip地址") InetAddress ia2 = InetAddress.getByName("192.168.5.99"); System.out.println("ip地址:"+ia2.getHostAddress()+" 主機名:"+ia2.getHostName()); // 1.3 getByName("127.0.0.1") InetAddress ia3 = InetAddress.getByName("127.0.0.1"); System.out.println("ip地址:"+ia3.getHostAddress()+" 主機名:"+ia3.getHostName()); // 1.4 getByName("localhost) InetAddress ia4 = InetAddress.getByName("localhost"); System.out.println("ip地址:"+ia4.getHostAddress()+" 主機名:"+ia4.getHostName()); // 2、建立區域網的IP地址物件 //InetAddress ia5 = InetAddress.getByName("192.168.5.10"); //System.out.println("ip地址:"+ia5.getHostAddress()+" 主機名:"+ia5.getHostName()); //System.out.println("2秒鐘是否可達:"+ia5.isReachable(2000)); // 3、建立外網IP地址物件 InetAddress ia6 = InetAddress.getByName("www.baidu.com"); System.out.println("ip地址:"+ia6.getHostAddress()+" 主機名:"+ia6.getHostName()); System.out.println("2秒鐘是否可達:"+ia6.isReachable(2000)); InetAddress[] ias = InetAddress.getAllByName("www.baidu.com"); for (InetAddress ia : ias) { System.out.println(ia.getHostAddress()); } } }
2、基於TCP的網路程式設計
Socket程式設計
- Socket(套接字)是網路中的一個通訊節點。
- 分為客戶端Socket與伺服器ServerSocket。
- 通訊要求:IP地址 + 埠號。
開發步驟
伺服器端
- 建立ServerSocket,指定埠號。
- 呼叫accept等待客戶端接入。
- 使用
輸入流
,接收請求
資料到伺服器(等待) - 使用
輸出流
,傳送響應
資料給客戶端 - 釋放資源
客戶端:
- 建立Socket,指定伺服器IP + 埠號
- 使用
輸出流
,傳送請求
資料給伺服器。 - 使用
輸入流
,接收響應
資料到客戶端(等待)
3、案例部分
4、單客戶端傳送資料給伺服器端
伺服器端程式碼:
package com.kingtl.NetCode; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 基於TCP協議的伺服器端開發 * 1、建立ServerSocket ,並制定埠號 * 2、呼叫accept() ,接收客戶端請求 * 3、獲取輸入流,讀取客戶端傳送的資料 * 4、獲取輸出流,傳送資料給客戶端 * 5、釋放資源 */ public class TcpServer { public static void main(String[] args) throws Exception { //1、建立ServerSocket ,並制定埠號 ServerSocket listener = new ServerSocket(8899); //2、呼叫accept() ,接收客戶端請求,阻塞方法(如果沒有客戶端請求,則阻塞) System.out.println("伺服器已經啟動....."); Socket socket = listener.accept(); //3、獲取輸入流,讀取客戶端傳送的資料 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8")); String data = br.readLine(); System.out.println("客戶端傳送:" + data); //4、獲取輸出流,傳送資料給客戶端【可選】 //5、釋放資源 br.close(); socket.close(); listener.close(); } }
客戶端程式碼:
package com.kingtl.NetCode;
import java.io.*;
import java.net.Socket;
/**
* 基於TCP的客戶端開發
* 1、建立客戶端套接字,並指定伺服器的地址和埠號
* 2、獲取輸出流,傳送資料給伺服器
* 3、獲取輸入流,讀取伺服器的資料
* 4、釋放資源
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
//1、建立客戶端套接字,並指定伺服器的地址和埠號
Socket socket = new Socket("127.0.0.1", 8899);
//2、獲取輸出流,傳送資料給伺服器
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
bw.write("許久不見");
//3、獲取輸入流,讀取伺服器的資料 【伺服器沒寫回復的程式碼】
//4、釋放資源
bw.close();
socket.close();
}
}
結果:
5、單客戶端上傳檔案給伺服器端
伺服器端程式碼:
package com.kingtl.NetCode2;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP伺服器端
*/
public class TcpFileServer {
public static void main(String[] args) throws Exception {
// 1、建立ServerSocket
ServerSocket listener = new ServerSocket(9999);
// 2、偵聽接收客戶端請求
System.out.println("伺服器已啟動....");
Socket socket = listener.accept();
// 3、獲取輸入流
InputStream is = socket.getInputStream();
// 4、邊讀取邊儲存
FileOutputStream fos = new FileOutputStream("d:\\002.jpg");
byte[] buf = new byte[1024 * 4];
int count = 0;
while ((count=is.read(buf)) != -1) {
fos.write(buf,0,count);
}
// 關閉
fos.close();
is.close();
socket.close();
listener.close();
System.out.println("接收結束!");
}
}
客戶端程式碼:
package com.kingtl.NetCode2;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* TCP的客戶端
*/
public class TcpFileClient {
public static void main(String[] args) throws Exception {
// 1、建立 Socket
Socket socket = new Socket("127.0.0.1",9999);
// 2、獲取輸出流
OutputStream os = socket.getOutputStream();
// 3、邊讀取邊傳送
FileInputStream fis = new FileInputStream("E:\\photos\\bizhi\\fengjing1.jpg");
byte[] buf = new byte[1024 * 4];
int count = 0;
while ((count=fis.read(buf)) != -1) {
os.write(buf,0,count);
}
//關閉
fis.close();
os.close();
socket.close();
System.out.println("傳送完畢!");
}
}
6、多客戶端傳送資料給伺服器端
伺服器端
package com.kingtl.NetCode3;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 使用TCP實現接收多個客戶端請求
*/
public class TcpServer {
public static void main(String[] args) throws Exception {
// 1、建立 ServerSocket
ServerSocket listener = new ServerSocket(10086);
// 2、呼叫 accept() ,接收客戶端請求
System.out.println("伺服器已啟動.....");
while (true){
Socket socket = listener.accept();
System.out.println(socket.getInetAddress()+"連線了伺服器!");
// 建立執行緒物件,負責接收資料
new SocketThread(socket).start();
}
}
}
執行緒類
package com.kingtl.NetCode3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class SocketThread extends Thread {
private Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
if (socket != null) {
BufferedReader br = null;
try {
InputStream is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is,"utf-8"));
while (true) {
String data = br.readLine();
if (data == null) { // 客戶端已經關閉
break;
}
System.out.println(socket.getInetAddress()+"說:" +data);
if (data.equals("886") || data.equals("byebye")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
socket.close();
System.out.println(socket.getInetAddress()+"退出了...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客戶端
package com.kingtl.NetCode3;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* TCP客戶端:一直往伺服器傳送資料
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
// 1、建立 Socket
Socket socket = new Socket("127.0.0.1", 10086);
// 2、獲取輸出流
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
// 3、控制檯輸入
Scanner input = new Scanner(System.in);
while (true) {
String data = input.nextLine();
bw.write(data);
bw.newLine(); // 傳送換行符
bw.flush();
if (data.equals("886") || data.equals("byebye")) {
break;
}
}
// 4、關閉
bw.close();
socket.close();
}
}
7、總結
- 計算機網路:
- 為實現資源共享和資訊傳遞,通過通訊線路連線起來的若干主機。
- TCP協議:
- 是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。資料大小無限制。
- IP:
- 分配給網際網路裝置的數字標籤(唯一標識)。
- Port:
- 在通訊實體上進行網路通訊的程式的唯一標識。
- Socket程式設計:
- 建立連線、接收請求、傳送響應。