版权声明:欢迎转载,转载请注明原博客链接:http://blog.csdn.net/u013108312 和本文章的链接。谢谢合作。作者:CircleGood https://blog.csdn.net/u013108312/article/details/70543911
本文固定链接:http://blog.csdn.net/u013108312/article/details/70543911
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace server
{
class Program
{
private static Socket server;
static void Main(string[] args)
{
//创建监听连接实例
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定监听地址及端口
server.Bind(new IPEndPoint(IPAddress.Any,10001));
//设置监听的等待队列长度并开启监听
server.Listen(10);
//无限循环,监听客户端的连接
while (true) {
//监听客户端连接,当有客户端连接的时候,返回连接的客户端的连接信息
Socket client = server.Accept();
Console.WriteLine("客户端接入");
//监听客户端的消息
receiveMessage(client);
}
}
private static void receiveMessage(Socket client) {
try
{
//创建消息接收缓冲数组
byte[] buff = new byte[1024];
//将消息读入缓冲区 并获取消息长度
int size = client.Receive(buff);
//打印收到的消息内容
Console.WriteLine(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(buff, 0, size));
//尾递归 继续监听消息到来
receiveMessage(client);
}
catch (Exception e) {
Console.WriteLine("客户端断开");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace client1
{
class Program
{
private static Socket client;
private static byte[] bytearray = new byte[1024];//消息接收缓冲区
static void Main(string[] args)
{
//创建连接实例
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到服务器
client.Connect("127.0.0.1", 10001);
//开启异步消息接收,将消息写入缓冲区
client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
//监听用户输入
input();
}
private static void ReceiveCallBack(IAsyncResult result)
{
//获取连接实例
Socket client = (Socket)result.AsyncState;
try
{
//结束本次异步接收并获取消息长度
int size = client.EndReceive(result);
//打印收到的消息信息
Console.WriteLine(Encoding.UTF8.GetString(bytearray, 0, size));
//重新开启连接实例的异步接收
client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
}
catch (Exception e)
{
Console.WriteLine("服务器把你踢了");
}
}
private static void input() {
//获取控制台输入的一行字符
string txt = Console.ReadLine();
//判断输入内容是否为空
if (txt.Trim().Equals(string.Empty)) {
//打印即将退出信息
Console.WriteLine("按下任意键退出程序");
//监听任意按键 跳出当前方法
Console.Read();
return;
}
//讲输入内容转换为byte数组
byte[] bytearray= Encoding.UTF8.GetBytes(txt);
//通过连接实例将转换后的内容 发送至服务器
client.Send(bytearray);
//尾递归,继续监听输入
input();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Net;
namespace server2
{
class Program
{
private static Socket server;
private static Dictionary<Socket, byte[]> caches = new Dictionary<Socket, byte[]>();
static void Main(string[] args)
{
//创建监听连接实例
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定监听地址及端口
server.Bind(new IPEndPoint(IPAddress.Any,10001));
//设置监听的等待队列长度并开启监听
server.Listen(10);
while (true) {
//监听客户端连接,当有客户端连接的时候,返回连接的客户端的连接信息
Socket client = server.Accept();
Console.WriteLine("客户端接入");
//为当前客户端创建消息接收缓冲区
byte[] bytearray=new byte[1024];
//将连接实例与缓冲区通过字典关联起来
caches.Add(client, bytearray);
//开启异步消息接收,将消息写入缓冲区
client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
}
}
private static void ReceiveCallBack(IAsyncResult result) {
//获取当前消息的发送者的连接实例
Socket client = (Socket)result.AsyncState;
try
{
//结束本次异步接收并获取消息长度
int size = client.EndReceive(result);
//根据连接实例从字典中获取缓冲区
byte[] bytearray = caches[client];
//打印当前接收到的消息内容
Console.WriteLine(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(bytearray, 0, size));
//将当前接收到的消息群发给当前服务器中的所有用户
brocast(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(bytearray, 0, size));
//重新开启连接实例的异步接收
client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
}
catch (Exception e) {
//监听客户端断开后 从字典中移除对应的连接关联
caches.Remove(client);
Console.WriteLine("客户端断开连接");
}
}
private static void brocast(string value) {
//将需要发送的消息转换为byte数组
byte[] bytearray = Encoding.UTF8.GetBytes(value);
//通过循环遍历 获取当前所有的连接对象 依次发送消息
foreach (Socket client in caches.Keys) {
//将转换好的消息发送给当前获取的客户端
client.Send(bytearray);
}
}
}
}