windows websocket同步异步程序怎么把同步通信改成异步通信

c# 怎么将以下Socket 代码更改为异步???因为同步循环监听老是卡死界面!-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
c# 怎么将以下Socket 代码更改为异步???因为同步循环监听老是卡死界面!
来源:互联网 发表时间: 15:13:00 责任编辑:王亮字体:
为了帮助网友解决“c# 怎么将以下Socket 代码更改为异步???因为同步循环监听老是卡死界面!”相关的问题,学网通过互联网对“c# 怎么将以下Socket 代码更改为异步???因为同步循环监听老是卡死界面!”相关的解决方案进行了整理,用户详细问题包括:
int port = 8106;
string host = &127.0.0.1&;
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
1&quot: IPEndPoint ipe = new IPEndPoint(ip, 0).I } catch (ArgumentNullException es) { listBox1;
string msendStr = &为新建连接创建新的Socket, port); Socket s = new Socket(AddressFamily.Length.I temp.Listen(0);&#47.ToString(&cross-domain-policy&gt:ss&&#47.N127:HH:mm.Add(DateT创建一个Socket类s;HH.Close().NHH.Bind(ipe).ASCII;
string recvStr = & + recvStr);allow-access-from domain=* to-ports=8106 /HH, 0).ToString(&quot, bs.0;;&#47:向客户端发生消息{0}&quot.I从客户端接受信息 recvStr += Encoding.Receive(recvB&#47:mm.Stream.ASCII;; + bs), ProtocolT&#47, bytes).N
listBox1.Now.Add(DateTime.0;&#47:{0}&quot:& byte[] bs = Encoding.Accept();返回客户端成功信息 listBox1.I + es);) + &quot.ToString(&&quot.Send(;/&&#47.N) + &cross-domain-policy&
} catch (SocketException es) { listBox1;&Waitforconnect&) + &SocketE);/HH.ToString(& s:ArgumentNullE/开始监听 listBox1.Add(DateTime.Items:{0}&quot.BeginReceive( listBox1:ss&:ss&quot, SocketType, 0.Add(DateT&#47.Items.InterNetwork.ToString(&quot, recvB
Socket temp = s.Add(DateTime.Close():ss&Getaconnect&quot.Length.Parse(host);& string host = &quot.Add(DateTime.GetBytes(msendStr);HH;) + & bytes =) + &quot:ss&quot.ToString(&quottry { int port = 8106.N byte[] recvBytes = new byte[1024].GetString(recvB + es);) + &quot.Tcp):ss&;&gt。 Socket temp = s:收到客户端信息{0}&); IPAddress ip = IPAddress
,具体解决方案如下:解决方案1:然后注册回调函数即可把所有的Receive, BeginSend,Send改成BeginReceive解决方案2:
函数调用不对
解决方案3:
解决办法有两个、将你要对控件的操作当成返回值:1。改成异步就是将这些代码放到一个新线程里了。2。不过这个方法貌似只能支持WPF,就可以在新线程里操作主线程的控件了。不过你这段代码里有对ListBox等图形界面控件的使用,对所有的控件使用Dispatcher进行调用,在新线程里操作会报错的(被主线程占用)。非常方便,让线程处理完以后将返回值交给主线程,在主线程里对控件进行操作、在新线程里直接在主线程(图形界面线程)里使用这个当然会卡死了
解决方案4:
你 尝试 下 这个方法 单独 新开个线程
5个回答1个回答13个回答6个回答5个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 21, 距离下一级还需 179 积分
论坛徽章:0
目前写了一个客户端与服务器端利用网络通讯的程序。客户端在windows平台下,服务器端是基于linux的。在通讯过程中,服务器端根据接收到的客户端数据进行处理,但同时要求客户端能够随时中止服务器端。在服务器端不想采用多进程或线程。不知道Linux下有没有异步socket通信机制,我的客户端在windows下采用了异步socket通信机制。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
你可以使用select, poll, epoll,并且将socket fd设置为non-blocking.
丰衣足食, 积分 717, 距离下一级还需 283 积分
论坛徽章:0
或者用异步通知,用信号处理程序来处理客户端发来的数据
丰衣足食, 积分 717, 距离下一级还需 283 积分
论坛徽章:0
具体你可以看看这个:
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处-------------
新增文件夹...
新增文件夹
(多个标签用逗号分隔)
基于socket实现android_java_与c_的同步通信.pdf
基于Socket的通信机制,阐述了Java和C#语言通过Socket编程来互相通信的步骤,并给出了一种C/S模式的Socket通信系统框架,该框架解决了通过USB连接的安卓应用和Windows桌面应用之间通信的问题,达到了不同平台下文
件和不同语言的对象的互传。
基于Socket的通信机制,阐述了Java和C#语言通过Socket编程来互相通信的步骤,并给出了一种C/S模式的Socket通信系统框架,该框架解决了通过USB连接的安卓应用和Windows桌面应用之间通信的问题,达到了不同平台下文
件和不同语言的对象的互传。&&
加载中...!如果长时间没有加载,请刷新页面
下载本文档需要登录,并付出相应积分()。
文件大小:890.97 KB
所需积分:& 10
相关资讯  — 
相关讨论话题  — 
浏览:435次&& 下载:0次
上传时间: 15:01:30
同类热门文档
40777次浏览 &20次下载
0次浏览 &54次下载
21110次浏览 &43次下载
22797次浏览 &21次下载
17069次浏览 &13次下载
0次浏览 &8次下载
相关经验 -
& 2人评&5页
& 6人评&77页
& 10人评&63页
& 3人评&9页
& 6人评&9页
OPEN-OPEN, all rights reserved.C#.net同步异步SOCKET通讯和多线程总结
C#.net同步异步SOCKET通讯和多线程总结
  同步套接字通信  Socket支持下的网上点对点的通信  服务端实现监听连接,客户端实现发送连接请求,建立连接后执行
发送和接收数据的功能  服务器端建立一个socket,配置
好本机的ip和监听的端口与socket执行
绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端执行
通信。  客户端建立一个socket,配置
好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器执行
通信。  服务器端和客户端的连接及它们之间的数据传送均采用同步方式。  Socket  Socket是tcpip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点。在网络通信中须要
两个主机或两个进程。通过网络传递数据,程序在网络对话的每一端须要
一个socket。   Tcp/IP传输层运用
协议端口将数据传送给一个主机的特定应用程序,协议端口是一个应用程序的进程地址。传输层模块的网络软件模块要于另一个程序通信,它将运用
协议端口,socket是运行在传输层的api,运用
socket建立连接发送数据要指定一个端口给它。  Socket:  Stream Socket流套接字 Socket提供双向、有序、无重复的数据流服务,出溜大量的网络数据。  Dgram socket数据包套接字 支持双向数据流,不保证传输的可靠性、有序、无重复。  Row socket 原始套接字 访问底层协议  建立socket 用C#  命名空间:using System.Nusing System.Net.S  构造新的socket对象:socket原型:  Public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)  AddressFamily 用来指定socket分析
地址的寻址方案。Inte.Network标示须要
ip版本4的地址,Inte.NetworkV6须要
ip版本6的地址
  SocketType参数指定socket类型Raw支持基础传输协议访问,Stream支持可靠,双向,基于连接的数据流。  ProtocolType表示socket支持的网络协议  定义主机对象:  IPEndPoint类:IPEndPoint构造要领
  位置:System.Net  原型:1)   public IPEndPoint(IPAddress address,int port)     2)public IPEndPoint(long address,int port) 参数1整型int64如123456,参数2端口int32主机分析
:  运用
DNS服务器分析
主机,运用
Dns.Resolve要领
  原型:public static IPHostEntry Resolve(string hostname) 参数:待分析
的主机名称,返回IPHostEntry类值,IPHostEntry为Inte.Net主机地址信息提供容器,该容器提供存有IP地址列表,主机名称等。  Dns.GetHostByName获取本地主机名称  原型:public static IPHostEntry GetHostByName(string hostname)  GetHostByAddress  原型:1)public static IPHostEntry GetHostByAddress(IPAddress address) 参数:IP地址 2)public static IPHostEntry GetHostByAddress(string address) IP地址格式化字符串  端口绑定和监听:  同步套接字服务器主机的绑定和端口监听  Socket类的Bind(绑定主机),Listen(监听端口),Accept(接收客户端的连接请求)  Bind:原型:public void Bind(EndPoint LocalEP)参数为主机对象 IPEndPoint  Listen:原型:public void Listen(int backlog) 参数整型数值,挂起队列最大值  accept:原型:public socket accept() 返回为套接字对象  演示程序:IPAddress myip=IPAddress.Parse(&127.0.0.1&);IPEndPoint myserver=new IPEndPoint(myip,2020);Socket sock=new Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);Sock.Bind(myserver);Sock.Listen(50);Socket bbb=sock.Accept();
  发送数据:要领
1:socket类的send要领
二.NetworkStream类Write  send原型:public int Send(byte[] buffer) 字节数组   public int Send(byte[],SocketFlags)原型2说明,SocketFlags成员列表:DontRoute(不运用
路由表发送),MaxIOVectorLength(为发送和接收数据的wsabuf结构数量提供标准值)None 不对次调用运用
标志) OutOfBand(消息的部分发送或接收)Partial(消息的部分发送或接收) Peek(查看传入的消息)原型三:public int Send(byte[],int,SocketFlags) 参数二要发送的字节数  原型四:public int Send(byte[],int,int,SocketFlags) 参数二为Byte[]中开始发送的位置  演示:Socket bbb=sock.Accept();Byte[] bytes=new Byte[64];string send=&aaaaaaaaaaaa&;bytes=System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());bbb.Send(bytes,bytes.length,0);//将byte数组全部发送.NetWordStream类的Write要领
发送数据  原型:public override void write(byte[] buffer,int offset,int size) 字节数组,开始字节位置,总字节数Socket bbb=sock.Accept();.NetWorkStream stre=new NewWorkStream(bbb);Byte[] ccc=new Byte[512];string sendmessage=&aaaaaaaaaaaaaa&;ccc=System.Text.Encoding.BigEndianUnicode.GetBytes(sendmessage);stre.Write(ccc,0,ccc.length);  接收数据:Socket类Receive.NetworkStream类Read  Socket类Receive要领
  原型:public int Receive(byte[] buffer)   
2)public int Receive(byte[],SocketFlags)3)public int Receive(byte[],int,SocketFlags)    4)public int Receive(byte[],int,int,SocketFlags).....Socket bbb=sock.Accept();........Byte[] ccc=new Byte[512];bbb.Receive(ccc,ccc.Length,0);string rece=System.Text.Encoding.BigEndianUnicode.GetString(ccc);richTextBox1.AppendText(rece+&rn&);.NetworkStream类的Read要领
接收数据public override int Read(int byte[] buffer,int offset,int size)  演示:bbb=sock.Accept();........NetworkStream stre=new.NetworkStream(bbb);Byte[] ccc=new Byte[512];stre.Read(ccc,0,ccc.Length);string readMessage=System.Text.Encoding.BigEndianUnicode.GetString(ccc);  线程  线程建立
:System.Threading空间下的Thread类的构造要领
:  原型:public Thread(ThreadStart start) ThreadStart类型值            Thread thread=new Thread(new ThreadStart(accp));       Private void accp(){}//运用
线程操作  线程启动Thread thread=new Thread(new ThreadStart(accp));  线程暂停与重新启动  启动线程运用
Thread.Sleep是当前线程阻塞一段时间Thread.Sleep(Timeout.Infinite)是线程休眠,直到被调用Thread.Interrrupt的另一个线程中断或被Thread.Abort中止。
  一个线程不能对另一个调用Sleep,可以运用
Thread.Suspend来暂停线程,当线程对自身调用Thread.Suspend将阻塞,直到该线程被另一个线程继续,当一个线程对另一个调用,该调用就成为使另一个线程暂停的非阻塞调用。调用Thread.Resume使另一个线程跳出挂起状态并使该线程继续执行,而与调用Thread.Suspend的次数无关  线程休眠:Thread.Sleep(10000);  线程挂起:Thread thread=new Thread(new ThreadStart(accp));                Thread.start();                Thread.Suspend();  重新启动:Thread thread=new Thread(new ThreadStart(accp));               Thread.start();               Thread.Suspend();               Thread.Resume();阻塞线程的要领
:thread.Join运用
一个线程等待另一个线程停止Thread.JoinPublic void Join();Public void Join(int millisecondsTimeout);毫秒Public bool Join(TimeSpan timeout);时间间隔类型值  实例:Thread thread=new Thread(new ThreadStart(accp));              Thread.start();              Thread.Join(10000);  线程销毁:Thread.Abort,Thread.Interrupt  Abort要领
引发ThreadAbortException,开始中止此线程的流程
,是一个可以由应用程序代码捕获的特殊异常,ResetAbort可以取消Abort请求,可以组织ThreadAbortException终止此线程,线程不一定会立即终止,根本不终止。
  对尚未启动的线程调用Abort,则当调用Start时该线程将终止。对已经挂起的线程调用Abort,则该线程将继续,然后终止。对阻塞或正在休眠的线程调用Abort,则该线程被中断,然后终止。  Thread类的Abort要领
:Public void Abort()Public void Abort(object stateinfo);  演示:Thread thread=new Thread(new ThreadStart(accp));Thread.Start();Thread.Abort();Thread.Join(10000);  Socket编程原理:  Unix的i/o命令集,模式为开-读/写-关 open write/read close  用户进程执行
i/o操作  用户进程调用打开命令,获取文件或设备的运用
权,并返回描述文件或设备的整数,以描述用户打开的进程,该进程执行
读写操作,传输数据,操作完成,进程关闭,通知os对哪个对象执行
。  Unix网络应用编程:BSD的套接字socket,unix的System V 的TLI。  套接字编程的基本概念:  网间进程通信:源于单机系统,每个进程在自己的地址范围内执行
运行,保证互相不干扰且协调工作。操作系统为进程之间的通信提供设施:  Unix BSD 管道pipe,命名管道named pipe软中断信号signalUnix System V 消息message 共享存储区 shared memory 信号量semaphore  以上仅限于本机进程之间通信。  端口:网络上可以被命名和寻址的通信端口,是操作系统可以分配的一种资源,网络通信的最终地址不是主机地址,是可以描述进程的摸中标识符。TCP/IP提出协议端口porotocol port端口,表示通信进程。   进程通过os调用绑定连接端口,而在传输层传输给该端口的数据传入进程中处理,同样在进程的数据须要
传给传输层也是通过绑定端口实现。进程对端口的操作相当于对os中的i/o文件执行
操作,每一个端口也对应着一个端口号,tcp/ip协议分为tcp和udp,虽然有相同port number的端口,但是互相也不冲突。 端口号的分配有全局分配,本地分配(动态分配),当进程须要
访问传输层,os分配给进程一个端口号。全局分配,就是os固定分配的端口,标准的服务器都有固定的全局公认的端口号提供给服务。小于256的可以作为保留端口。
   地址:网络通信中的两台机器,可以不再同一个网络,可能间隔(网关,网桥,路由器等),所以可以分为三层寻址  机器在不同的网络则有该网络的特定id  同一个网络中的机器应该有唯一的机器id  一台机器内的进程应该有自己的唯一id  通常主机地址=网络ID+主机ID  tcp/ip中运用
16位端口号来表示进程。  网络字节顺序,高价先存,tcp和udp都运用
16或32整数位的高价存储,在协议的头文件中。  半有关
:在网络中一个进程为协议+本地地址+端口号=三元组,也叫半有关
,表示半部分。  全有关
:两台机器之间通信须要
相同协议   协议+本地地址+本地端口号+远程地址+远程端口号 五元组 全有关
。  顺序:两个连续的报文在网络中可能不会通过相同的路径到达,所以接收的顺序会和发送的顺序不一致。顺序是接收顺序与发送顺序一致。Tcp/ip提供该功能。  差错控制:检查数据差错:检查和CheckSum机制 检查连接差错:双方确认应答机制。  流控制:双方传输数据流程
中,保证数据传输速率的机制,保证数据不丢失。  字节流:把传输中的报文当作一个字节序列,不提供任何数据边界。  全双工/半双工:两个方向发送或一个方向发送  缓存/带外数据:字节流服务中,没有报文边界,可以同一时刻读取任意长度的数据。为保证传输正确或流协议控制,须要
缓存,交互型的应用程序禁用缓存。  数据传送中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息(unix系统的中断键delete,Control-c)、终端流控制符Control-s、Control-q)为带外数据。  客户/服务器模式主动请求方式:  1.       打开通信通道,通知本地主机,在某一个公认地址上接收客户请求
2.       等待客户请求到达端口  3.       接收到重复服务请求,处理请求发送应答信号。接收到并发服务请求。要激活一个新进程处理客户请求,unix系统fork、exec,新进程处理客户请求,不须要
对其他请求作出应答,服务完成后,关闭此进程与客户的通信链路。终止  4.       返回第二步,等待另一个客户请求。  5.       关闭服务端  客户方:  1.       打开一通信通道,并连接到服务器所在主机的特定端口。  2.       向服务器发送服务请求报文,等待并接收应答;继续提出请求&&.  3.       请求结束以后关闭通信通道并终止。  :  1.       客户与服务器进程的作用非对称,编码不同  2.       服务进程先于客户请求而启动,系统运行,服务进程一致存在,直到正常退出或强迫退出  套接字类型:  TCP/IP的socket  Sock_stream可靠的面对连接数据传输,无差错、无重复发送,安照顺序发送接收,内设流量控制,防止
数据流超限,数据为字节流,无长度限制,ftp流套接字。  Sock_DGRAM 无连接的服务,数据包以独立包的形式发送,不提供无措保证,数据可能丢失重复,发送接收的顺序混乱,网络文件系统nfs运用
数据报式套接字。  Sock_Ram 接口允许较底层协议,IP,ICMP直接访问,检查新的协议实现或访问现有服务中配置的新设备。  服务端:using System.Nusing System.Net.Susing System.Tusing System.TTS// 清理所有正在运用
的资源。        protected override void Dispose( bool disposing )         {              try              {             socket.Close();//释放资源             mythread.Abort ( ) ;//中止线程              }              catch{ }              if( disposing )              {                   if (components != null)                    {                       components.Dispose();                   }              }              base.Dispose( disposing );         }                 public static IPAddress GetServerIP()         {              IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());              return ieh.AddressList[0];         }         private void BeginListen()         {              IPAddress ServerIp=GetServerIP();              IPEndPoint iep=new IPEndPoint(ServerIp,8000);              socket=new                        Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);              byte[] byteMessage=new byte[100];                this.label1.Text=iep.ToString();              socket.Bind(iep);  //            do              while(true)              {                   try                   {                       socket.Listen(5);                       Socket newSocket=socket.Accept();                       newSocket.Receive(byteMessage);                       string sTime = DateTime.Now.ToShortTimeString ( ) ;string msg=sTime+&:&+&Message from:&; msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);                       this.listBox1.Items.Add(msg);                   }                   catch(SocketException ex)                   {                       this.label1.Text+=ex.ToString();                   }              }//            while(byteMessage!=null);         }         //开始监听         private void button1_Click(object sender, System.EventArgs e)         {              try              {                   mythread = new Thread(new ThreadStart(BeginListen));                   mythread.Start();              }              catch(System.Exception er)              {                   MessageBox.Show(er.Message,&完成&,MessageBoxButtons.OK,MessageBoxIcon.Stop);              }          }
客户端:using System.Nusing System.Net.Susing System.T         private void button1_Click(object sender, System.EventArgs e)         {              BeginSend();                }         private void BeginSend()         {                           string ip=this.txtip.T              string port=this.txtport.T              IPAddress serverIp=IPAddress.Parse(ip);                          int serverPort=Convert.ToInt32(port);              IPEndPoint iep=new IPEndPoint(serverIp,serverPort);                byte[] byteM  //            do//            {                   Socket socket=new Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);                   socket.Connect(iep);                    byteMessage=Encoding.ASCII.GetBytes(textBox1.Text);                   socket.Send(byteMessage);                   socket.Shutdown(SocketShutdown.Both);                   socket.Close();//            }//            while(byteMessage!=null);         }基于TCP协议的发送和接收端
  (出处:)
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&

我要回帖

更多关于 c socket异步通信 的文章

 

随机推荐