Java 1对1

2023-12-25 21:03:34

文章目录

前言

客户端

服务器端

输出线程端

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

文章来源:https://blog.csdn.net/2302_76546999/article/details/135183267
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。