用C#写的聊天服务端,用到多线程,TCP协议,非点对点。谢谢!

服务端主线程监听自己的某个端口,有数据包过来就单开一个线程来处理,数据包里包含的客户端的Email号、内容和接收端的Email号(如果这时候接收端已经连上服务器的话服务器... 服务端主线程监听自己的某个端口,有数据包过来就单开一个线程来处理,数据包里包含的客户端的Email号、内容和接收端的Email号(如果这时候接收端已经连上服务器的话服务器就把数据包处理后转发)。然后这里面用到哈希表,线程间通讯,多线程,互斥等概念吧(我对C#不熟,让我自己写有难度,希望能帮我写一下这段代码,或者不需要很相信的,只是告诉我哪里该用到什么,主要的代码是什么就行),在这里谢谢大家了! 展开
 我来答
空雪梦见
2013-11-25 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1191万
展开全部
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、客户端之后发送的格式是:  对方邮箱 冒号 要发送的消息。冒号是英文半角冒号,邮箱和冒号间没有空格

miwen58
2013-11-25 · TA获得超过102个赞
知道答主
回答量:110
采纳率:0%
帮助的人:89.7万
展开全部
用UDP最合适干这拆让樱事。。在这里,引用你这句 "(如果这时候接收端已经连上服务器的话服务器就把数据包处理旅丛后转发)。 " 若是TCP,没连上哪能收到数滑孙据?
追问
存入数据库啊,当作离线消息存储
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhang399401
2013-11-25 · TA获得超过702个赞
知道小有建树答主
回答量:1347
采纳率:0%
帮助的人:937万
展开全部
留个邮箱 给你发过去一个简单的聊天程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式