Server:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace TCP_Server
{
internal class Program
{
private static readonly byte[] Buffer = new byte[1024];
private static int _count; private static void Main()
{
WriteLine("Server is ready.", ConsoleColor.Green); //①创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //②将该socket绑定到主机上面的某个端口
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 7788)); //③启动监听,并且设置一个最大的队列长度
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(3); //④开始接受客户端连接请求
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
Console.ReadLine();
} // 客户端连接成功
public static void ClientAccepted(IAsyncResult ar)
{
//设置计数器
_count++;
var socket = ar.AsyncState as Socket;
//这就是客户端的Socket实例,我们后续可以将其保存起来
if (socket != null)
{
var client = socket.EndAccept(ar); //客户端IP地址和端口信息
IPEndPoint clientipe = (IPEndPoint)client.RemoteEndPoint; WriteLine(clientipe + " is connected,total connects " + _count, ConsoleColor.Yellow); //接收客户端的消息
client.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
} //准备接受下一个客户端连接请求
if (socket != null) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
} // 接收客户端的信息
public static void ReceiveMessage(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
//客户端IP地址和端口信息
if (socket != null)
{
IPEndPoint clientipe = (IPEndPoint)socket.RemoteEndPoint;
try
{
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//读取出来消息内容
var message = Encoding.UTF8.GetString(Buffer, 0, length);
//输出接收信息
WriteLine(clientipe + " :" + message, ConsoleColor.White);
//服务器发送消息
socket.Send(Encoding.UTF8.GetBytes("Server received data"));
//接收下一个消息
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch (Exception)
{
//设置计数器
_count--;
//断开连接
WriteLine(clientipe + " is disconnected,total connects " + (_count), ConsoleColor.Red);
}
}
} public static void WriteLine(string str, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
}
}
}

  Client:

using System;
using System.Net.Sockets;
using System.Text; namespace TCP_Client
{
internal class Program
{
private static readonly byte[] Buffer = new byte[1024]; private static void Main()
{
try
{
//①创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //②连接到指定服务器的指定端口
socket.Connect("127.0.0.1", 7788); WriteLine("Client: Connect to server success!", ConsoleColor.White); //③实现异步接受消息的方法 客户端不断监听消息
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); //④接受用户输入,将消息发送给服务器端
while (true)
{
var message = Console.ReadLine();
if (message != null)
{
var outputBuffer = Encoding.UTF8.GetBytes(message);
socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
}
}
}
catch (Exception ex)
{
WriteLine("Client: Error " + ex.Message, ConsoleColor.Red);
}
finally
{
Console.Read();
}
} // 接收信息
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket; //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
if (socket != null)
{
var length = socket.EndReceive(ar);
var message = Encoding.ASCII.GetString(Buffer, 0, length);
WriteLine(message, ConsoleColor.White);
} //接收下一个消息
if (socket != null)
{
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
}
catch (Exception ex)
{
WriteLine(ex.Message, ConsoleColor.Red);
}
} public static void WriteLine(string str, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
}
}
}

  

C# socket异步通讯的更多相关文章

  1. .net平台下socket异步通讯(代码实例)

    你应该知道的.net平台下socket异步通讯(代码实例) 1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上 ...

  2. 你应该知道的.net平台下socket异步通讯(代码实例)

    1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上添加TextBox控件 using System.Net; ...

  3. C#上位机之—WinForm实现Socket异步通讯示例

    工作中常用到的一些知识点,总是用完就忘,第一次尝试用博客记录下来,以备后用: Socket通讯,Socket(套接字)是基于TCP/IP通讯方式的封装好的类,调用时需要添加下面的服务引用: using ...

  4. c++Socket 异步通讯

    在网络通讯中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回,这种现象叫做阻塞. Winsock对有可能阻塞的函数提供了两种处理方式:阻 ...

  5. Socket异步通讯

    1.可以通过多线程来解决(一会补上) 2.Socket在tcp/udp两种通信协议下的异步通信: 基于TCP的异步通信: BeginAccept方法和endeaccept方法 包含在System.Ne ...

  6. .net平台下socket异步通讯

    1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上添加TextBox控件 using System.Net; ...

  7. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  8. socket异步编程--libevent的使用

    使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...

  9. Socket异步发送的同步控制

    在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...

随机推荐

  1. ubuntu切换root用户

    方法一:sudo su命令 方法二:sudo -i 方法三:su root

  2. c++ 使用 gsoap 调用 WebService 中文乱码

    c++ 使用 gsoap 调用  WebService 中文乱码   问题产生: 使用gsoap时,如果WebService服务端及客户调用端都使用 C++ , 再传递中文时不会存在乱码问题, 当客户 ...

  3. 向PHP使用Post方式上传文件

    欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti 1.post-file.html form表单提交方式一定要是post,而且添加属性enctype= ...

  4. vue axios异步请求django

    1,配置请求路径 (1),vue中的请求路径要与django视图路径相同. (2),vue中的路由路径也要和django视图路径相同,比如视图路径为127.0.0.1:8000:home/index, ...

  5. 修改Vue中的 v-html 内的元素无效问题

    其原因就是在 style 样式中没有去处scoped 因为 v-html 会把内容当成子组件,而scoped 会在本身的组件中起作用

  6. Flink接收RabbitMQ数据写入到Oracle

    文件内容 项目案例: https://github.com/TaoPanfeng/case/tree/master/03-flink/flink-rabbitmq-oracle FlinkMain.j ...

  7. centos7重启网卡报Job for network.service failed because...错误

    解决: [root@mina0 hadoop]# systemctl stop NetworkManager[root@mina0 hadoop]# systemctl disable Network ...

  8. php--常见算法2

    <?php function zhi($number){ $f1=1; $f2=1; for($i=3;$i<=$number;$i++){ //前一个的前一个值+前一个值 $f3=$f1 ...

  9. OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发

    OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发 摘要: 记录实验过程中踩到的坑.介绍OPNsense防火墙的安装配置并搭建实验环境,利用msf的模块及ssh进行流量转发(LAN向DMZ ...

  10. 《python解释器源码剖析》第10章--python虚拟机中的一般表达式

    10.0 序 上一章中,我们通过PyEval_EvalFrameEx看到了python虚拟机的整体框架,那么这一章我们将深入到PyEval_EvalFrameEx的各个细节当中,深入剖析python的 ...