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. POSTGRESQL日期函数大全

    一:各个数据中的连接符 SqlServer的连接符:+(加号) Sqlite的连接符:.(点) PostgreSQL的连接符:||(或) 二: 今天在PostgreSQL计算日期的时候,翻了一些资料, ...

  2. C语言一行太长的换行处理

    转载:https://blog.csdn.net/baiqishijkh/article/details/79236202 在C语言程序编写中,我们有时会遇到一行代码太长而影响阅读或者出现与部分公司或 ...

  3. 并不对劲的复健训练-CF1187D

    题目大意 有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) ).一次操作是选取 \([l,r]\ ...

  4. And Reachability CodeForces - 1169E (有向图可达性)

    大意: 给定序列$a$, 对所有的a[i]&a[j]>0, 从$i$向$j$连一条有向边, 给出$m$个询问$(x,y)$, 求是否能从$x$到达$y$. 裸的有向图可达性, 有向图可达 ...

  5. string库

    Lua字符串库小集 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string.rep(s,n) 返回字符串s重复n次的 ...

  6. svn安装方法

    1.下载site-1.6.5svn插件 2.

  7. MYSQL 创建数据库以及表

    创建数据库,表 创建一个数据库,再在数据库下创建一个或多个表,不难,记不住的同学可以直接copy,慢慢的用会即刻,懂的同学请看代码,没有太多基础的同学,除了看代码,请看最下方的知识点 创建数据库: C ...

  8. element-ui 表格可编辑添加删除

    <template> <div id="Cold_all"> <div class="Cold_Left"> <el- ...

  9. 使用dockerfile构建nginx镜像 转

      docker构建镜像的方法:   commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...

  10. Line 算法与deepwalk的对比 和个人理解

    用户的关注关系本身就是一个图结构,要从用户关注关系生成用户的embedding表示,其实就是做graph的emebding表示. deepwalk+word2vec 比较简单,效果也还可以.这种方法再 ...