多线程和Socket——在线聊天室
多线程开发和Socket技术
一、进程和线程
进程:每个应用程序对应一个进程;
线程:一个进程至少包含一个线程,线程要和CPU进行交互。
多线程并发(可以理解为):"同一时间"执行多件事情,如程序一边执行,一边计数(计时);如人一边吃饭,一边看电视。
多线程并发的本质,其实并不是CPU"同时"执行多件事情,而是在不停的切换,执行一段时间事件A,切换,执行一段时间事件B;再切换,再执行一段时间事件A,如此往复,因为CPU处理速度非常快,电脑的使用者感觉不到,所以看起来就像是在同时执行多件事情。

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
多线程是指程序中包含多个程序执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
一个进程会创建一个默认线程,即主线程,也就是UI线程。
多线程的优点
1.让计算机"同时"做多件事情,节约时间;
2.后台运行程序,提高程序的执行效率,也不会使主界面(UI线程)出现无响应的情况;
3.多线程可以让一个程序"同时"执行多件事情;
4.计算机CPU大部分时间处于空闲状态,避免浪费了CPU资源。
二、.Net中如何实现多线程
1.为线程执行一个方法(线程肯定要执行一段代码),这个方法中的代码就是该线程运行时要执行的代码(找一个人来做一件事)
产生一个线程的4个步骤:
1.编写该线程所要执行方法的代码
2.引用System.Threading命名空间
3.实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候线程已经产生,但还没有运行)
4.调用Thread实例的start()方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
三、前台线程和后台线程
前台线程:只有所有的前台线程都关闭才能完成程序关闭的线程;
后台线程:只要所有的前台线程结束,后台线程自动结束。
将一个线程设置为后台线程的方法:
Thread.IsBackground = true;
线程可以执行
1.不带参数的委托(无传入参数)
ThreadStart();
2.传入带参数的委托
ParameterizedThreadStart(object);
传入参数类型为object,理论上可以传任意的集合、列表和数组等。
例子:
定义一个执行循环任务的方法:
void CountNum()
{
DateTime beginTime = DateTime.Now; for (int i = ; i < ; i++)
{
//故意留空
} TimeSpan ts = DateTime.Now.Subtract(beginTime);
MessageBox.Show("循环执行完毕,用时:" + ts.TotalMilliseconds);
} //在多线程button的click事件中
Thread thread = new Thread(CountNum);
thread.IsBackground = true; //标记该线程为后台线程(前台线程结束后停止运行)
thread.Start();
四、套接字Socket
1.socket的英文原意是"孔"或"插座"。作为进程通信机制,取后一种意思。通常也成为"套接字",用于描述IP地址和端口,是一种通信链的句柄。(其实就是2个程序通信用的)
2.socket非常类似于电话插座。以电话网为例,电话的通话双方都相当于相互通信的2个程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的电话号码,相当于对方有一个固定的socket;然后双方拨号呼叫,相当于发出连接请求。加入对方在场并空闲,拿起电话听筒,双方就可以正式通话了,相当于连接成功。双方通话的过程中,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂断电话相当于关闭socket,撤销连接。
3.在Internet上有许多主机,运行多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务(应用程序)。
例如:http使用80端口,ftp使用21端口,smtp使用23端口。
4.socket传递数据主要有2中类型:
- 流式socket(STREAM)
是一种面向连接的socket,针对于面向连接的TCP服务应用,安全,但是效率低。
- 数据报式socket报文(DATAGRAM)
是一种无连接的socket,对应于无连接的UDP服务应用,不安全(丢失、顺序混乱,在接收端要分析重排及要求重发),但效率高。
5.Socket一般应用模式(服务端和客户端交互)


三次握手的过程。
6.socket的通讯过程


Socket操作相关类和方法

--EOF--
多线程和Socket——在线聊天室的更多相关文章
- AngularJS+Node.js+socket.io 开发在线聊天室
所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...
- 基于Server-Sent Event的简单在线聊天室
Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...
- 在线聊天室的实现(1)--websocket协议和javascript版的api
前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...
- 百度前端面试题-类似slack的在线聊天室
别人国庆出去玩,我在家写代码的感觉也是很不错哒. 首先介绍一下技术架构吧! 使用了js框架:FFF,zepto,jquery,md5.min.js 前端框架:Bootstrap 后端:野狗,部分PHP ...
- 基于tcp和多线程的多人聊天室-C语言
之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...
- 基于Java的在线聊天室
概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
- Socket.IO聊天室~简单实用
小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...
- 三、jQuery--jQuery基础--jQuery基础课程--第12章 jQuery在线聊天室
在线聊天室案例 一.功能简介: 1.用户需要登录后才能进入聊天室交流 2.已无刷新的方式,动态展示交流后的内容和在线人员的基本信息 3.登录后的用户可以提交文字和表情图标 技术重点:利用ajax的无刷 ...
随机推荐
- eclipse library jar包 使用总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- AngulerJS学习(五)按需动态载入文件
在此之前我么年首先要先了解几个东西: $q 简单介绍: $q:主要解决的是异步编程的问题,是指描写叙述通过一个承诺行为与对象代表的异步运行的行动结果的交互.可能会也可能不会再不论什么时候完毕. 我们通 ...
- [干货]Kaggle热门 | 用一个框架解决所有机器学习难题
新智元推荐 来源:LinkedIn 作者:Abhishek Thakur 译者:弗格森 [新智元导读]本文是数据科学家Abhishek Thakur发表的Kaggle热门文章.作者总结了自己参加100 ...
- thrift系列 - 快速入门
1.简介 Thrift是当前流行的RPC框架之一,它有强大的代码生成引擎,可以跨语言,轻松解决程序间的通信问题. 本文旨在帮助大家快速入门,若想深入原理,请参见thrift官网:h ...
- IE DIV背景透明,点击事件不响应解决方案
IE DIV背景透明,给DIV绑定点击事件, 当点击DIV时,不会响应已经绑定的点击事件. 解决方案是给DIV的设置以下样式. background-image: url(data:image/gif ...
- Eclipse导入git上的maven web项目 部署 - lpshou
http://www.tuicool.com/articles/fqm2Qf 推酷 文章 微博 主题 站点 活动 应用 周刊 登录 Eclipse导入git上的maven web项目 部署 - ...
- 解决Android Studio无法下载sdk的问题
因为google被墙了,android sdk无法下载.然后各种百度,都是说让设置代理,给的代理地址一般都是用的下面这个代理服务器: 大连东软信息学院镜像服务器地址: mirrors.neusoft. ...
- angular5中使用jsonp请求页面
说多了,都是眼泪,折腾了很久,各种百度,查到的例子,全都报错,可能是因为我的angular的版本太高,向下都不兼容? 我的angular版本为最新的5.2.11: 下面是正确的jsonp请求的方法 1 ...
- 算法笔记_223:打印回型嵌套(Java)
目录 1 问题描述 2 解决方案 1 问题描述 *********** * * * ******* * * * * * * * *** * * * * * * * * * * *** * * * ...
- Python实现支付宝当面付之——扫码支付
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7680348.html 一:配置信息准备 登录蚂蚁金服开放平台:https://open.alipay.com/ ...