多线程与Socket编程
一、死锁
定义:
指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁.
解决办法:
1.有序资源分配法
申请不同类资源时,必须按各类设备的编号依次申请
2 .银行家算法
检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。
二、线程池ThreadPool
可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。线程池允许在后台运行多个工作,而不需要为每个任务频繁地创建和销毁单独的线程,从而减少了开销.
*注意*
线程池中的线程都是后台线程
不能手动设置每个线程的属性,比如设置为前台线程、优先级等等
当执行一些比较短的任务是考虑使用线程池,长时间执行的任务不要使用线程池来创建,而要使用Thread手动创建一个线程。
三、委托的异步调用
BeginInvoke 异步调用,BeginInvoke(被调用的方法的参数,回调函数,回调函数的参数);
EndInvoke 获取异步调用的(方法)返回值
IAsyncResult 异步操作的状态
AsyncResult 异步操作的结果(可以获取当前执行的委托对象)
using System.Runtime.Remoting.Messaging;
AsyncState获取回调函数的参数。
注意:委托的异步调用只对单播委托\
四、网络协议
网络五层:应用层、传输层、网络层、链路层、物理层。一般因特网现在都是用的是五层协议,把表示层与会话层的功能都交给了具体的应用程序来做了。
网络七层:应用层、表示层、会话层、传输层、网络层、链路层、物理层
1.应用层:(HTTP、FTP、SMTP)报文Message
2.表示层:通信的应用程序能够解释交换数据的含义。数据压缩、加密解密、数据描述等。
3..会话层:定义了数据交换的定界、同步、建立检查点等功能,例如如何开始、控制结束一个会话。保证接收消息的连续性,完整性。
4.传输层(TCP、UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据传输服务。通过套接字(Socket)实现。
a>TCP(传输控制协议)面向连接的、可靠(应用:ftp、smtp、http等都是基于tcp)
B>UDP(用户数据报协议)无连接的、不可靠的(数据报)应用:视频会议、网络电话、DNS解析。(速度快,能容忍部分数据丢失)
5.网络层(IP)数据报datagram,把数据从一台主机移动到另一台主机,主机间通信。IP协议不可靠,有丢包。
6.链路层(以太网、WiFi、点对点)帧Frame,负责将数据报传递给下一个节点。不同的链路层有特定的链路层协议。一系列路由器、交换机。
7.物理层:负责把数据一个bit一个bit的从一个节点移动到下一个节点,该层中的协议仍然与链路层相关。例如,以太网具有许多物理层协议:双绞铜线的、同轴电缆的、光纤的。
网络简单的四层
应用层 (Application):应用层是个很广泛的概念,有一些基本相同的系统级 TCP/IP 应用以及应用协议,也有许多的企业商业应用和互联网应用。
传输层 (Transport):传输层包括 UDP 和 TCP,UDP 几乎不对报文进行检查,而 TCP 提供传输保证。
网络层 (Network):网络层协议由一系列协议组成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
链路层 (Link):又称为物理数据网络接口层,负责报文传输。
网络层协议
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,需要建立连接(像手机)
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议,只管发送(像电报)。它是属于TCP/IP协议族中的一种。
TCP/IP 连接需要三次握手
1.确定a能发给b
2.b告诉a接受能破解,b能发给a数据
3.a告诉b能破解
端口
1.用来修饰同一地址内的,不同的程序的
2.一个端口同以时间只能被一个程序所监听
3.一个程序绑定一个独有的端口
socket
socket的英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的。),是对网络层的抽象,方便客户端和服务端的传输
1.定义:进程通信机制,通常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。
2.端口范围:0-65535之间。端口的意义:用来区分不同的进程。
分类
(1)公认端口:(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯 明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯,ftp21,smtp25,....。
(2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于 这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
(3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端 口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
3.两种类型:
a.流式Socket(STREAM): 是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率 低;发送数据是以流的方式,发送方可以有自己的缓冲区大小,接收方也可以有自己的缓冲区大小,不必一致,只要发送的数据都接收到就可以了。一次发10个字节,发3次。接收方一次接6个字节,接5 次。只要保证最后是完整的就可以。
b.数据报式Socket(DATAGRAM): 是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.发送方每次发送一个数据报,接收方必须一次也接收一个完整的数据报。
创建和使用socket
//第一步:创建socket:第一个参数:设置网络层的协议,第二个参数设置传输数据的方式,第三个参数:传输层的协议
Socket listenSocket=new Socket(AddressFamily.InterNetwor,SocketType.Stream,ProtocolTypt.Tcp);
//第二步:绑定一个端口和Ip地址
//根据字符串创建一个ip地址对象
IpAddress ip=IpAddress.parse(this.txtIp.Text);//127.0.0.1
//创建一个节点
IpEndpoint endpoint =new IpEndpoint(ip,int.Parse(this.txtport.Text));
listenSocket.Bind(endpoint);
//第三步:开始监听端口
listensocket.Listen(10);//连接队列的最大数
//第四步:开始接受用户的连接
//Accept会阻塞主线程,直到客户端连接上来后,方法执行完成并返回代理Socket
Socket proxSocket=listenSocket.Accept();
//给客户端传输一个字符串
var buffer =Encoding.Default.GetBytes("asdf ");
proxSocket.Send(buffer);
六、Socket编程模型
服务器端:
1.创建Socket对象。设置协议、传输方式等(连接Socket)
2.绑定IP与端口(设置要监听的IP与端口)。Bind()
3.开启监听。Listen()
4.开始接受客户端连接。Accept();//阻塞线程,同时也需要循环不断接受用户连接。
5.接受了客户端的连接,生成一个新的Socket对象(通信Socket)
6.接受(Receive)和发送(Send)消息//需要循环不断接收用户的消息
7.Shutdown()禁用发送与接收功能。
8.Close()关闭释放资源
客户端:
1.创建Socket对象。设置协议、传输方式等(连接Socket)
2.Connect()连接服务器(IP与端口)
3.向服务器发送、接受消息
4.Shutdown()禁用发送与接收功能。
5.Close();关闭释放资源
HttpHandler(一般处理程序)
HttpHandler是一个实现了IHttpHandler接口的特殊类。任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提。如果是没有实现这个接口的类,就不能被浏览器请求。我们可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码,发送回客户端浏览器!当我们不需要返回过多的Html代码的时候可以使用它哦 (.ashx)
IHttpHandler的定义是这样的:
...public interface IHttpHandler
{
...bool IsReusable{get;}
...void ProcessRequest(HttpContext context);
}
其中ProcessRequest就是我们处理请求的主要代码;
IsReusable属性用来表示在IHttpHandlerFactory对象创建IHttpHandler的时候是否能够将这个Handler存入池中以便重用。
IHttpHandlerFactory的定义是这样的:
...public interface IHttpHandlerFactory
{
...IHttpHandler GetHandler(HttpContext context,string requestType,string url,string pathYranslated);
...void ResaseHandler(IHttpHandler handler);
}
GetHandler(),返回实现了IHttpHandler接口的类的实例。
ReleaseHandler(),使得Factory可以重复使用一个已经存在的Handler实例
案例:使用HttpHandler实现图片防盗链
public void ProcessRequest(HttpContext context){
context.Response.ContentType="text/plain";
//获取文件服务器端物理路径
string FileName=context.Server.MapPath(context.Request.FliePath);
//如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
if(context.Request.UrlReferrer.Host==null)
{
context.Response.ContentType="image/JPEG";
context.Response.WriteFile("/error.jpg");
}
//如果urlRefferrer中不包含自己站点的主机域名,则显示一张默认的禁止盗链的图片
else
{
if(coontext.Request.UrlReferrer.Host.IndexOf("hezhiqiang.com")>0)
{
context.Respones.ContentType="image/JPEG";
context.Response.WriteFile(FileName);
}
else
{
context.Respones.ContentType="image/JPEG";
context.Response.WriteFile("/error.jpg");
}
}
}
多线程与Socket编程的更多相关文章
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- Qt中采用多线程实现Socket编程
Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始 ...
- 多线程Java Socket编程示例(转)
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...
- 多线程Java Socket编程
采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package localSocket; import java.i ...
- 多线程实现socket编程
服务端: server.py import threading import socket server=socket.socket() ip_port=("127.0.0.1", ...
- 为什么socket编程要用到多线程
不得不佩服计算机先驱的设计:socket编程为什么需要多线程.如果只有一个ServerSocket线程,那么如下代码: public void start() throws Exception { S ...
- 使用libevent进行多线程socket编程demo
最近要对一个用libevent写的C/C++项目进行修改,要改成多线程的,故做了一些学习和研究. libevent是一个用C语言写的开源的一个库.它对socket编程里的epoll/select等功能 ...
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...
- socket编程,简单多线程服务端测试程序
socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...
随机推荐
- ☀【CSS3】形状
CSS3shapeshttp://www.css3shapes.com/ <!DOCTYPE html> <html lang="zh-CN"> <h ...
- Linux NTP校时
1.安装客户端(root权限运行) apt-get install ntpdate 2.修改配置文件:“/etc/default/ntpdate”, NTPSERVERS="ntp. ...
- SWFUpload无刷新文件批量上传
一.首先将SWFUpload所有文件加入项目中,如图
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- 三大跨平台网盘--dropbox
背景介绍 Dropbox是一个提供同步本地文件的网络存储在线应用.支持在多台电脑多种操作中自动同步.并可当作大容量的网络硬盘使用. 准备工作 帐号--dropbox官网 软件--windows/ubu ...
- 使用Pig预测电信用户的移动路径
实战数据: 预期结果: 测试数据: 002|2014-09-10 00-09|东油大学 002|2014-09-10 09-17|学苑小区 001|2014-09-12 00-09|东油大学 001| ...
- 问题-[WIN764位系统]操作UDL驱动不全处理
http://www-01.ibm.com/support/docview.wss?uid=swg21503768 方法# 1 单击“开始——运行” 输入一个命令类似如下: C:\Win ...
- jQuery 的属性操作方法
jQuery 属性操作方法 下面列出的这些方法获得或设置元素的 DOM 属性. 这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html(). 方法 描述 addClass() 向匹配的 ...
- Kerberos认证流程详解
Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ...
- Quartz定时任务学习(五)触发器
顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...