9.2.2Socket(TCP)

news2024/10/3 0:29:19

一.过程:

1.建立连接(不是握手),虽然内核中的连接有很多,但是在应用程序中,要一个一个处理.

2. 获取任务:使用ServerSocket.accept()方法,作用是把内核中的连接获取到应用程序中,这个过程类似于生产者消费者模型.

 

 

3. 使用缓冲的时候,注意全缓冲和行缓冲.

4.注意关闭文件资源(client.socket.close()).

 二.问题处理:

1. 

解决方法:使用多线程.

2.C10M问题:并发量太大.

解决方案:开源节流.

开源:创建线程.

节流:I/O多路复用,I/O多路转接.(java NIO)

三.代码实现:

1.回显服务器:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class EchoTcpServer {

    private ServerSocket serverSocket = null;
    private ExecutorService service = Executors.newCachedThreadPool();

    // 手动设置端口号
    public EchoTcpServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    // 启动服务器
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true) {
            Socket clientSocket = serverSocket.accept();
//             processConnection(clientSocket);

//            Thread thread = new Thread(() -> {
//                try {
//                    processConnection(clientSocket);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            });
//            thread.start();

            service.submit(() -> {
                try {
                    processConnection(clientSocket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    // 处理一个连接
    private void processConnection(Socket clientSocket) throws IOException {
        System.out.println("[" + clientSocket.getInetAddress().toString() + " " + clientSocket.getPort() + "]客户端已上线");
        // 接下来进行读取请求,计算响应,返回响应三步走策略
        try (InputStream inputStream = clientSocket.getInputStream();
             OutputStream outputStream = clientSocket.getOutputStream()) {
            Scanner scanner = new Scanner(inputStream);
            // 一次连接可能会伴随多次请求与回应
            while (true) {
                // 1.读取请求
                if (!scanner.hasNext()) {
                    // 读取结束
                    System.out.println("[" + clientSocket.getInetAddress().toString() + " " + clientSocket.getPort() + "]客户端已下线");
                    return;
                }
                // Tcp的数据是以字节流的形式发送的,这里默认发送文本文件.
                String request = scanner.next();
                // 2.处理请求
                String response = process(request);
                // 3.返回结果
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(response);
                // 刷新
                printWriter.flush();
                System.out.println("[" + clientSocket.getInetAddress().toString() + " " + clientSocket.getPort() + "] 接收: "
                + request + " 回复:" + response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭文件
            clientSocket.close();
        }
    }

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        EchoTcpServer server = new EchoTcpServer(1999);
        server.start();
    }
}

2.回显用户端:

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 EchoTcpClient {

    private Socket socket = null;

    public EchoTcpClient(String serverIp, int serverPort) throws IOException {
        // 完成建立连接
        socket = new Socket(serverIp, serverPort);
    }

    public void start() {
        System.out.println("客户端起动");
        Scanner scannerConsole = new Scanner(System.in);

        try (InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()) {
            while (true) {
                // 输入请求
                System.out.println("->");
                String request = scannerConsole.next();
                // 发送请求
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(request);
                printWriter.flush();
                // 接收响应
                Scanner scannerNetwork = new Scanner(inputStream);
                String response = scannerNetwork.next();
                // 打印响应
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws IOException {
        EchoTcpClient client = new EchoTcpClient("127.0.0.1", 1999);
        client.start();
    }
}

3.字典服务器:

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;

public class DictionaryTcpServer extends EchoTcpServer{

    private Map<String, String> dictionary = new HashMap<>();

    public DictionaryTcpServer(int port) throws IOException {
        super(port);
        dictionary.put("I", "我");
        dictionary.put("love", "爱");
        dictionary.put("China", "中国");
    }

    @Override
    public String process(String request) {
       return dictionary.getOrDefault(request, "没找到");
    }

    public static void main(String[] args) throws IOException {
        EchoTcpServer server = new DictionaryTcpServer(1999);
        server.start();
    }
}

 

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

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

相关文章

docker复现nginx错误配置漏洞

目录 一、nginx环境搭建 1.1搭建步骤 二、docker复现Nginx配置漏洞 2.1安装docker 2.2复现过程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目录穿越 一、nginx环境搭建 1.1搭建步骤 1.先创建Nginx的目录并进入&#xff08;命令如下&#xff09; mkdir /soft &&…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法一、问题描述二、解决方法1.打开 WORD 2019&#xff0c;点击菜单中的“文件”&#xff1b;…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——推论

推论 1. 推出结论题 199-2011-1-28——推出结论题——若题干无论点&#xff0c;考虑&#xff1a;&#xff08;1&#xff09;大多数情况&#xff0c;考虑&#xff1a;直接将选项代入题干。 一般将缅甸所产的经过风化或经河水搬运至河谷、河床中的翡翠大砾石&#xff0c;称为“…

棒球课堂的发展规划·棒球联盟

棒球课堂的发展规划 1. 棒球课堂的发展环境 探讨棒球课堂如何通过运用创新的教学方法来适应不断变化的市场需求。包括但不限于&#xff0c;科学地运用大数据和人工智能技术来提高教学效率&#xff0c;加强教师队伍的专业培训&#xff0c;以及拓展课外活动&#xff0c;增强学生…

【论文阅读】DEPCOMM:用于攻击调查的系统审核日志的图摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ​ 提出了 DEPCOMM&#xff0c;这是一种图摘要方法&#xff0c;通过将大图划…

【PythonRS】植被显示增强(多光谱、正射、照片等)

很多时候我们需要某个区域的正射图&#xff0c;虽然正射图一般都运用了匀色的算法&#xff0c;整体色彩比较均衡。但如果研究区内有大量的植被&#xff0c;这个时候植被突出显示就很有必要了。所以今天给大家分享一下使用Python对多光谱、正射影像进行植被显示增强的算法。 一、…

视频怎么变成gif表情包?在线视频转动图怎么做?

当我们在电脑上观看视频时&#xff0c;有时会遇到一些有趣的片段&#xff0c;如果想把这些视频转gif图片&#xff0c;就需要用到视频转gif工具&#xff08;https://www.gif.cn&#xff09;&#xff0c;今天分享一个使用视频在线转gif功能来完成gif制作的方法&#xff0c;下面是…

代谢组学市场分析,制药及生物制药行业正在推动全球代谢组学产业的发展

代谢组学是对某一生物或细胞所有小分子量代谢产物进行定性和定量分析的一门新兴学科&#xff0c;其揭示的小分子代谢产物变化是机体内基因、蛋白质/酶等功能变化的一系列事件的最终结果&#xff0c;直接反映了生物体系的最终状态&#xff0c;可以反映机体特定病理生理状态下整体…

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程&#xff0c;是由生命线和消息组成 时序图构成: 对象: 对象是类的实例&#xff0c;对象是通过类来创建的&…

【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、PIN设备介绍1. 引脚编号获取2. 设置引脚的输入/输出模式3. 设置引脚的电平值4. 读取引脚的电平值5. 绑定引脚中断回调函数6. 脱离引脚中断…

微信开发之获取收藏夹列表的技术实现

简要描述&#xff1a; 获取收藏夹内容 请求URL&#xff1a; http://域名地址/weChatFavorites/favSync 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数…

深度使用苹果M1 Mac电脑一个月后的发现与问题解决

自从苹果推出M1芯片的Mac电脑后&#xff0c;其强大的性能和高效的能耗管理引起了广泛关注。许多人纷纷购买了这款新一代的Mac电脑&#xff0c;并深度使用了一个月。然而&#xff0c;在长时间使用的过程中&#xff0c;一些问题也逐渐浮现出来。本文将分享在深度使用苹果M1 Mac电…

【C++】dynamic_cast基本用法(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

研究论文关于火灾的烟雾探测

普拉萨梅什加德卡尔 探索所有模型以选择最佳模型。 一、介绍&#xff1a; 烟雾探测器检测烟雾并触发警报以提醒他人。通常&#xff0c;它们存在于办公室、家庭、工厂等。通常&#xff0c;烟雾探测器分为两类&#xff1a; Photoelectric Smoke Detector- 设备检测光强度&#x…

8086汇编语言工作环境 百度网盘下载

链接&#xff1a;https://pan.baidu.com/s/1-1K7gX859xejaUK70OTgtw?pwdbfa5 提取码&#xff1a;bfa5 为了方便下载&#xff0c;找了很多资料&#xff0c;也是从其他人那边分享过来的&#xff0c;也方便其他人 文件内容&#xff1a;

如何快速解决集成环信IM遇到的问题?

1、环信FAQ频道发布了 环信FAQ帮助中心提供了各客户端、RESTful API、环信控制台以及商务相关的集成环信常见问题及解决方法&#xff0c;帮您快速解决集成问题 2、当我有问题时&#xff0c;从哪里进FAQ&#xff1f; 干脆收藏这个网址&#xff1a;https://faq.easemob.com/ 环…

逆向破解学习-割绳子

试玩 支付失败&#xff0c;请检查网络设置 Hook成功 Hook代码 import android.app.Application; import android.content.Context;import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_…

书写自动智慧:探索Python文本分类器的开发与应用:支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类

书写自动智慧&#xff1a;探索Python文本分类器的开发与应用&#xff1a;支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类 文本分类器&#xff0c;提供多种文本分类和聚类算法&#xff0c;支持句子和文档级的文本分类任务&#xff0c;支持二分类、多分类、多标签分类…

8月11日上课内容 nginx的多实例和动静分离

多实例部署 在一台服务器上有多个tomcat的服务。 配置多实例之前&#xff0c;看单个实例是否访问正常。 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1 cp -a /usr…

使用Javassist实现热修复

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;LearnRobustFix