Client(客户端)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace Socket异步通信客户端
{
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", 256);
Console.WriteLine("连接服务器成功!", 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)
{
Console.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.UTF8.GetString(Buffer, 0, length);
Console.WriteLine(message, ConsoleColor.White);
}
//接收下一个消息
if (socket != null)
{
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message, ConsoleColor.Red);
}
}
}
}
Server(服务器)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Timers;
namespace Socket异步通信_服务端
{
internal class Program
{
private static readonly byte[] bs = new byte[1024];
private static int count;
static void Main(string[] args)
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, 256));//绑定端口
Console.WriteLine("******服务器已启动,等待客户连接********");
socket.Listen(1000);//启动监听,设置最大的队列长度
//开始接受客户端连接请求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
Console.ReadLine();
}
private static void CheckListen(object sender, ElapsedEventArgs e)
{
throw new NotImplementedException();
}
public static void ClientAccepted(IAsyncResult ar)
{
count++;//计数器
var socket = ar.AsyncState as Socket;
//客户端Socket实例,后续保存
if (socket != null)
{
var client = socket.EndAccept(ar);
//客户端IP地址和端口信息
IPEndPoint colientip = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine(colientip+"一个客户已连接"+count,ConsoleColor.Yellow);
//接受客户端消息
client.BeginReceive(bs, 0, bs.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), client);
}
//准备接受下一个客户端连接请求
if (socket != null) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
//接受客户端的消息
public static void ReceiveMsg(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
//客户端IP地址和端口消息
if (socket != null)
{
IPEndPoint clientipe = (IPEndPoint)socket.RemoteEndPoint;
try
{
var length = socket.EndReceive(ar);
var message = Encoding.UTF8.GetString(bs, 0, length);
Console.WriteLine(clientipe+":"+message,ConsoleColor.White);
socket.Send(Encoding.UTF8.GetBytes("服务器收到消息"));
socket.BeginReceive(bs, 0, bs.Length, SocketFlags.None, new AsyncCallback(ReceiveMsg), socket);
}
catch (Exception)
{
count--;
Console.WriteLine(clientipe+"断开连接"+(count),ConsoleColor.Red);
}
}
}
}
}