Java 1对1

文章目录

前言

客户端

服务器端

输出线程端

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();

    }

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

 

 

服务器端

 

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();

    }

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

 

 

输出线程端

 

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()+"输出线程退出");

    }

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

End

此代码我已经测试过可以实现最初的无线数据传输,客户端运行在一个电脑上,服务器端运行在另一台电脑上,这时只需要将客户端的目标ip地址改为服务器端电脑的ip地址(如果不知到如何查询,win+r -> cmd->ipconfig,就可以看到自己电脑的IPv4 地址)。

 

需要注意的是,当时的测试环境是两台电脑处于同一个WiFi热点下进行的。

 

 

 

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

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

相关文章

js 复制粘贴板,当clipboardjs 不好使怎么办?

最近项目中做一个很常见的复制粘贴的功能耽误了比较长的时间特此记录&#xff0c;在往常这个功能直接用 clipboard 做就行了&#xff0c;但是这次却发现复制功能不好使了&#xff0c;虽然走了复制成功的回调&#xff0c;但是粘贴板并没有复制的内容。代码如下 <div v-for&q…

java实现冒泡排序算法

文章目录 冒泡排序算法 冒泡排序算法 算法原理&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 对每一对相邻元素做同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 针对所有的元素重…

Leetcode 345. Reverse Vowels of a String

Problem Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more than once. Algorithm Collect all the vowels and reverse the…

人工智能教程(三):更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在本系列的上一篇人工智能教程&#xff08;二&#xff09;&#xff1a;人工智能的历史以及再探矩阵中&#xff0c;我们回顾了人工智能的历史&#xff0c;然后详细地讨论了矩阵。在…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

概率论之 证明 正态分布的上a 分位点的对称的性质

公式(Z(a) -Z(1-a)) 表示正态分布的上(a)分位点与下(1-a)分位点在分布曲线上关于均值的对称性。 左侧 (Z(a))&#xff1a; 这是分布曲线上累积概率为(a)的那个点。也就是说&#xff0c;这是一个使得这个点及其左侧的面积占据整个曲线下方(a)的位置。 右侧 (Z(1-a))&#xff1…

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版

文章目录 1 基础知识1.1 K8s 有用么&#xff1f;1.2 K8s 是什么&#xff1f;1.3 k8s 部署方式1.4 k8s 环境解析 2 环境部署2.1 基础环境配置2.2 容器环境操作2.3 cri环境操作2.4 harbor仓库操作2.5 k8s集群初始化2.6 k8s环境收尾操作 3 应用部署3.1 应用管理解读3.2 应用部署实…

[Firefly-RK3399] TFTP/NFS网络启动内核与Buildroot文件系统

​网络启动&#xff0c;是用 TFTP 在服务器下载内核、dtb 文件到目标机的内存中&#xff0c;同时可以用 NFS 挂载网络根文件系统到目标机上&#xff0c;实现目标机的无盘启动。 准备工作&#xff1a; Firefly-RK3399 板卡&#xff1b;路由器、网线&#xff1b;安装有 NFS 和 …

微前端 前置知识2--- monorepo架构

目录 前言 pnpm vs npm pnpm设计思想 硬连接 软链接 &#xff08;符号链接&#xff09; 原理 pnpm 指令 monorepo架构 介绍 配置monorepo pnpm --filter 前言 我们采用的是微前端一个主应用&#xff0c;和多个子应用&#xff0c;我们肯定不会一个一个去install安装…

uniapp微信小程序富文本、小程序富文本、rich-text解决video问题

我直接使用的 mp-html mp-html 相当好用&#xff0c;功能比较完善&#xff0c;也可以二次开发 具体的直接看官方文档吧

Linux安全学习路标

1. 操作系统基础知识 首先&#xff0c;你需要建立坚实的操作系统基础知识&#xff0c;包括Linux文件系统和目录结构、Linux进程管理、权限管理等基本概念。 2. 网络和通信安全 学习关于网络和通信安全的基础知识&#xff0c;包括TCP/IP协议栈、网络攻击类型、防火墙配置、网…

vscode + Linux 如何在编辑器调试webserver这类完整C++项目

1. 问题背景 网上搜的一堆文章都是教如何调试单个文件&#xff0c;或者一个文件夹下含了所有cc和头文件&#xff0c;但很多项目头文件和实现在上级目录的子文件中&#xff0c;vscode直接调试main函数所在文件时&#xff0c;直接报错某些头文件找不到(xxx.h not found 或者 und…

12.5单端口RAM,JS计数器,流水线乘法器,不重叠序列检测器(状态机+移位寄存器),信号发生器,交通灯

单端口RAM timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data );reg [6:0]mem[127:0];integer i;always (posedge clk or negedge rst) beginif(!rst) beginfor (i0; i<127 ; ii1) beginmem[i]…

Linux--权限问题(1)

前文 Linux--初识和基本的指令&#xff08;1&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;2&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;3&#xff09;-CSDN博客 目录 前文 前言 1.剩余指令部分 1.1 打包和压缩的其它指令 2.权限部分 2.1权…

探秘MSSQL存储过程:参数传递、错误处理、性能优化

参数传递、错误处理和性能优化是存储过程中非常重要的方面。在本节中&#xff0c;我们将深入探讨这些主题&#xff0c;并提供相应的示例代码。 1、参数传递 存储过程可以接受输入参数和输出参数&#xff0c;以便与外部代码进行交互。以下是一些常见的参数传递方式&#xff1a;…

Qt基础-程序打包发布方法

本文讲解Qt程序打包发布方法。 一、使用Qt自带的windeployqt 生成可运行的包 准备将Qt生成的exe拷入到单独的文件夹,并进行命名,本文命名为packDemorun,并将文件放到D盘(自己随意放置) 1、找到Qt自带的命令终端 2、启动命令终端 3、输入:cd /d D:\packDemorun,进入文…

IDEA删除最近打开的文件记录

IDEA删除最近打开的文件记录 遇见问题&#xff1a;如何删除IDEA中最近打开的文件记录 解决方法 先关闭IDEA 找到 recentProjects.xml 文件 windows 位置&#xff1a;&#xff08;AppData是隐藏文件夹&#xff09; 1.C:\Users\电脑用户名\AppData\Roaming\JetBrains\IntelliJIde…

Git 请输入一个提交信息以解释此合并的必要性

操作方法&#xff1a;按住Ctrl加下面的某个字母

linux-man命令的使用及练习

目录 1. 命令概述 2. 使用 3. 练习 ?man services时报错&#xff1a;No manual entry for services的解决办法 4. man命令中常用按键以及用途 1. 命令概述 Linux提供了丰富的帮助手册&#xff0c;当你需要查看某个命令的参数时不必到处上网查找&#xff0c;只要man一下即…

MySQL六 | 索引

目录 索引 优缺点 结构 语法 创建索引 查看索引 删除索引 索引 索引是帮助数据库高效获取数据的数据结构。如果没有设置索引会进行全表扫描&#xff0c;性能较低。 优缺点 优点缺点提高数据检索的效率&#xff0c;降低数据的IO成本索引列也是要占用空间的通过索引列对数…