C# Socket 异步 聊天室
2013-04-10 09:45
211 查看
Socket 异步通信,线程池是由系统来维护线程的
注意:异步调用时,不能使用同步调用的方法,会线程阻塞
Server:
Client:
注意:异步调用时,不能使用同步调用的方法,会线程阻塞
Server:
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketDemo { class ClientInfo { public Socket Socket { get; set; } public bool IsOpen { get; set; } public string Address { get; set; } } // 管理Client class ClientManager { static List<ClientInfo> clientList = new List<ClientInfo>(); public static void Add(ClientInfo info) { if (!IsExist(info.Address)) { clientList.Add(info); } } public static bool IsExist(string address) { return clientList.Exists(item => string.Compare(address, item.Address, true) == 0); } public static void Close(string address) { clientList.ForEach(item => { if (string.Compare(address, item.Address, true) == 0) { item.IsOpen = false; } }); } // 发送消息到ClientList public static void SendMsgToClientList(string msg, string address = null) { byte[] bt = Encoding.UTF8.GetBytes(msg); clientList.ForEach(item => { if (item.IsOpen && (address == null || item.Address != address)) { item.Socket.BeginSend(bt, 0, bt.Length, SocketFlags.None, new AsyncCallback(SendTarget), item.Socket); } }); } private static void SendTarget(IAsyncResult res) { //Socket client = (Socket)res.AsyncState; //int size = client.EndSend(res); } } // 接收消息 class ReceiveHelper { public byte[] Bytes { get; set; } public void ReceiveTarget(IAsyncResult res) { Socket client = (Socket)res.AsyncState; int size = client.EndReceive(res); if (size > 0) { string stringdata = Encoding.UTF8.GetString(Bytes, 0, size); string address = client.RemoteEndPoint.ToString(); // 获取Client的IP和端口 if (stringdata.IndexOf("exit") > -1) { ClientManager.SendMsgToClientList(address + "已从服务器断开", address); ClientManager.Close(address); Console.WriteLine(address + "已从服务器断开"); Console.WriteLine(address + " " + DateTimeOffset.Now.ToString("G")); return; } else { Console.WriteLine(stringdata); Console.WriteLine(address + " " + DateTimeOffset.Now.ToString("G")); ClientManager.SendMsgToClientList(stringdata, address); } } // 继续等待 client.BeginReceive(Bytes, 0, Bytes.Length, SocketFlags.None, new AsyncCallback(ReceiveTarget), client); } } // 监听请求 class AcceptHelper { public byte[] Bytes { get; set; } public void AcceptTarget(IAsyncResult res) { Socket server = (Socket)res.AsyncState; Socket client = server.EndAccept(res); string address = client.RemoteEndPoint.ToString(); ClientManager.Add(new ClientInfo() { Socket = client, Address = address, IsOpen = true }); ReceiveHelper rs = new ReceiveHelper() { Bytes = this.Bytes }; IAsyncResult recres = client.BeginReceive(rs.Bytes, 0, rs.Bytes.Length, SocketFlags.None, new AsyncCallback(rs.ReceiveTarget), client); // 继续监听 server.BeginAccept(new AsyncCallback(AcceptTarget), server); } } class Program { static void Main(string[] args) { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 200)); // 绑定IP+端口 server.Listen(10); // 开始监听 Console.WriteLine("等待连接..."); AcceptHelper ca = new AcceptHelper() { Bytes = new byte[2048] }; IAsyncResult res = server.BeginAccept(new AsyncCallback(ca.AcceptTarget), server); string str = string.Empty; while (str != "exit") { str = Console.ReadLine(); Console.WriteLine("ME: " + DateTimeOffset.Now.ToString("G")); ClientManager.SendMsgToClientList(str); } server.Close(); } } }
Client:
using System; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleApplication { class Program { static byte[] inbytes = new byte[2048]; static byte[] oubytes = new byte[2048]; static void Main(string[] args) { // 连接到Server Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.BeginConnect("127.0.0.1", 200, new AsyncCallback(ConnectTarget), client); // 接收输入并发消息 string str = string.Empty; while (str != "exit") { Console.WriteLine("ME: " + DateTimeOffset.Now.ToString("G")); str = Console.ReadLine(); inbytes = Encoding.UTF8.GetBytes(str); client.BeginSend(inbytes, 0, inbytes.Length, SocketFlags.None, new AsyncCallback(SendTarget), client); } client.Close(); } static void ConnectTarget(IAsyncResult res) { Socket client = (Socket)res.AsyncState; client.EndConnect(res); client.BeginReceive(oubytes, 0, 2048, SocketFlags.None, ReceiveTarget, client); } static void SendTarget(IAsyncResult res) { //Socket client = (Socket)res.AsyncState; //int size = client.EndSend(res); } static void ReceiveTarget(IAsyncResult res) { Socket client = (Socket)res.AsyncState; int size = client.EndReceive(res); if (size > 0) { Console.WriteLine(Encoding.UTF8.GetString(oubytes, 0, size)); Console.WriteLine(client.RemoteEndPoint + " " + DateTimeOffset.Now.ToString("G")); } // 继续等待输入 client.BeginReceive(oubytes, 0, 2048, SocketFlags.None, new AsyncCallback(ReceiveTarget), client); } } }
相关文章推荐
- C# 异步TCP Socket聊天室(1服务器,N客户端)
- C# 异步TCP Socket聊天室(1服务器,N客户端)
- C# 异步TCP Socket聊天室(1服务器,N客户端)
- C# 异步TCP Socket聊天室(1服务器,N客户端)
- c#编写的基于Socket的异步通信系统--SanNiuSignal.DLL已开源
- C# 实现的异步 Socket 服务器
- 【手机网络游戏 编程】C#异步socketAPI调用 处理数据的流程
- 基于C#的socket编程的TCP异步实现
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分(转)
- c# Socket异步接收数据
- C# 实现的多线程异步Socket数据包接收器框架
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- Unity3D中简单的C#异步Socket实现
- C# server socket 异步
- C# socket编程 异步服务端 同步客户端
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架
- C# Socket异步聊天例子
- C# socket编程实践——简单聊天室
- C# Socket异步聊天例子