9.2.2Socket(TCP)

一.过程:

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", "中国");}@Overridepublic 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.mzph.cn/news/32402.shtml

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

相关文章

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1&#xff0c;SeqX 第二次握手 SYN等于1 ACK等于1&#xff0c;SeqY&#xff0c;AckX1 第三次SYN等于0 ACK等于1&#xff0c;SeqX1&#xff0c;AckY1 ackRow都是对应请求seqraw&#xff0c;三次握手后&#xff0c;Seq就是服务器前一个包中的ac…

GaussDB 开发篇+Java调用JDBC访问openGauss数据库

★ 数据库信息 ✔ 数据库版本&#xff1a;openGauss 5.0.0 ✔ 数据库端口&#xff1a;5432 ✔ 数据库名称&#xff1a;db_zzt ★ Java代码 package PAC_001;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sq…

C++初阶语法——类和对象

前言&#xff1a;C语言中的结构体&#xff0c;在C有着更高位替代者——类。而类的实例化叫做对象。 本篇文章不定期更新扩展后续内容。 目录 一.面向过程和面向对象初步认识二.类1.C中的结构体2.类的定义类的两种定义方式 3.类的访问限定符及封装访问限定符说明 4.类的实例化对…

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

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

【面试八股文】每日一题:谈谈你对异常的理解

每日一题-Java核心-谈谈你对异常的理解【面试八股文】 异常是程序在运行过程中出现的错误或不正常的情况。当程序执行过程中遇到无法处理的错误或者不符合预期的情况&#xff0c;就会抛出异常。异常可以分为两种类型&#xff1a;受检异常和非受检异常。 受检异常是指在程序编译…

SqlServer基础之(触发器)

概念&#xff1a; 触发器&#xff08;trigger&#xff09;是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#x…

Semantic Kernel 入门系列: Planner 规划器

Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。 目标导向 “目标导向”听起来是一个比较高大的词&#xff0c;但是却是实际生活中我们处理问题的基本方法和原则。 顾名思义&#xff0c;这种方法的核心就是先确定目标&#xff0c;然后再寻找实现目标的方法和…

C++基础语法重点总结

函数重载 说说什么是函数重载 函数重载指的是在同一个作用域中&#xff0c;声明了具有相同函数名的函数&#xff0c;它们的参数列表不同&#xff0c;也就是说参数类型不同&#xff0c;参数个数不同&#xff0c;参数顺序不同&#xff0c;返回值同不同都可以。 写一个函数重载…

【JavaScript】执行机制

JavaScript 的执行机制主要是基于事件循环&#xff08;Event Loop&#xff09;和单线程的特性。以下是关于 JavaScript 执行机制的一些重要概念&#xff1a; 单线程&#xff1a;JavaScript 是单线程的语言&#xff0c;意味着它只有一个主线程用来执行代码。这个特点决定了 Java…

论文写作常用词句积累

X 连接词 表目的To this end/Toward that endto do soto this aimso as toTo tackle these issuesfor the sake ofaiming to do表转折howeverNevertheless表递进moreverFurthermore表对比on the other hand/On the contraryAlternativelyas in the case ofwhereas表顺序in a f…

Photoshop 2023 25.0beta「Mac」

Photoshop 2023是一款专业图像处理软件&#xff0c;它主要用于图像编辑、合成和设计等方面。 Photoshop beta创新式填充的功能特色包括&#xff1a; 自动识别和删除对象&#xff1a;该功能可以自动识别图像中的对象&#xff0c;并用周围的图像填充空白部分&#xff0c;使图像看…

从零到精通:学习这些R语言必学包成为数据分析高手!

一、操作数据 ❝ tidyverse ❞ tidyverse是一个强大的R语言数据分析工具集&#xff0c;包含了多个核心包。其中包括ggplot2用于数据可视化、dplyr用于数据处理和转换、tidyr用于数据整理和重塑、readr用于数据导入和读取、purrr用于函数式编程、stringr用于字符串处理等。 ❝ d…

认识FFMPEG框架

FFMPEG全称: Fast Forward Moving Picture Experts Group (MPEG:动态图像专家组) ffmpeg相关网站: git://source.ffmpeg.org/ffmpeg.git http://git.videolan.org/?pffmpeg.git https://github.com/FFmpeg/FFmpeg FFMPEG框架基本组件: AVFormat , AVCodec, AVDevice, AVFil…

java使用jsqlparser实现入参,并生成可执行sql

话不多说&#xff0c;直接上 验证通过的代码 第一个例子&#xff1a; package jdbc;import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.parser.CCJSqlP…

Zabbix监控系统

目录 一、zabbix简介 1.1 zabbix 是什么&#xff1f; 1.2 zabbix 监控原理 二、安装zabbix 5.0 2.1 部署 zabbix 服务端 2.2 部署 zabbix 客户端 2.3 自定义监控内容 作为一个云计算行业从业人员&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff…

深度学习知识回顾

1*1卷积的作用&#xff1a; 1x1卷积&#xff08;1x1 convolution&#xff09;在卷积神经网络&#xff08;CNN&#xff09;中起着多种重要的作用。尽管它的卷积核尺寸很小&#xff0c;但它可以在网络中引入以下功能&#xff1a; 1.降维和增加通道&#xff1a;1x1卷积可以用于减…

实力认证!TDengine 入选 Gartner 中国数据分析与人工智能技术成熟度曲线

近日&#xff0c;国际权威研究机构 Gartner 发布了《2023 年中国数据分析及人工智能技术成熟度曲线》&#xff08;即《Hype Cycle for Data, Analytics and AI in China, 2023》&#xff09;报告&#xff0c;TDengine 成功入选实时数据管理领域代表产品。 作为评估全球新技术成…

[QT编程系列-39]:用户界面UI - 样式表QSS与样式文件快速入门

目录 1. 概述 2. CSS 3. QSS示例 4. QT样式表文件使用方法与步骤 5. QT内置样式 6. QT常见基本样式 1. 概述 Qt提供了一种称为Qt样式表&#xff08;Qt Style Sheets&#xff09;的机制&#xff0c;可以用于自定义和美化Qt应用程序的用户界面&#xff08;UI&#xff09;。…

Android 13 Hotseat定制化修改——002 hotseat图标数量修改

目录 一.背景 二.实践方案 一.背景 由于需求是需要自定义修改Hotseat&#xff0c;所以此篇文章是记录如何自定义修改hotseat的&#xff0c;应该可以覆盖大部分场景&#xff0c;修改点有修改hotseat布局方向&#xff0c;hotseat图标数量&#xff0c;hotseat图标大小&#xff0…

【MySQL安装】卸载与安装MySQL 5.7.X版本

最近由于各种原因&#xff0c;需要重新安装MySQL。之前我的版本是8.0版本&#xff0c;现在装的5.7版本。记录一下自己的安装过程。 目录 1、卸载MySQL8.0 2、安装MySQL5.7 1、卸载MySQL8.0 如何彻底卸载MySQL_mysql 完全卸载_m0小麦麦的博客-CSDN博客相信不少小伙伴们在安装…