http://c.biancheng.net/socket/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
//服务端
namespace Test_Socket_Server
{
class Program
{
//声明套接字实例,用于与客户端通信
static Socket listenSocket;
//定义字典集合,用于存储客户端信息(键:客户端ip、端口,值:与客户端通信套接字)
static Dictionary<string, Socket> clientConnectionItems = new Dictionary<string, Socket>();
static void Main(string[] args)
{
//定义套接字用于监听
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将ip、端口绑定到网络终结点
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5678);
//绑定终结点
listenSocket.Bind(ip);
//设定监听的队列长度最大数量为10
listenSocket.Listen(10);
Console.WriteLine("服务端开始监听!");
#region 创建监听线程
//开启监听线程
Thread thread = new Thread(ListenClient);
//设置为后台同步线程,随着主线程结束而结束
thread.IsBackground = true;
//开启此线程
thread.Start();
#endregion
Console.ReadKey();
}
static void ListenClient()
{
while (true)
{
Socket newSocket = listenSocket.Accept();
//客户端网络终结点号
string clientRemoteEndPoint = newSocket.RemoteEndPoint.ToString();
//通知已存储客户端,新客户端连接
if (clientConnectionItems.Count > 0)
{
foreach (var item in clientConnectionItems)
{
item.Value.Send(new UTF8Encoding().GetBytes("服务端:客户端" + newSocket.RemoteEndPoint.ToString() + "已上线!"));
}
clientConnectionItems.Add(clientRemoteEndPoint, newSocket);
}
else
{
//存储客户端
clientConnectionItems.Add(clientRemoteEndPoint, newSocket);
}
Console.WriteLine("客户端" + clientRemoteEndPoint + "连接到服务端!");
//获取客户端的IP和端口号
IPAddress clientIP = (newSocket.RemoteEndPoint as IPEndPoint).Address;
int clientPort = (newSocket.RemoteEndPoint as IPEndPoint).Port;
//向客户端发送连接成功的提示信息
string message = "本地IP:" + clientIP + " 本地端口:" + clientPort.ToString() + " 连接服务端成功!";
byte[] msg = Encoding.UTF8.GetBytes(message);
newSocket.Send(msg);
//创建一个通信线程
Thread thread = new Thread(ReceiveMessage);
thread.IsBackground = true;
thread.Start(newSocket);
}
}
// 接收客户端发来的信息
static void ReceiveMessage(Object socket)
{
Socket newSocket = (Socket)socket;
//Socket newSocket = socket as Socket;
//监听消息
while (true)
{
//创建一个缓冲区
byte[] buffer = new byte[1024];
try
{
//存入缓存并获取实际接收的字节数
int length = newSocket.Receive(buffer);
//将接受到的字节数组转换为字符串
string message = Encoding.UTF8.GetString(buffer, 0, length);
//string message = new UTF8Encoding().GetString(buffer);
Console.WriteLine("客户端:" + newSocket.RemoteEndPoint.ToString() + message);
//发送客户端数据
if (clientConnectionItems.Count > 0)
{
foreach (var item in clientConnectionItems)
{
item.Value.Send(Encoding.UTF8.GetBytes(newSocket.RemoteEndPoint + ":" + message));
}
}
}
catch
{
//提示套接字监听异常
Console.WriteLine("客户端:" + newSocket.RemoteEndPoint.ToString() + "断开!");
clientConnectionItems.Remove(newSocket.RemoteEndPoint.ToString());
//关闭
newSocket.Close();
break;
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
//客户端
namespace Test_CSharp_Client
{
class Program
{
static Socket socket;
static void Main(string[] args)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建要连接的ip
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5678);
try
{
Console.WriteLine("发起连接!");
socket.Connect(ip);
}
catch (Exception)
{
Console.WriteLine("连接失败!");
return;
}
Thread thread = new Thread(ReceiveServerMessage);
thread.IsBackground = true;
thread.Start();
while (true)
{
string message = Console.ReadLine();
ClientSendMessage(message);
}
}
//接收服务端信息
public static void ReceiveServerMessage()
{
while (true)
{
//定义缓冲区
byte[] buffer = new byte[1024];
try
{
//将客户端套接字接收到的数据存入缓冲区,并获取长度
int length = socket.Receive(buffer);
//将套接字获取到的字符数组转换为字符串
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("服务器:" + message);
}
catch
{
Console.WriteLine("远程服务器已经中断连接,不再接收来自服务端的消息!");
break;
}
}
}
//发送信息到服务端
public static void ClientSendMessage(string message)
{
try
{
//将字符串转换为字节数组
byte[] byteMessage = Encoding.UTF8.GetBytes(message);
//发送
socket.Send(byteMessage);
}
catch
{
Console.WriteLine("服务器异常,无法发送!");
}
}
}
}