作者:IT王小二 博客:https://itwxe.com 前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合代碼實現自己需要的圖床功能,也適合以後 ...
Java網路多線程
2022年8月31日
筆記 韓順平Java自學筆記 網路多線程_關註永雛塔菲喵的博客-CSDN博客
網課 【韓順平講Java】Java網路多線程專題 - TCP UDP Socket編程 多線程 併發處理 文件傳輸 新聞推送 Java_嗶哩嗶哩_bilibili
通信項目上傳到github:cxy-sky/JavaSocket: Java 網路多線程專題,包括 TCP UDP Socket編程 多線程 併發處理 文件傳輸 新聞推送 (github.com)
2022年9月7日完結
InetAddress
package com.jiao;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) throws UnknownHostException {
// 獲得本機的InetAddress對象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
// 根據指定的主機名獲得InetAddress對象
InetAddress byName = InetAddress.getByName("sky");
System.out.println(byName);
// 根據功能變數名稱返回對應的ip
InetAddress byName1 = InetAddress.getByName("www.baidu.com");
System.out.println(byName1);
// 通過getHostAddress對象使他獲得對應的地址ipv4地址
String hostAddress = byName1.getHostAddress();
System.out.println(hostAddress);
// 獲取對應的功能變數名稱
String hostName = byName1.getHostName();
System.out.println(hostName);
}
}
Socket
簡介
理解
TCP網路通信
簡介
案例1 位元組流
服務端
package com.jiao.socket.tcp01;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws IOException {
// 要求電腦上沒有其他程式在監聽9999介面
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("伺服器在9999埠進行監聽");
//程式阻塞,不再向下執行 如果有客戶端socket鏈接,返回一個socket鏈接,開始向下執行
Socket socket = serverSocket.accept();
System.out.println("客戶端 socket = "+socket.getClass());
// 客戶端沒有發送消息的話,會堵塞在這裡
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
}
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服務關閉");
}
}
客戶端
package com.jiao.socket.tcp01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在發送消息");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello jiaojiao".getBytes());
//發送完成結束標記
socket.shutdownOutput();
System.out.println("消息發送完成");
outputStream.close();
socket.close();
}
}
案例2 互發消息
server
package com.jiao.socket.tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在監聽");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
}
//給client發送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello tiantian".getBytes());
//發送完成結束標記
socket.shutdownOutput();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服務關閉");
}
}
client
package com.jiao.socket.tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws IOException {
// Socket socket = new Socket("106.14.219.106", 9999);
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在發送消息");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello jiaojiao".getBytes());
//發送完成結束標記
socket.shutdownOutput();
System.out.println("消息發送完成");
//接收服務端發來的消息
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println(new String(msg, 0, len));
}
inputStream.close();
outputStream.close();
socket.close();
}
}
案例3 位元組流
使用writer時,寫入數據後,要調用flush刷新
//input位元組流轉換為reader字元流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//output位元組流轉換為writer字元流 OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
package com.jiao.socket.tcp03;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在監聽");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String msg = bufferedReader.readLine();
System.out.println("server 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello tiantian");
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
System.out.println("服務關閉");
}
}
客戶端
package com.jiao.socket.tcp03;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws IOException {
// Socket socket = new Socket("106.14.219.106", 9999);
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在發送消息");
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello jiaojiao");
bufferedWriter.newLine();
bufferedWriter.flush();
System.out.println("消息發送完成");
//接收服務端發來的消息
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String msg = bufferedReader.readLine();
System.out.println("client 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);
bufferedReader.close();
bufferedWriter.close();
socket.close();
}
}
上傳文件
工具類
package com.jiao.upload;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* auth:@highSky
* create:2022/9/1
* email:[email protected]
**/
public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception {
// 創建輸出流對象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 位元組數組
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
// 迴圈讀取
// 把讀取到的數據,寫入 bos
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}
public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}
server
package com.jiao.upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/1
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("》》服務開啟,等待連接,發送圖片");
//得到連接
Socket socket = serverSocket.accept();
//準備圖片
String imgName = "src/com/jiao/upload/jiaojiao.png";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(imgName));
//將圖片保存為byte數組中
byte[] img = StreamUtils.streamToByteArray(bis);
//獲取socket的輸出流
OutputStream outputStream = socket.getOutputStream();
//轉換為緩存輸出流
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
bos.write(img);
System.out.println("》》圖片發送完成");
socket.shutdownOutput();
//客戶端收到圖片後的反饋信息
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(reader.readLine());
bos.close();
bis.close();
reader.close();
socket.close();
}
}
client
package com.jiao.upload;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/9/1
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("》》等待圖片");
//獲取socket接收到的二進位圖片數據
InputStream inputStream = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
byte[] img = StreamUtils.streamToByteArray(bis);
//保存到本地
String imgName = "src/com/jiao/upload/tiantian.png";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(imgName));
bos.write(img);
System.out.println("》》保存完成");
//給服務端發送接受完成信息
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(InetAddress.getLocalHost().getHostName() + "已收到圖片");
writer.newLine();
writer.flush();
writer.close();
bos.close();
bis.close();
socket.close();
}
}
UDP
原理
user1
package com.jiao.udp;
import java.io.IOException;
import java.net.*;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class User1 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
//向user2發送消息
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
byte[] msg = "Hello jiaojiao".getBytes();
packet.setData(msg, 0, msg.length);
socket.send(packet);
System.out.println("發送完成");
System.out.println("等待user2回覆");
packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
msg = packet.getData();
System.out.println(new String(msg, 0, msg.length));
System.out.println("通信完成");
socket.close();
}
}
user2
package com.jiao.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class User2 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9998);
//接受user1的消息
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length);
System.out.println("等待user1的消息");
socket.receive(packet);
byte[] msg = packet.getData();
System.out.println(new String(msg, 0, msg.length));
//回覆user1
packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
msg = "hello tiantian".getBytes();
packet.setData(msg, 0, msg.length);
socket.send(packet);
System.out.println("通信結束");
socket.close();
}
}
練習
tcp
server
package com.jiao.homework.test1;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println(">>服務已開啟,等待連接");
Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// System.out.println("client: " + reader.readLine());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
if ("name".equals(reader.readLine()))
writer.write("nova");
else
writer.write("你說啥呢");
writer.newLine();
writer.flush();
System.out.println("client: " + reader.readLine());
writer.write("編寫java程式");
writer.newLine();
writer.flush();
writer.close();
reader.close();
socket.close();
}
}
client
package com.jiao.homework.test1;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println(">>給伺服器發送消息");
//給server發送消息
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("name");
writer.newLine();
writer.flush();
//接受回覆
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// System.out.println("server: " + reader.readLine());
if ("name".equals(reader.readLine()))
writer.write("hobby");
else
writer.write("你說啥呢");
writer.newLine();
writer.flush();
System.out.println("server: " + reader.readLine());
writer.close();
reader.close();
socket.close();
}
}
udp
userA
package com.jiao.homework.udp;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class UserA {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
//發送方
DatagramSocket socket = new DatagramSocket(9999);
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
System.out.println("請輸入問題:");
String msgS = in.nextLine();
byte[] msgB = msgS.getBytes();
packet.setData(msgB);
socket.send(packet);
packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
msgB = packet.getData();
System.out.println(new String(msgB, 0, packet.getLength()));
socket.close();
}
}
userB
package com.jiao.homework.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* auth:@highSky
* create:2022/9/2
* email:[email protected]
**/
public class UserB {
public static void main(String[] args) throws IOException {
//接受方
DatagramSocket socket = new DatagramSocket(9998);
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
byte[] msgB = packet.getData();
System.out.println(new String(msgB, 0, packet.getLength()));
packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
packet.setData("四大名著為。。。。。。".getBytes());
socket.send(packet);
socket.close();
}
}
文件傳輸
server
package com.jiao.homework.trans;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/3
* email:[email protected]
**/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
//服務端等待客戶端下載請求
System.out.println("等待請求");
Socket socket = serverSocket.accept();
//得到socket請求
InputStream is = socket.getInputStream();
byte[] data = new byte[1024];
int len = 0;
//文件名稱,這裡是單線程可以用stringBuilder
StringBuilder fileName = new StringBuilder();
while ((len = is.read(data, 0, data.length)) != -1) {
fileName.append(new String(data, 0, len));
}
System.out.println(fileName);
BufferedInputStream bis = null;
if ("碧藍之海".equals(fileName.toString())) {
fileName = new StringBuilder("src/com/jiao/homework/trans/碧藍之海.mp3");
} else {
fileName = new StringBuilder("src/com/jiao/homework/trans/sorry.txt");
}
bis = new BufferedInputStream(new FileInputStream(fileName.toString()));
byte[] file = StreamUtils.streamToByteArray(bis);
//發送給客戶端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(file);
bos.flush();
socket.shutdownOutput();
bos.close();
bis.close();
socket.close();
serverSocket.close();
}
}
client
package com.jiao.homework.trans;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* auth:@highSky
* create:2022/9/3
* email:[email protected]
**/
public class Client {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入文件名");
String filename = scanner.nextLine();
//給服務端發送下載文件的文件名
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
OutputStream os = socket.getOutputStream();
os.write(filename.getBytes());
os.flush();
socket.shutdownOutput();
//獲取返回的文件,下載
//將文件讀取到數組中
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] file = StreamUtils.streamToByteArray(bis);
//保存到本地
if ("碧藍之海".equals(filename))
filename = "E:\\" + filename + ".mp3";
else
filename = "E:\\" + filename + ".txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
bos.write(file);
bos.flush();
bos.close();
bis.close();
os.close();
socket.close();
}
}
StreamUtils
package com.jiao.homework.trans;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* auth:@highSky
* create:2022/9/1
* email:[email protected]
**/
public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception {
// 創建輸出流對象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 位元組數組
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
// 迴圈讀取
// 把讀取到的數據,寫入 bos
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}
public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}