让我们的socket服务支持多线程

Socket通信原理(多线程) 我们在日常上网时,会经常登录某个网址,发送我们的请求信息,然后从该网站得到我们想要的信息。这个是怎么实现的呢。其实,我们可以把我们自己当成客户端,网站当成服务端。其实这是个相对的概念,就是谁收到请求,谁就是服务端;谁发送请求,谁就是客户端。而发送和接收请求都是基于Socket 对象实现的。而这个过程是怎么样的呢?(这里介绍的是基于TCP/IP 的通信) 下面我先用一个简单的图解表示一下: 通过上面的图解,我们可以很清晰的看到整个通信的流程。 对于编码来实现的话,我们首先需要编写服务端,然后再编写客户端。 阅读详情

http://blog.youkuaiyun.com/github_26672553/article/details/77507797
前面我们了解了socket的概念,并且最后还用来模拟一个http协议。
之前我们的代码还是单线程的,也就是我们是socket服务是单线程的。

我们前面学习ArrayList的是也了解过线程的概念,还演示了ArrayList的线程不安全问题。
文章地址:
http://blog.youkuaiyun.com/github_26672553/article/details/77164120

1、我们知道要多线程可以直接new Thread(),也可以新建一个类,该类实现Runnable接口。我们这里新建一个类HttpThread.java:

public class HttpThread implements Runnable {

    private ServerSocket serverSocket;

    public HttpThread(ServerSocket serverSocket){
        this.serverSocket = serverSocket;
    }

    @Override
    public void run() {

        try {
            Socket  socket = this.serverSocket.accept();
            // 要想获取客户端发送过来的内容,就要得到 InputStream类 的输入流对象
            InputStream inputStream = socket.getInputStream();
            // 要想给客户端发送数据,就要得到
            OutputStream outputStream = socket.getOutputStream();

            //==========使用我们自定义的http处理的相关类===========//
            Request request = new Request(inputStream);


            Response response = new Response(outputStream);
            response.writePage(request.getPath());

            // 关闭
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码分享:构造函数里接受一个外部实例化后的ServerSocket对象,run()方法需要实现我们的业务。

        ServerSocket serverSocket = new ServerSocket(9000);

        Thread thread = new Thread(new HttpThread(serverSocket));
        thread.start();

        Thread thread1 = new Thread(new HttpThread(serverSocket));
        thread1.start();

这样就开启了2个线程(是socket服务的线程)

2、但是这样并不能完事儿,因为到目前为止,我们的代码会自动断掉服务。也就是当你在浏览器建立一个连接之后 再新款窗口新建第二个连接时,会发现连接失败。

接触 concurrent

是java5之后的一个多线程、并发工具包,有了它可以比较方便。

今天我们学习 concurrent的执行,涉及到的API如下:

Executors 是一个工厂类。用于创建线程池。
newCachedThreadPool 不定长 可回收空闲线程和新建;
newFixedThreadPool 定长线程池,超出线程需要等待;
newScheduledThreadPool 创建一个定长线程池,可进行周期性任务执行;
newSingleThreadExecutor 创建一个单线程化的线程池

这样我们socket服务端代码如下:

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(9000);

        ExecutorService executorService = Executors.newFixedThreadPool(2); //这是规定只能创建2个线程
        executorService.execute(new HttpThread(serverSocket));
        executorService.execute(new HttpThread(serverSocket));

    }
C#网络编程之多线程socket实例 服务器端:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace multithreadservTest 阅读详情

相关推荐

使用sgip协议的Socket编程

基于Socket的java网络编程1,什么是Socket网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。2,Socket通讯的过程Server端Lis

杰弗瑞 4845

socket多线程

socket多线程

weixin_53331739的博客 2687

基于socket实现http服务器

要实现http服务器,首先得了解http协议。同样,要用socket实现服务器,那就得熟悉socket了。 最近的项目中要实现一个类似http服务器的功能,项目是Windows平台下。 心血来潮,顺便在Linux下也实现了一个简单server。目前,仅支持GET、HEAD和POST方法,待有空时继续完善。 使用socket,采用多线程处理每个客户端的连接请求,未处理客户端connection...

donglinshengan的专栏 1587

【Socket网络编程】进阶版:运用多线程

以简洁的代码,诠释核心的Socket多线程思想。

m0_64810555的博客 1595

go 搭建TCP socket 服务端 支持多线程客户端连接

先看下效果: 同时创建了三个socket Client 分别给服务器发送 1111 2222 3333 一起来看下: 具体server 端实现 package main import ( "fmt" "net" ) //现存链接数组对象 var tcpClientList=make([] net.Conn,0); func DoHandler(conn net.Conn) { defer conn.Close() //读取数据 fmt.Println("开始读取数据"...

个人的工作随笔和日记,主要作为一个记录风向平台 1378

C++多线程非阻塞Socket服务端:支持单发/广播通信与连接自动清理

一套开箱即用的C++网络通信示例,专为Code::Blocks环境优化,不依赖第三方库。服务器采用非阻塞Socket模型,主线程响应控制台指令,独立线程分别负责监听新连接、循环接收各客户端数据、按需向指定客户端发送消息或向所有在线客户端广播、定期回收已断开连接的资源。配套完整客户端(client.cpp)、服务端核心(server.cpp、main.cpp)、头文件(client.h/server.h/sclient.h)、工程配置(.cbp/.depend/.layout)、Shell脚本(compile

o4p5q6r7s的博客 256

【Socket】三、Socket使用线程池支持多个线程同时访问

一、使用循环不断接受客户端发送的消息 二、使用线程池优化访问 三、使用Lambda优化线程池匿名内部类 【Socket】一、Socket概述 【Socket】二、UDP协议与TCP协议通讯示例 【Socket】三、Socket使用线程池支持多个线程同时访问 一、使用循环不断接受客户端发送的消息 首先将第二节的TCPServer改造,使用while(true)让服务器能够一直接收客户端...

qq_43227967的博客 3394

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理

便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助

weixin_43518680的博客 633

通信网络-Socket、Java中的网络支持、多线程服务器

通信网络-Socket、Java中的网络支持、多线程服务器 场景:使用java网络创建一个聊天室

编程小菜鸟的笔记 941

F28335 DSP ePWM模块实战:从基础配置到电机控制

本文详细解析了TI TMS320F28335 DSP的ePWM模块,从基础概念、寄存器配置到实战应用。通过代码示例,手把手教你如何配置定时中断、生成PWM波形、实现死区保护与故障联防,并最终完成一个可调速、可换向的直流电机控制项目,是掌握F28335电机控制核心技术的实战指南。

g5h6i的博客 1127

从零配置到批量处理:FaceFusion 3.1完整使用指南(含hififace_256模型测试)

本文详细介绍了FaceFusion 3.1的完整使用指南,包括环境配置、模型选择(特别是hififace_256模型的深度测试)以及批量处理技巧。通过AI驱动的脸部替换技术,帮助用户高效实现高质量的面部处理,适用于影视制作、广告设计等多种场景。

weixin_29056865的博客 655

【亲测免费】 HJ212TCPServerC.rar - 多线程TCP Socket服务端(支持HJ212-2017协议,C语言实现)

HJ212TCPServerC.rar - 多线程TCP Socket服务端(支持HJ212-2017协议,C语言实现) 去发现同类优质开源项目:https://gitcode.com/ 简介 此压缩包包含了基于C语言开发的多线程TCP Socket服务端程序,支持多客户端连接和数据交互。服务端遵循HJ212-2017协议,适用于需要稳定、高效数据通信的场景。 特性 多线程通信:采用多线程技术,...

gitblog_06729的博客 312

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2091

网络编程SOCKET//利用多线程支持多客户端对一个服务端,基本算是一个小型的广播了

所有的头文件://因为头文件比较多,所以干脆自己建了一个头文件,用的时候直接调用,服务端和客户端用的时候直接调用。 #ifndef _TCPSOCKET_H_ #define _TCPSOCKET_H_ #include<stdbool.h> #include<stdio.h> #include<winsock2.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") #define err(err

qq_57958704的博客 182

Vivado 2018.3 安装步骤及 license 获取

本文的主要内容是介绍 Vivado 2018.3 版本的安装步骤及其 license 的获取与加载。

西岸贤 4万+

Amesim与Simulink联合仿真:S-Function接口配置与实战避坑指南

本文详细介绍了Amesim与Simulink联合仿真中S-Function接口的配置方法与实战避坑指南。从环境搭建、编译器配置到S-Function接口实战,逐步解析关键步骤与常见问题解决方案,帮助工程师高效实现多领域系统仿真,特别适合汽车、航空航天等复杂系统建模场景。

weixin_29173777的博客 343

Lisp语言的Socket编程

Socket是一种抽象概念,用于描述网络中一个端点的行为。每个Socket代表进程与网络之间的双向通信通道。Socket的种类很多,常见的包括流式Socket(TCP)和数据报Socket(UDP)。在这篇文章中,我们主要关注流式Socket,因为它提供了可靠的数据传输方式。Lisp是一种由约翰·麦卡锡在1958年提出的编程语言。它以其独特的父heses(圆括号)语法和强大的宏系统而闻名。Lisp语言的可扩展性使得它在人工智能和符号计算等领域得到了广泛应用。

2501_91056738的博客 512

从零到一:基于Rocky Linux 9的Kubernetes高可用集群部署实战

本文提供了一份基于Rocky Linux 9操作系统,从零开始部署Kubernetes高可用集群的完整实战指南。详细讲解了包括系统初始化、容器运行时配置、使用kubeadm工具进行集群初始化、节点加入以及Calico网络插件安装在内的核心步骤,并针对国内网络环境提供了镜像加速等优化方案,旨在帮助读者构建一个稳定可靠的生产级K8s环境。

weixin_29197835的博客 134

java socket 服务器代码 自动接收文件并存储服务器 - 服务器多线程支持和多个客户端同时通信:

public static void main(String[] args) { try{ ServerSocket ss=new ServerSocket(666); ss.setSoTimeout(0); System.out.println("accept超时时间设置为: "+ss.getSoTimeout()); int iAccCount=0; while(true){ S

hemeinvyiqiluoben的专栏 741

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1149

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

php socket 多线程编程,php基于Socket实现多线程开发教程

由于php本身不支持多线程,如果我们想在php实现多线程是不是不可行呢?本教程来讲讲通过php的Socket方式实现php程序的多线程.通过php的Socket方式实现php程序的多线程,php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的,每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决...

weixin_33501348的博客 440

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC下Socket多线程通讯类

<br />VC下Socket多线程通讯类<br />/*<br />public:<br /> void SendServerUDP(CString NewInfo);<br /> void SendClientUDP(CString NewInfo);<br /> CString GetLocalIP();<br /> CString GetLocalHost();<br /> int  GetUDPPort();<br /> bool SetUDPIP(CString NewIP);<br /> bo

yangdongvc605的专栏 7199

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

socket多线程图形化界面聊天室实例

sockert多线程聊天室文章目录socket简介socket类型流格式套接字(SOCK_STREAM)数据报格式套接字(SOCK_DGRAM) 效果图: 文章目录 项目完整地址:https://github.com/FmKnight/socket_chat_room socket简介 socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

air_knight的博客 4918

JAVA初入门——Socket,Thread,多线程Socket

这两天学习了一下JAVA中关于Socket和线程的一些知识,现在主要整理一下。 1.SocketJava的服务端和客户端编写都非常简单,创建服务端使用的是ServerSocket的,然后使用accept()的方法进行监听,并返回一个Socket的对象。客户端的话直接使用Socket类进行连接服务端。连接就这么简单。但我个人觉得难点在于传输信息上,Java本来封装好了很多输入输出流来

8426

Python使用TCPServer编写(多线程)Socket服务

SocketServer包对socket包进行了包装(封装),使得创建socket服务非常简单。 TCPServer+BaseRequestHandler 使用TCPServer和BaseRequestHandler编写socket服务的样例。 [python] view plaincopy #-*- coding:utf-8 -

youngyang的专栏 2192
上一篇: Redux和React组件的异步交互
下一篇: 学习mysql事务
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值