如何用C语言编写一个简单的聊天室程序

如何用C语言编写一个简单的聊天室程序,第1张

聊天室的话涉及网络通信。流程大概是:

1.

客户端连接服务器(登陆,上传相应的数据(起码有聊天室编号))

2.

客户端发生消息给服务器(消息+聊天室编号)

3.

服务器根据客户端上传的聊天室编号广播消息

4.

客户端接受服务器传来的消息

用到的技术就是socket编程(应该有其他的现成的框架,不过我用得比较多的是java,不清楚c的),如果还想做个界面的话,可以用qt做,或者MFC,应该还有其他可选方式,不过我不知道~~~。

上面只是简单的,你要做完备的还有很多问题需要考虑,比如说加密数据,优化使其能容纳较多的用户,服务器崩溃时的处理方案等等。

创建c++控制器文件项目,获取聊天窗口的句柄,向聊天窗口出入聊天消息,模拟发送。

c++使用方法:下载安装并打开c++点击左上角文件——新建——源代码(也可使用Ctrl+N快速完成新建)在文本框编写你所需要的程序点击编译(快捷键F9)点击运行即可查看自己所编写的程序(快捷键F10在编完程序后可直接点击编译运行查看自己的程序(快捷键F11)。

using System

using System.Collections.Generic

using System.Net

using System.Net.Sockets

using System.Threading

using System.Text

using System.IO

class Server

{

    Socket _listenSocket

    Dictionary<string, ClientProcess> _clients

    public Server(int port)

    {

        _clients = new Dictionary<string, ClientProcess>()

        _listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

        IPEndPoint lep = new IPEndPoint(IPAddress.Any, port)

        _listenSocket.Bind(lep)

    }

    public void Start()

    {

        _listenSocket.Listen(5)

        for (  )

        {

            Socket client = _listenSocket.Accept()

            ClientProcess cp = new ClientProcess(this, client)

            ThreadStart ts = new ThreadStart(cp.Process)

            Thread t = new Thread(ts)

            t.Start()

        }

    }

    public void AddClient(string email, ClientProcess c)

    {

        lock (_clients)

        {

            if (!_clients.ContainsKey(email))

                _clients.Add(email, c)

        }

    }

    public void RemoveClient(string email)

    {

        lock (_clients)

        {

            if (_clients.ContainsKey(email))

                _clients.Remove(email)

        }

    }

    public void SendTo(string from, string email, string msg)

    {

        ClientProcess cp

        lock(_clients) {

            _clients.TryGetValue(email, out cp)

        }

        if (cp != null)

        {

            cp.Send(from, msg)

        }

    }

}

class ClientProcess

{

    Server _serv

    Socket _s

    TcpClient _tc

    StreamReader _sr

    StreamWriter _sw

    string email

    public ClientProcess(Server serv, Socket s)

    {

        _serv = serv

        _s = s

        _tc = new TcpClient()

        _tc.Client = _s

        _sr = new StreamReader(_tc.GetStream())

        _sw = new StreamWriter(_tc.GetStream())

    }

    public void Process()

    {

        try

        {

            email = _sr.ReadLine()

            _serv.AddClient(email, this)

            for (  )

            {

                string l = _sr.ReadLine()

                int i = l.IndexOf(':')

                if(i == -1)    

                    continue

                string em = l.Substring(0, i)

                string msg = l.Substring(i + 1)

                _serv.SendTo(email, em, msg)

            }

        }

        catch

        {

            _serv.RemoveClient(email)

        }

    }

    public void Send(string email, string msg)

    {

        _sw.WriteLine("{0}:{1}", email, msg)

        _sw.Flush()

    }

}

class Program

{

    static void Main(string[] args)

    {

        Server s = new Server(12345)

        s.Start()

    }

}

协议是这样的:

1、发送和接收都是以行为单位的

2、客户端连接后发送的第一行数据是自己的邮箱

3、客户端之后发送的格式是:  对方邮箱 冒号 要发送的消息。冒号是英文半角冒号,邮箱和冒号间没有空格


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11057679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存