文章目錄
- 前言
- 客戶端
- 服務器端
- 輸出線程端
- 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();}
}
服務器端
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();}
}
輸出線程端
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;}@Overridepublic 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()+"輸出線程退出");}
}
End
此代碼我已經測試過可以實現最初的無線數據傳輸,客戶端運行在一個電腦上,服務器端運行在另一臺電腦上,這時只需要將客戶端的目標ip地址改為服務器端電腦的ip地址(如果不知到如何查詢,win+r -> cmd->ipconfig,就可以看到自己電腦的IPv4 地址)。
需要注意的是,當時的測試環境是兩臺電腦處于同一個WiFi熱點下進行的。