文章目录
前言
客户端
服务器端
输出线程端
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;
? ? }
? ? @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()+"输出线程退出");
? ? }
End
此代码我已经测试过可以实现最初的无线数据传输,客户端运行在一个电脑上,服务器端运行在另一台电脑上,这时只需要将客户端的目标ip地址改为服务器端电脑的ip地址(如果不知到如何查询,win+r -> cmd->ipconfig,就可以看到自己电脑的IPv4 地址)。
需要注意的是,当时的测试环境是两台电脑处于同一个WiFi热点下进行的。