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

news2024/12/25 23:35:27

文章目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐

1.简述 最近从百度智能云的官方技术支持那边了解到,目前百度千帆大模型平台提供有在线的知识库功能,能够在线上传自己的私人知识库文档,并且配置文心一言模型作为文本生成的引擎,构建自己的私有知识库。之前自己搭建知识库都是用的…

微服务--07--Sentienl中使用的限流算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Sentienl中使用的限流算法1、计数器固定窗口算法2、计数器滑动窗口算法----(默认)3、漏桶算法----(排队等待)4、令牌…

设计模式详解---观察者模式

1. 观察者模式简介 1.1. 什么是观察者模式 观察者模式是一种行为型设计模式,用于建立对象之间的一对多依赖关系。在该模式中,一个被称为主题(Subject)的对象维护一组观察者(Observer),并在其状…

Kafka-快速实战

Kafka介绍 ChatGPT对于Apache Kafka的介绍: Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐…

前端-杂记

1 子域请求时候会默认带上父域下的Coolkie 2 document.cookie 设置cookie只能设置当前域和父域,且path只能是当前页或者/ 比如当前页面地址为 http://localhost:3000/about 我们设置 document.cookie "demo11"; 设置 document.cookie "demo22; …

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

基于ssm医院住院综合服务管理系统设计与开发论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对医院住院信息管理混乱,出错率高,信息安全性差…

网站高性能架构设计——高性能数据库集群

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、高性能数据库简介 1.高性能数据库方式 读写分离:将访问压力分散到集群中的多个节点,没有分散存储压力 分库分表&…

【unity】如何用Unity获取Windows桌面

【背景】 默认的Unity可实现的屏幕共享仅仅针对Unity编辑器的编辑窗口中的Camera展现的内容。本篇研究如何实现用Unity实时反映Windows桌面窗口画面。 【准备插件】 下载地址: https://download.csdn.net/download/weixin_41697242/88623496 将解压后的文件夹直…

排序算法之一:直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 实际中我们玩扑克牌时,就用…

【AI】java,在集合中找最接近给定值的数,且比给定值小

目录 一、最终得到的方案 二、AI辅助找到方案 2.1 【C知道】提供java代码支持 2.2 【文心一言】提供字段翻译支持 一、最终得到的方案 /*** 在 collection 中,找跟 value 最大接近值,且该值小于等于 value** param collection 不为null。* param val…

css 纯样式实现绘出进度条

效果: css代码: .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

酸奶店创业新模式,可以轻松应付风险的对策

本人经营一家酸奶店,已经5年时间,也不断学习和探索新的模式,希望我的一些经验可以帮到你。(可以点赞收藏,方便以后随时查阅) 这几年,各行各业,大家都在说,生意不好做&am…

Qt设置类似于qq登录页面(ikun)

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

jemeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下&#xff1a; {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件&#xff0c;配置如下&#xff1a; 若断言成功&#xff0c;则查看结果树的接口显示绿色&#xff0c;若…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

C语言union联合体(共用体)

一、定义 联合体&#xff08;共用体&#xff09;是一种特殊的自定义的数据类型&#xff0c;它包含一系列的成员变量&#xff0c;这些成员变量共用一块内存空间。 语法&#xff1a; union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

电影推荐系统

基于springboot vue实现的电影推荐系统&#xff0c;通过Jsoup数据爬取。 效果图如下&#xff1a;

Java01 169-184

数组添加 import java.util.Scanner; public class ArrayAdd02 {public static void main(String[] args) {Scanner myScanner new Scanner(System.in);//数组一旦定义&#xff0c;不可以增加&#xff0c;必须增加新的数组int[] arr {1, 2, 3};do {int[] arrNew new int[arr…

2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题&#xff0c;包含G3锅炉水处理免费试题答案和解析及G3锅炉水处理模拟试题练习。安全生产模拟考试一点通结合国家G3锅炉水处理考试最新大纲及G3锅炉水处理考试真…