`

用C#编写可以广播的SOCKET服务器端

    博客分类:
  • C#
阅读更多
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace SocketServer
{
    public class SocketHost
    {
        private IDictionary<Socket, byte[]> socketClientSesson = new Dictionary<Socket, byte[]>();

        private List<string> message = new List<string>();
        private Boolean isClear = true;

        public int Port { get; set; }

        public void Start()
        {
            Boardcast();

            var socketThread = new Thread(() =>
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, this.Port);

                //绑定到通道上
                socket.Bind(iep);

                //侦听
                socket.Listen(6);

                //通过异步来处理
                socket.BeginAccept(new AsyncCallback(Accept), socket);
            });

            socketThread.Start();

            Console.WriteLine("Server Started");
        }

        private void Accept(IAsyncResult ia)
        {
            Socket socket = ia.AsyncState as Socket;
            var client = socket.EndAccept(ia);

            socket.BeginAccept(new AsyncCallback(Accept), socket);

            byte[] buf = new byte[1024];
            this.socketClientSesson.Add(client, buf);

            try
            {
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
                string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
                Console.WriteLine("Client ({0}) Connected", sessionId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error:\r\n" + ex.ToString());
            }
        }

        private void Receive(IAsyncResult ia)
        {
            var client = ia.AsyncState as Socket;

            if (client == null || !this.socketClientSesson.ContainsKey(client))
            {
                return;
            }

            int count = client.EndReceive(ia);

            byte[] buf = this.socketClientSesson[client];

            if (count > 0)
            {
                try
                {
                    client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
                    string context = Encoding.UTF8.GetString(buf, 0, count);
                    PushMessage(context);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Receive Error :\r\n{0}", ex.ToString());
                }
            }
            else
            {
                try
                {
                    string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
                    client.Disconnect(true);
                    this.socketClientSesson.Remove(client);
                    Console.WriteLine("Client ({0}) Disconnet", sessionId);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: \r\n" + ex.ToString());
                }
            }
        }

        private void PushMessage(string context)
        {
            while (context.EndsWith("\n") || context.EndsWith("\0"))
            {
                context = context.Remove(context.Length - 1);
            }

            Console.WriteLine("Get : {0}", context); 
            message.Add(context);
            isClear = false;
        }

        private void Boardcast()
        {
            var boardcaseThread = new Thread(() =>
            {
                while (true)
                {
                    if (!isClear)
                    {
                        byte[] tmp = Encoding.UTF8.GetBytes(message[0] + "\0\n");
                        foreach (KeyValuePair<Socket, byte[]> node in this.socketClientSesson)
                        {
                            Socket client = node.Key;
                            client.Send(tmp, tmp.Length, SocketFlags.None);
                        }
                        message.RemoveAt(0);
                        isClear = message.Count > 0 ? false : true;
                    }
                }
            });

            boardcaseThread.Start();
        }
    }
}
分享到:
评论

相关推荐

    C# socket封装类和组件含例程全部开源

    4. **例程**:这些例程展示了如何使用封装后的Socket类进行实际的网络通信,可能涵盖了TCP连接、UDP广播、文件传输等多种应用场景。 5. **异常处理**:良好的封装会考虑到各种可能出现的网络异常,如连接中断、超时...

    c#编写的聊天室(c#2005编写)

    【C#编写的聊天室】是一种使用C#编程语言开发的多用户实时交流平台,它基于C# 2005版本实现。C#(读作"C Sharp")是微软公司推出的面向对象的编程语言,它以其简洁、类型安全和性能高效而受到广大开发者喜爱。在2005...

    客户端和服务器端通信程序C#代码

    在C#中,我们可以使用System.Net命名空间下的Socket类来创建TCP/IP连接,实现客户端和服务器端的通信。 1. **客户端程序实现**: - 创建Socket实例,指定协议类型(如TCP)和远程服务器的IP地址和端口号。 - 使用...

    C#局域网聊天程序服务器端

    在这个项目中,C#用于编写服务器端的业务逻辑和界面展示。 2. **网络编程**: - **Socket编程**:在C#中,Socket类是进行网络通信的基础,用于建立客户端和服务器之间的连接。ChatServer可能使用TcpListener监听...

    c#实现socket通讯.zip 完整代码 可以直接运行

    8. **多线程和并发**:在服务器端,为了处理多个客户端的并发连接,通常会创建多个线程或者使用异步回调。C#中的ThreadPool是一个理想的工具,可以有效地管理和调度工作线程。 9. **安全性**:考虑到网络安全,C#的...

    聊天工具、序列化、Socket、使用Tcp例子 内含C#编写源代码

    服务器端负责监听客户端的连接请求,并管理多个客户端的连接,当接收到客户端的消息时,广播到所有已连接的客户端。客户端则用于向服务器发送消息,并接收其他客户端发送的消息。C#中的System.Net.Sockets命名空间...

    C#基于socket编写的简单的局域网通信(源代码)

    本项目"基于C#的简单局域网通信"是一个很好的起点,它展示了如何使用Socket类创建一个简单的聊天应用程序,涵盖了客户端和服务器端的实现。 首先,让我们了解一下Socket。Socket是网络通信的基本单元,可以理解为两...

    用C#编写单线程聊天室

    总的来说,"用C#编写单线程聊天室"是一个基础的网络编程实践,可以帮助开发者熟悉Socket类以及基本的网络通信流程。然而,实际的聊天应用会面临并发连接、安全性、性能优化等问题,需要更复杂的设计和编程技巧来解决...

    简单聊天室(C#编写)

    通过这个项目,你可以了解如何使用C#编写服务器和客户端程序,如何建立和维护Socket连接,以及如何在多线程环境下管理并发操作,这些都是在网络应用开发中不可或缺的知识点。同时,通过阅读和分析代码,你还能提升你...

    c#socket编程实现聊天程序

    本文将深入探讨如何使用C#语言来实现一个基于Socket的聊天程序,这将涉及到网络编程的基础概念、C#的Socket类以及如何构建一个简单的聊天服务器。 首先,我们需要理解什么是Socket。Socket,也称为网络套接字,是...

    Socket_Chat_C#Socket通信_

    C#提供了丰富的类库,使得Socket编程变得相对简单,我们可以利用这些类库创建客户端和服务器端,从而进行实时的数据交换。 首先,我们要理解Socket的基本概念。Socket是网络通信中的一个抽象层,它是两台机器间通信...

    Socket UDP 服务+客户端 c#

    在C#中,我们可以使用System.Net.Sockets命名空间下的UdpClient类来实现UDP通信。以下是一些关键知识点: 1. **创建UDP服务器**: - 实例化UdpClient对象,指定监听的IP地址和端口号。 - 使用BeginReceive方法...

    C#语言编写的聊天室

    本项目“C#语言编写的聊天室”正是利用C#的强大功能,结合Visual Studio 2010这一高效开发环境,构建了一套完整的聊天室系统,包括服务器端和客户端,旨在满足基本的实时通信需求。 1. **C#语言基础**:C#是微软...

    C#编写的对对碰游戏

    服务器端主要负责接收和广播玩家的动作,维护游戏状态,并处理聊天消息。可以使用C#的TCP或UDP套接字编程来建立服务器,处理客户端的连接请求,实现数据传输。 总结来说,"C#编写的对对碰游戏"项目是一个结合了C#...

    C#编写简单聊天工具.doc

    【C#编写简单聊天工具】这篇文档主要介绍了如何使用C#进行基于Socket的网络编程,以构建一个简单的聊天工具。作者旨在巩固自身网络编程知识并为初学者提供指导。文章结构分为四大部分:程序的分析与设计、C#网络编程...

    C# Socket聊天程序

    服务器端会用Socket的Accept方法监听和接受客户端的连接。数据的发送和接收则通过Socket的Send和Receive方法完成。 3. **异步套接字**:在标签中提到了“异步套接字”,这是C# Socket编程中提高性能的重要方式。...

    用C#编写的一个小型聊天室

    在本项目中,"用C#编写的一个小型聊天室"是一个基于C#编程语言实现的简单网络通信应用,主要用于提供实时的在线对话功能。通过这个聊天室,用户可以进行文字交流,同时系统能够统计在线人数并展示当前在线的成员。...

    C#转发式聊天服务器

    开发者需要遵循这些规则来编写客户端和服务器端的代码,以便它们能够有效地交换数据。 客户端(**Client**)部分可能包含以下组件: 1. 用户界面:用于输入和显示聊天内容的界面。 2. Socket连接:使用C#的Socket类...

Global site tag (gtag.js) - Google Analytics