服务端

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SocketServer
{
class Program
{
static void Main(string[] args)
{
ServerStart();
Console.ReadKey();
}

static void ServerStart()
{
//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
//参数有 指定的地址族、套接字类型和协议
Socket serverSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//把一个ipv4或ipv6地址和端口号组合赋给socket
serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),4399 ));
//启动监听,并且设置一个最大的队列长度
serverSocket.Listen(0);
Console.WriteLine("服务器启动了!");
//开始异步接受客户端连接请求
serverSocket.BeginAccept(AcceptCallBack,serverSocket);
}
//设置一个缓冲区,用来保存数据
static byte[] data=new byte[1024];
//异步接收客户端连接请求的回调方法
static void AcceptCallBack(IAsyncResult result)
{
Socket serverSocket=result.AsyncState as Socket;
//这就是客户端的Socket实例,可以将其保存起来
Socket clientSocket=serverSocket.EndAccept(result);
//给客户端发送一个欢迎消息
clientSocket.Send(System.Text.Encoding.UTF8.GetBytes("欢迎连接我!"));
//异步接收客户端发过来的消息
clientSocket.BeginReceive(data,0,data.Length,SocketFlags.None,ReceiveCallBack,clientSocket);
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}

//异步接收客户端发过来消息的回调方法
static void ReceiveCallBack(IAsyncResult result)
{
Socket clientSocket = null;
try
{
clientSocket = result.AsyncState as Socket;
int count = clientSocket.EndReceive(result);
if (count == 0)
{
clientSocket.Close();
return;
}
string message = System.Text.Encoding.UTF8.GetString(data, 0, count);
//读取出来消息内容
Console.WriteLine("收到了来自客户端:" + clientSocket.SocketType.ToString() + "发过来的消息:" + message);
//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
clientSocket.BeginReceive(data, 0, data.Length, SocketFlags.None, ReceiveCallBack, clientSocket);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
if (clientSocket!=null)
{
clientSocket.Close();
}
}

}
}

}

客户端

using System;
using System.Collections.Generic;
using System.Diagnostics.SymbolStore;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace SocketClient
{
class Program
{
static void Main(string[] args)
{
ClientSocketStart();
Console.ReadKey();
}

//接收数据的缓存区;
static byte[] buffer = new byte[1024];
static void ClientSocketStart()
{
//创建一个Socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到指定服务器的指定端口
EndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4399);
clientSocket.Connect(endPoint);
Console.WriteLine("客户端启动了");
//异步接收服务端的消息的方法
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, clientSocket);
//接受用户输入,将消息发送给服务器端
while (true)
{
string message = Console.ReadLine();
if (string.IsNullOrEmpty(message))
{
Console.WriteLine("输入为空请重新输入");
continue;
}
//关闭的条件
if (message.Equals("c"))
{
clientSocket.Close();
return;
}
byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
//异步发送消息
clientSocket.BeginSend(data, 0, data.Length,SocketFlags.None,null,null);
}
}

//异步接收服务端的消息的回调方法
static void ReceiveCallBack(IAsyncResult result)
{
Socket clientSocket=result.AsyncState as Socket;
int count=clientSocket.EndReceive(result);
string message = System.Text.Encoding.UTF8.GetString(buffer, 0, count);
Console.WriteLine("收到了服务端发过来的消息:"+message);
}

}
}