文章目录
- 前言
- 客户端
- 服务器端
- 输出线程端
- 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热点下进行的。