Java--1v1双向通信-控制台版

文章目录

  • 前言
  • 客户端
  • 服务器端
  • 输出线程端
  • End

前言


TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。

本程序就是基于tcp协议编写而成的。

利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。

代码结构图
Java--1v1双向通信-控制台版_第1张图片




客户端

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热点下进行的。

你可能感兴趣的:(java,开发语言)