文章目錄
前言
客戶端
服務器端
輸出線程端
End
前言
?
TCP(Transmission Control Protocol)是一種面向連接的、可靠的網絡傳輸協議,它提供了端到端的數據傳輸和可靠性保證。
?
本程序就是基于tcp協議編寫而成的。
?
利用 TCP 協議進行通信的兩個應用程序是有主次之分的,一個稱為服務器程序,另一個稱為客戶機程序,兩者的功能和編寫方法大不一樣。
?
代碼結構圖
在這里插入圖片描述
?
?
?
客戶端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
?
public class Client {
? ? public static void main(String[] args) throws IOException {
? ? ? ? Scanner in = new Scanner(System.in);
?
? ? ? ? // 發送數據
? ? ? ? // 創建 Socket對象
? ? ? ? // 創建對象時會連接服務器,如果連接不上會報錯
? ? ? ? // 127.0.0.1 代表本機地址
? ? ? ? Socket socket = new Socket("127.0.0.1", 11451);
? ? ? ? MyThread thread = new MyThread();
? ? ? ? OutputStream os = socket.getOutputStream();
?
? ? ? ? while (true) {
? ? ? ? ? ? if (thread.getState() == Thread.State.NEW) {
? ? ? ? ? ? ? ? thread.setName("蕪湖");
? ? ? ? ? ? ? ? thread.setSocket(socket);
? ? ? ? ? ? ? ? thread.start();
? ? ? ? ? ? }
?
? ? ? ? ? ? String str = in.next();
? ? ? ? ? ? os.write(str.getBytes());
? ? ? ? ? ? if ("886".equals(str)) {
? ? ? ? ? ? ? ? socket.shutdownOutput();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? System.out.println("主線程退出");
? ? ? ? in.close();
? ? ? ? os.close();
? ? ? ? socket.close();
? ? }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
?
?
服務器端
?
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
?
public class Server {
? ? public static void main(String[] args) throws IOException, InterruptedException {
? ? ? ? Scanner in = new Scanner(System.in);
?
? ? ? ? // 接收數據
? ? ? ? // 創建ServerSocket對象
? ? ? ? ServerSocket ss = new ServerSocket(11451); // 獲取指定端口的數據
? ? ? ? MyThread thread = new MyThread();
?
? ? ? ? Socket socket = ss.accept();// 監聽客戶端的連接,獲取連接
? ? ? ? OutputStream os = socket.getOutputStream(); // 獲取輸出流
?
? ? ? ? while (true) {
? ? ? ? ? ? // 判斷該線程是否啟動
? ? ? ? ? ? if (thread.getState() == Thread.State.NEW) {
? ? ? ? ? ? ? ? thread.setName("呀呼");
? ? ? ? ? ? ? ? thread.setSocket(socket);
? ? ? ? ? ? ? ? thread.start();
? ? ? ? ? ? }
?
? ? ? ? ? ? // 從連接通道中獲取輸出流
? ? ? ? ? ? // 寫出數據
? ? ? ? ? ? String str = in.next();
? ? ? ? ? ? os.write(str.getBytes());
? ? ? ? ? ? // 結束
? ? ? ? ? ? if ("886".equals(str)) {
? ? ? ? ? ? ? ? socket.shutdownOutput();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println("主線程退出");
? ? ? ? in.close();
? ? ? ? os.close();
? ? ? ? socket.close();
? ? ? ? ss.close();
? ? }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
?
?
輸出線程端
?
import java.io.*;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
?
public class MyThread extends Thread {
?
? ? Socket socket;
?
? ? public void setSocket(Socket socket) {
? ? ? ? this.socket = socket;
? ? }
?
? ? @Override
? ? public void run() {
? ? ? ? while (true) {
? ? ? ? ? ? BufferedInputStream isr = null; // 獲取輸出流
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? isr = new BufferedInputStream(socket.getInputStream());
? ? ? ? ? ? ? ? int len;
? ? ? ? ? ? ? ? byte[] bytes = new byte[1024];
? ? ? ? ? ? ? ? while ((len = isr.read(bytes)) != -1) {
? ? ? ? ? ? ? ? ? ? String target = new String(bytes, 0, len);
?
? ? ? ? ? ? ? ? ? ? // 獲取當前時間
? ? ? ? ? ? ? ? ? ? LocalDateTime dateTime = LocalDateTime.now(); // get the current date and time
? ? ? ? ? ? ? ? ? ? // 按照相應格式解析
? ? ? ? ? ? ? ? ? ? DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-dd-MM HH:mm:ss");
? ? ? ? ? ? ? ? ? ? // 輸出當前時間
? ? ? ? ? ? ? ? ? ? System.out.println(dateTime.format(formatter));
? ? ? ? ? ? ? ? ? ? // 輸出對方傳輸的內容
? ? ? ? ? ? ? ? ? ? System.out.println(getName()+":"+target);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println(getName()+"輸出線程退出");
? ? }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
End
此代碼我已經測試過可以實現最初的無線數據傳輸,客戶端運行在一個電腦上,服務器端運行在另一臺電腦上,這時只需要將客戶端的目標ip地址改為服務器端電腦的ip地址(如果不知到如何查詢,win+r -> cmd->ipconfig,就可以看到自己電腦的IPv4 地址)。
?
需要注意的是,當時的測試環境是兩臺電腦處于同一個WiFi熱點下進行的。
?
?
?