java实现TCP交互

news2024/11/25 20:15:39

服务器端 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.PriorityQueue;
import java.util.Scanner;

public class TCP_Server {
    private ServerSocket serverSocket=null;
    public TCP_Server(int port) throws IOException {
        serverSocket=new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
            //通过accept方法,把内核建立好的连接拿到应用程序中
            //建立连接细节由内核完成
            Socket clientSocket=serverSocket.accept();
            //实现连接
            Thread t=new Thread(()->{
                try {
                    processConnection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            t.start();
        }
    }

    public void processConnection(Socket clientSocket) throws IOException {
        //打印日志,表示客户端连接成功
        System.out.printf("[%s:%d] 客户端上线\n",clientSocket.getInetAddress(),clientSocket.getPort());
        //数据交互
        try (InputStream inputStream = clientSocket.getInputStream()) {
            try (OutputStream outputStream = clientSocket.getOutputStream()) {
                //客户端可能发来多条数据,要循环处理
                while (true) {
                    Scanner scanner = new Scanner(inputStream);
                    if (!scanner.hasNext()) {
                        //连接断开,循环结束
                        break;
                    }
                    //1.读取请求解析,这里用next,因为当客户端输入空拍夫结束输入
                    String request = scanner.next();
                    //2.根据请求返回响应
                    String reponse = process(request);
                    //3.返回客户端
                    //把字节数组写入到 OutputStream
                    PrintWriter printWriter = new PrintWriter(outputStream);
                    //这里println是给客户端不是打印
                    //println带有\n是为了客户端接收的时候以空白符结束
                    printWriter.println(reponse);
                    //刷新缓冲区,写道硬盘
                    printWriter.flush();
                    //4.打印交互内容
                    System.out.printf("[%s:%d] req=%s,resp=%s\n", clientSocket.getInetAddress(), clientSocket.getPort(), request, reponse);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }finally {
                clientSocket.close();
            }
        }
    }

    private String process(String request) {
        //回显服务器
        return  request;
    }

    public static void main(String[] args) throws IOException {
        TCP_Server tcpServer=new TCP_Server(800);
        tcpServer.start();
    }
}

 客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Tcp_Client {
    private Socket socket=null;
    public Tcp_Client(String serverIp,int serverPort) throws IOException {
        //三次握手细节由内核自动完成
        socket=new Socket(serverIp,serverPort);
    }
    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
      try( InputStream inputStream=socket.getInputStream();
           OutputStream outputStream=socket.getOutputStream()){
          PrintWriter writer=new PrintWriter(outputStream);
          Scanner scanner1=new Scanner(inputStream);
          while (true){
              //1.从控制台读入用户输入内容
              System.out.print("->");
              String request=scanner.next();
              //2.把字符串请求发给服务器,用println是为了带上\n与服务器scanner.next呼应
              writer.println(request);
              writer.flush();
              //3.读取服务器请求
              String response=scanner1.next();
              //4.显示返回内容
              System.out.println(response);
          }
      }
    }

    public static void main(String[] args) throws IOException {
        Tcp_Client tcpClient=new Tcp_Client("127.0.0.1",800);
        tcpClient.start();
    }
}

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

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

相关文章

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展,针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日,“3.21”空难的发生…

Python —— 简述

Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…

uni-app实现分页--(2)分页加载,首页下拉触底加载更多

业务逻辑如下: api函数升级 定义分页参数类型 组件调用api传参

Pytest精通指南(02)对比Unittest的差异

文章目录 前言用例编写规则不同用例前置与后置条件不同断言功能不同测试报告失败重跑机制参数化用例分类执行Unittest 前后置示例Pytest 前后置示例总结 前言 在Python中,unittest和pytest是两个主流的测试框架; 它们都旨在支持自动化测试、使用断言验证…

AI的尽头真的是能源吗?

引言 近日,英伟达黄仁勋、OpenAI奥特曼等科技界大佬也表达了AI被能源制约的焦虑。 黄仁勋在一次公开演讲中指出,AI未来发展与光伏和储能紧密相连。他强调,不应仅仅关注计算力,而是需要更全面地考虑能源消耗问题。黄仁勋表示&…

PostgreSQL入门到实战-第十七弹

PostgreSQL入门到实战 PostgreSQL表联接(一)官网地址PostgreSQL概述PostgreSQL中Join命令理论更新计划 PostgreSQL表联接(一) 各种PostgreSQL联接,包括内部联接、左侧联接、右侧联接和完全外部联接 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

亚马逊的核心壁垒:物流

物流为美国电商市场渗透及格局的核心影响因素,也是亚马逊的核心壁垒所在。 从行业规模来看,美国电商渗透率低于中国,主要由于 两国地理及人口密度差异导致美国物流履约难度更大,此外美国更发达的实 体零售业和更为严苛的电商政策…

[Linux][环境变量][进程地址空间]详细解读

目录 1.环境变量1.基本概念2.常见环境变量3.查看环境变量的方法4.测试PATH5.测试HOME6.和环境变量相关的命令7.环境变量的组织方式8.通过代码如何获取环境变量9.通过系统调用获取或设置环境变量10.环境变量通常是具有全局属性 2.进程地址空间0.这里的地址空间,是物理…

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您

小伙伴朋友们: 此刻,我怀着无比激动与深深感激的心情,写下这篇特别的博文。今天,我的CSDN总访问量成功突破了百万大关,这不仅是一个数字的跨越,更是你们对我的支持、信任与鼓励的有力见证。在此&#xff0…

CNN家族的族谱!

没有过时的技术,只是看什么样的应用场景,某些场景下,老技术也能焕发光彩! 发展历程 CNN思想起源——喵星人的视觉系统 20世纪60年代左右,加拿大神经科学家David H. Hubel和Torsten Wisesel发现了猫的视觉中枢里存在感…

SAP_ABAP_MM_PO审批_队列实践SMQ1

SAP ABAP 顾问(开发工程师)能力模型-CSDN博客文章浏览阅读1k次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/java_zhong1990/article/det…

Python - 深度学习系列32 - glm2接口部署实践

说明 前阵子,已经对glm2的接口部署做了镜像化。本次的目的是: 1 测试在隔了一阵子(忘记)的情况下,快速部署时是否有障碍,是不是足够方便2 在算网机环境下,能否快速的实现部署。仅考虑文件方式…

策略模式【行为模式C++】

1.概述 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景,如排序、搜索、数据压缩等。在这些情况下&#x…

D-LinkNAS 远程命令执行漏洞(CVE-2024-3273)RCE漏

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 D-LinkNAS是由D-Link公司制造的网络附加存储设备。…

有趣的css - 动态雷达扫描

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是使用 css 实现一个动态的雷达扫描,快学起来吧! 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码…

产品推荐 | 瑞苏盈科基于立体帧捕捉和视频处理应用的火星Mars EB1开发板

01 产品概述 火星Mars EB1底板是为火星Mars系列FPGA和SoC核心板设计的通用底板,非常适用于立体帧捕捉和视频处理应用,可以为构建基于FPGA的定制化硬件系统提供一个良好的基础和开端。 02 核心亮点 ■ 与所有火星Mars系列FPGA和SoC核心板兼容 ■ 适用…

2024mathorcup数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成,图 ’ 是一个简化的物流 网络示意图。其中,分拣中心作为网络的中间环节,需要将包裹按照不同 流向进行分拣并发往下一个场地,最终使包裹…

FME学习之旅---day23

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 教程:地理数据库入门 FME 支持读取和写入不同的地理数据库格式;这包括文件地理数据库、个人地理数据库和 ArcSDE 地理数据库。支持矢量和栅格数据类型。在本教程中,我们…

Understanding Flink

Flink 下载: mkdir ~/flink && cd ~/flinkwget --no-check-certificate https://archive.apache.org/dist/flink/flink-1.15.3/flink-1.15.3-bin-scala_2.12.tgz wget --no-check-certificate https://repo1.maven.org/maven2/com/ververica/flink-sql-co…

PHP+MySQL组合开发 易企秀H5场景源码系统 带完整的安装代码包以及搭建教程

在数字化时代,企业对于宣传与推广的需求日益增长,而H5页面作为一种轻量级、跨平台的宣传方式,深受企业青睐。为了满足企业对于H5页面制作的需求,我们基于PHPMySQL组合开发了一套易企秀H5场景源码系统,并提供了完整的安…