关于c#的Socket异步网络编程问题
发布网友
发布时间:2022-04-30 04:20
我来回答
共4个回答
懂视网
时间:2022-04-15 02:53
首先我们了解下关于异步编程的一些知识可以参考我在网上收集的一些资料C#异步Socket编程 我实现了基于异步通信的Socket服务器和客户端程序 下面是我的代码 第一步:首先新建一个服务端项目YBServerWindowsForms 然后在项目里添加一个自定义的类名为StateObje
首先我们了解下关于异步编程的一些知识可以参考我在网上收集的一些资料——C#异步Socket编程
我实现了基于异步通信的Socket服务器和客户端程序
下面是我的代码
第一步:首先新建一个服务端项目YBServerWindowsForms
然后在项目里添加一个自定义的类名为StateObject:
接着是界面设计代码ServerForm.Designer.cs
主要的逻辑控制代码ServerForm.cs
第二步 新建一个客户端项目名称为YBClientWindowsForms
下面是界面设计YBClientForm.Designer.cs:
主要的逻辑控制代码YBClientForm.cs:
本程序在Windows 7 下用VS2008调试通过
热心网友
时间:2022-04-15 00:01
这样的写法有点问题:
1)服务器端既然采用了异步方式Accept,就没有必要再启线程
2)估计allDone是一个ManualResetEvent。用ManualResetEvent的目的什么呢?
服务器端采用异步Accept的代码其实很简单,也不需要ManualResetEvent同步
public class AppTCPServer
{
public AppTCPServer(string localIP, int port)
{
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
EndPoint localEP = new IPEndPoint(IPAddress.Parse(localIP), port);
socket.Bind(localEP);
socket.Listen(100);
socket.BeginAccept(AcceptAsync, socket);
}
private void AcceptAsync(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
try
{
Socket client = socket.EndAccept(ar);
Console.WriteLine("客户端连接成功!客户端:{0}", client.RemoteEndPoint.ToString());
if (OnConnected != null)
{
OnConnected(this, new ClientConnectedEventArgs(client));
}
}
catch (Exception e)
{
Console.WriteLine("AcceptAsync发生异常,异常信息:\n{0}", e.Message);
}
finally
{
//继续异步Accept
socket.BeginAccept(AcceptAsync, socket);
}
}
//客户端连接后的事件 OnConnect
public event EventHandler<ClientConnectedEventArgs> OnConnected;
}
/// <summary>
/// 事件参数:接收客户端连接后的事件参数
/// </summary>
public class ClientConnectedEventArgs : EventArgs
{
public ClientConnectedEventArgs(Socket clientSocket)
{
ClientSocket = clientSocket;
}
public Socket ClientSocket { get; private set; }
}
class Program
{
static void Main(string[] args)
{
AppTCPServer server = new AppTCPServer("127.0.0.01", 8000);
server.OnConnected += server_OnConnected;
Console.WriteLine("按任意键结束程序……");
Console.ReadKey();
}
static void server_OnConnected(object sender, ClientConnectedEventArgs e)
{
Socket client = e.ClientSocket;
string hello = "Hello from AppTCPServer";
client.Send(Encoding.Default.GetBytes(hello));
}
}
客户端测试程序
class Program
{
static void Main(string[] args)
{
//模拟100个客户连接服务器
for (int i = 0; i < 100; i++)
{
Socket socket = ConnectToServer("127.0.0.1", 8000);
byte[] buffer = new byte[1024];
int bytesRecevied = socket.Receive(buffer, buffer.Length, SocketFlags.None);
byte[] messageBytes = new byte[bytesRecevied];
Array.Copy(buffer, messageBytes, bytesRecevied);
Console.WriteLine(Encoding.Default.GetString(messageBytes));
socket.Disconnect(false);
socket.Close();
}
Console.ReadKey();
static Socket ConnectToServer(string serverIP, int serverPort)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
socket.Bind(localEP);
socket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort));
return socket;
}
}
热心网友
时间:2022-04-15 01:19
在AcceptCallback方法中,一方面要用newSocket.BeginReceive方法开始接收,一方面要调用Socket.BeginAccept继续接收连接尝试。
热心网友
时间:2022-04-15 02:54
很高兴协助你完成朋友
C# SOCKET 异步接收的问题
那么同步与异步分别应用于什么情况呢?假如用户的socket连接数据比较短暂的。一次连接直接发送数据的或客户端比较少的就使用同步假如用户的socket属于长时间连接的就使用异步方式
C# Socket 异步通讯
在异步RecVing方法中有两点可以改进:1)增加异常处理,目的是:即使发生异常也保证Socket能正常工作。2)调用 EndAceept返回的是正在与客户端连接的sockt private static void RecVing(IAsyncResult Result){ //通过 result 获取socket。在这个socket上你启动了BeginAccept操作 Socket socket = Result....
C# C/S网络编程 由于系统缓存空间不足或列队已满,不能执行套接字上的...
// 继续异步接收 ReceiveMsg();// 完成前一次异步接收EndReceive处理 UdpState udpReceiveState = iar.AsyncState as UdpState;//……} 要注意的是:1)Socket异步接收处理过程中用到了.net framework内部线程池,而线程池中线程的数量是有限制的。2)ReceiveMsg中的 while(true)循环是多余的 3)Rec...
C#Socket(tcp)异步批量发送文件问题
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个...
C#socket异步怎么实现 线程间通信如何实现
基于C#的socket编程的TCP异步实现一、摘要 本篇博文阐述基于TCP通信协议的异步实现。二、实验平台 Visual Studio 2010三、异步通信实现原理及常用方法3.1 建立连接 在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器。相对地,在异步模式下,服务器可以使用BeginAccept方法和End...
C#Socket无连接异步传输
PORT) 这样就形成了一个服务器ENDPOINT(IP+PORT) 然后自己生成一个SOCKET实例 再连接那个服务器ENDPOINT 再通过这个SOCKET实例传输自己的BYTE流 编IM还是很复杂的 尤其是线程和异步调用的问题 SOCKET只是第一步 和网页的那种伪IM完全不一样的 还有什么问题的话可以HI我 不过我也是菜鸟 只能尽力而为了 ...
用Socket做链接的C#服务器和android客户端,不在同一个电脑上就连不上...
socket是通过ip地址和端口号链接的 在同一个局域网内比如有一台服务器,两台客户端。服务器IP:10.0.0.112,开放端口为8888 客户端的socket就应该这样写 socketAddress address=new IntSocketAddress("10.0.0.112",8888);Socket socket=new Socket(address,int); //这句会让你处理异常,可以...
C# socket tcpclient类库编程为什么我只能连在局域网和本机,不可以连...
tcpListener 是监听本地的tcp连接请求的。你要连接别的机器,你用tcpclient去连。对方机器开放的端口,并且有响应程序的,你链接才有效。你可以自己模拟写一个监听的,再写一个请求的。自己连自己看看,你就知道怎么回事了。具体逻辑是,client请求server端,server端的接收到请求后,做出响应。这之间的...
c#socket异步连接后怎样判断连接是否成功
} } private void connCallBack(IAsyncResult ar) { Socket s = (Socket)ar.AsyncState; try { s.EndConnect(ar); isConnected = s.Connected; } catch (Exception ex)
c#socket在使用TCP或UDP异步通信的时候SocketAsyncEventArgs和...
1、在使用SocketAsyncEventArgs进行TCP或UDP通讯的时候最常用的几个成员分别是:Buffer,BufferList,BytesTransferred,SocketError,UserToken,BytesTransferred属性,SetBuffer方法和Completed事件。2、SocketAsyncEventArgs接收和发送数据都需要设置buffer,一般用SetBuffer方法或设置BufferList。通过Completed来查看完成情况,而...