`
izuoyan
  • 浏览: 9220250 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

异步socket的线程分配(C#)

阅读更多
异步socket的线程分配(C#)

以下是MSDN里异步socket示例的代码,我在代码里加入了显示当前线程ID的语句,想看看异步socket的线程是怎么分配的,与客户端配合运行后的结果如图

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Server端代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;


namespaceConsoleServer
{
publicclassStateObject
{
//Clientsocket.
publicSocketworkSocket=null;
//Sizeofreceivebuffer.
publicconstintBufferSize=1024;
//Receivebuffer.
publicbyte[]buffer=newbyte[BufferSize];
//Receiveddatastring.
publicStringBuildersb=newStringBuilder();
}



classProgram
{
publicstaticManualResetEventallDone=newManualResetEvent(false);

/**////<summary>
///监听
///并开始接受网络连接请求的方法
///</summary>

publicstaticvoidStartListening()
{
Console.WriteLine(
"监听时的线程:"+Thread.CurrentThread.ManagedThreadId.ToString());
//Databufferforincomingdata.
byte[]bytes=newByte[1024];

//Establishthelocalendpointforthesocket.
//TheDNSnameofthecomputer
//runningthelisteneris"host.contoso.com".
IPHostEntryipHostInfo=Dns.Resolve("127.0.0.1");
IPAddressipAddress
=ipHostInfo.AddressList[0];
IPEndPointlocalEndPoint
=newIPEndPoint(ipAddress,9090);

//创建一个tcp/ipsocket
Socketlistener=newSocket(AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp);

//Bindthesockettothelocalendpointandlistenforincomingconnections.
try
{
listener.Bind(localEndPoint);
Console.WriteLine(
"Listen1:"+Thread.CurrentThread.ManagedThreadId.ToString());
listener.Listen(
100);
Console.WriteLine(
"Listen2:"+Thread.CurrentThread.ManagedThreadId.ToString());

while(true)
{
Console.WriteLine(
"1:"+Thread.CurrentThread.ManagedThreadId.ToString());
//Settheeventtononsignaledstate.设置为无信号状态
allDone.Reset();
Console.WriteLine(
"2:"+Thread.CurrentThread.ManagedThreadId.ToString());
//Startanasynchronoussockettolistenforconnections.
Console.WriteLine("Waitingforaconnection");
//开始建立连接
listener.BeginAccept(
newAsyncCallback(AcceptCallback),
listener);
Console.WriteLine(
"3:"+Thread.CurrentThread.ManagedThreadId.ToString());
//Waituntilaconnectionismadebeforecontinuing.

allDone.WaitOne();
Console.WriteLine(
"4:"+Thread.CurrentThread.ManagedThreadId.ToString());
}


}

catch(Exceptione)
{
Console.WriteLine(e.ToString());
}


Console.WriteLine(
"\nPressENTERtocontinue");
Console.Read();

}


/**////<summary>
///处理连接请求
///并开始接收网络数据的回调方法
///</summary>
///<paramname="ar"></param>

publicstaticvoidAcceptCallback(IAsyncResultar)
{
//Signalthemainthreadtocontinue.
allDone.Set();
Console.WriteLine(
"AcceptCallback1线程ID为:"+Thread.CurrentThread.ManagedThreadId.ToString());
//Getthesocketthathandlestheclientrequest.
Socketlistener=(Socket)ar.AsyncState;
//建立socket通道,连接建立完成
Sockethandler=listener.EndAccept(ar);

//Createthestateobject.创建一个状态对象,开始接受数据
StateObjectstate=newStateObject();
state.workSocket
=handler;
handler.BeginReceive(state.buffer,
0,StateObject.BufferSize,0,
newAsyncCallback(ReadCallback),state);
Console.WriteLine(
"AcceptCallback2线程ID为:"+Thread.CurrentThread.ManagedThreadId.ToString());
}



/**////<summary>
///结束接收数据的回调方法
///</summary>
///<paramname="ar"></param>

publicstaticvoidReadCallback(IAsyncResultar)
{
Console.WriteLine(
"ReadCallback线程ID为:"+Thread.CurrentThread.ManagedThreadId.ToString());
Stringcontent
=String.Empty;

//Retrievethestateobjectandthehandlersocket
//fromtheasynchronousstateobject.
StateObjectstate=(StateObject)ar.AsyncState;
Sockethandler
=state.workSocket;

//Readdatafromtheclientsocket.从socket通道里读取数据
intbytesRead=handler.EndReceive(ar);

if(bytesRead>0)
{
//Theremightbemoredata,sostorethedatareceivedsofar.
state.sb.Append(Encoding.ASCII.GetString(
state.buffer,
0,bytesRead));

//Checkforend-of-filetag.Ifitisnotthere,read
//moredata.
content=state.sb.ToString();
if(content.IndexOf("<EOF>")>-1)
{
//Allthedatahasbeenreadfromthe
//client.Displayitontheconsole.
Console.WriteLine("Read{0}bytesfromsocket.\nData:{1}",
content.Length,content);

Console.WriteLine(
"请输入要发送的信息:");
stringstr=Console.ReadLine();
Send(handler,str
+"<EOF>");

//Send(handler,content);


}

else
{
//Notalldatareceived.Getmore.
handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
newAsyncCallback(ReadCallback),state);
}

}

}



/**////<summary>
///开始发送数据的方法
///</summary>
///<paramname="handler"></param>
///<paramname="data"></param>

privatestaticvoidSend(Sockethandler,Stringdata)
{
//ConvertthestringdatatobytedatausingASCIIencoding.
byte[]byteData=Encoding.ASCII.GetBytes(data);

//Beginsendingthedatatotheremotedevice.
handler.BeginSend(byteData,0,byteData.Length,0,
newAsyncCallback(SendCallback),handler);
}



/**////<summary>
///结束发送数据的回调方法
///</summary>
///<paramname="ar"></param>

privatestaticvoidSendCallback(IAsyncResultar)
{
Console.WriteLine(
"SendCallback线程ID为:"+Thread.CurrentThread.ManagedThreadId.ToString());
try
{
//Retrievethesocketfromthestateobject.
Sockethandler=(Socket)ar.AsyncState;

//Completesendingthedatatotheremotedevice.
intbytesSent=handler.EndSend(ar);
Console.WriteLine(
"Sent{0}bytestoclient.",bytesSent);

//没有了这两句,server是发不出去的,为什么呢?
handler.Shutdown(SocketShutdown.Both);
handler.Close();

}

catch(Exceptione)
{
Console.WriteLine(e.ToString());
}

}



staticvoidMain(string[]args)
{
Console.WriteLine(
"main线程ID为:"+Thread.CurrentThread.ManagedThreadId.ToString());
StartListening();
Console.ReadLine();
}

}

}




客户端代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Net.Sockets;
usingSystem.Threading;
usingSystem.Net;


namespaceWindowsClient
{
publicclassStateObject
{
//Clientsocket.
publicSocketworkSocket=null;
//Sizeofreceivebuffer.
publicconstintBufferSize=256;
//Receivebuffer.
分享到:
评论

相关推荐

    C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...

    C#.net同步异步SOCKET通讯和多线程总结2[参照].pdf

    C#.net 同步异步 SOCKET 通讯和多线程总结 本文旨在总结 C#.net 中的同步异步 SOCKET 通讯和多线程编程,涵盖服务端和客户端的实现细节。 一、服务端实现 服务端使用 System.Net 和 System.Net.Sockets 命名空间...

    C#实现Socket异步通信完整封装库源码

    本篇文章将详细探讨C#中实现Socket异步通信的封装库源码,主要涵盖`SocketListener`、`SocketClient`和`TcpService`的封装,以及异步实现的相关类定义。 首先,`SocketListener`是服务器端的核心组件,用于监听特定...

    C#+Socket异步传输,c#socket通信,C#

    1. **异步操作模式**:C#的异步Socket通信基于回调机制,当数据发送或接收完成时,会触发预先注册的回调函数。这使得主程序可以继续执行其他任务,而不必等待网络操作完成。 2. **事件驱动编程**:异步Socket编程...

    [C#通信二]C#.net同步异步SOCKET通讯和多线程总结

    【C#通信二】C#.NET同步异步SOCKET通讯和多线程总结 在C#.NET编程中,网络通信是应用开发中的一个重要部分。本文将深入探讨如何使用同步和异步方式通过SOCKET进行通信,以及如何结合多线程技术来实现高效的数据交换...

    C#dotnet同步异步SOCKET通讯和多线程总结

    C#dotnet同步异步SOCKET通讯和多线程总结

    C#异步socket接收组件和调用示例

    本文将详细解析“C#异步socket接收组件和调用示例”中的关键知识点,帮助开发者理解如何利用异步Socket进行高效的数据传输。 1. **异步Socket编程**: 异步Socket编程是C#中实现网络通信的一种重要方式,它允许...

    C# Socket异步通信+事件与委托+通信程序与界面分离

    本教程主要探讨如何使用C#的Socket实现异步通信,并结合事件和委托来处理通信过程中的消息传递,以及如何将通信逻辑与用户界面(UI)分离,以实现更高效、更灵活的程序设计。 首先,让我们理解什么是Socket异步通信。...

    c# socket 异步通信 例子

    C#中的异步Socket通信主要依赖两个关键方法:`BeginConnect`和`EndConnect`用于建立连接,`BeginSend`和`EndSend`用于发送数据,以及`BeginReceive`和`EndReceive`用于接收数据。 1. **建立异步连接** 使用`...

    c#写的Scoket异步高并发并客户端和服务器

    而异步Socket编程则通过回调机制,让服务器可以在不阻塞主线程的情况下处理多个连接,极大地提高了系统的可扩展性和性能。 描述中提到的"校验"可能指的是在网络通信中对数据的完整性和安全性进行验证。这通常涉及到...

    C#同步异步SOCKET通讯和多线程总结.doc

    本文将详细探讨C#中的同步和异步SOCKET通讯,以及如何结合多线程技术来实现高效的应用。 首先,Socket分为三种类型:Stream Socket(流套接字)、Dgram Socket(数据包套接字)和Raw Socket(原始套接字)。流套接...

    C#实现的多线程异步Socket数据包接收器框架[整理].pdf

    【C#实现的多线程异步Socket数据包接收器框架】 C#中的多线程异步Socket数据包接收器框架是一种高效且可靠的方法,用于处理来自多个客户端的数据传输。在给定的描述中,我们可以看到这个框架是为了解决交通流量数据...

    可扩展多线程异步Socket服务器框架EMTASS 2.0(C#版)

    用C#实现的、基于.NET 2.0的可扩展多线程异步Socket服务器框架EMTASS 2.0(C#版)源码和Demo。有关该框架的设计说明请参考拙文:http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx。

    可扩展多线程异步Socket服务器框架EMTASS 2.1(C#版)

    用C#实现的、基于.NET 2.0的可扩展多线程异步Socket服务器框架EMTASS 2.1源码和Demo。有关该框架的设计说明请参考拙文:http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx

    多线程异步Socket服务器框架EMTASS 1.1(C#版)

    **多线程异步Socket服务器框架EMTASS 1.1(C#版)** EMTASS(Easy Multi-threaded Asynchronous Socket Server)1.1是C#编程语言实现的一个高性能、可扩展的多线程异步Socket服务器框架。这个框架专为处理大量并发...

    C#中使用异步Socket实现点对点通信

    总结,C#中使用异步Socket实现点对点通信涉及多线程、非阻塞I/O、并发处理和网络协议等复杂概念。理解并熟练掌握这些知识点,对于构建高效、可靠的P2P应用程序至关重要。通过分析提供的源代码和资源,可以更深入地...

    异步Socket实现TCP网络服务的CS的通讯构架

    9. **性能优化**:异步Socket可以通过预分配缓冲区、使用BufferManager等技术优化性能,减少内存分配和复制。 10. **状态机设计**:在实现CS通信时,可以使用状态机模式来跟踪Socket的当前状态,以确保正确处理各种...

Global site tag (gtag.js) - Google Analytics