日期:2014-05-18  浏览次数:20801 次

新手求助,要做一个基于C/S的聊天程序,希望高手们给点意见
小弟准备做一个基于C/S的聊天程序,基本需求参照QQ。当然我不是上来要代码的哈,只是有一些问题想大虾们给点意见。
   
  1.基于TCP聊天;
  以前做过用的是udp协议进行聊天,优点当然省事,client发送消息,server直接根据接收方的ip地址和端口直接转发给目标。但被老外各种吐槽,各种包丢失啊等。。。好吧,这次用tcp(有高手采用udp但在应用层+了与tcp类似的控制机制,我没那能力哈)可是这就意味着client也必须建立TcpListener,我自己写了个草稿程序,client端TcpClient与服务器建立会话的时候,必须指定本地使用端口,而client端的TcpListener同样开启监听同一个端口,这样server端返回socket后利用IPEndPoint就能够得到正确的端口号(当server成为tcp会话发起方的时候必须知道端口号);
C# code

  //Client 端
  private void sendMsg()
        {
            try
            {
                tClient = new TcpClient(new IPEndPoint(IPAddress.Parse("10.111.3.35"), 8001));//指定端口
                tClient.Connect("10.111.3.35", 8080);
                ns = tClient.GetStream();



C# code

 private void receiveMsg()
        {
            try
            {
                msgListener = new TcpListener(8001);//侦听同一个端口
                msgListener.Start();



C# code

 byte[] data = new byte[256];
                int size = ns.Read(data,0,256);
                string content = Encoding.Unicode.GetString(data, 0, size);
                EndPoint EP = socketConn.RemoteEndPoint;
                IPEndPoint iep = (IPEndPoint)EP;
                if (content.Equals("exit"))
                    return false;
                if (content.Equals("log"))
                {
                    Client.addClient(iep);//服务器记录用户ip和端口,以便发起tcp会话使用
                }


这是大概的思路,我想问这么设定对不对?

2.client端跳转到其他窗体时,是应该把TcpClient/NetworkStream这些对象传递过去继续使用,还是关掉,在新窗体重新创建?
这个问题纠结很久。。。
又或者弄一个全局静态类,连带内部的TcpClient,listener, ns这些玩意也都给static了?好像有点那个饿。。。

3.文本框支持图像显示&截图功能
qq那种....都懂的。 要完成这两个功能,有现成的控件吗?能否给几个名字,我也好去逐个研究~

大概问题就这么多,其实我现在最纠结的是架构设计,有木有人能给个建议?

谢谢~

------解决方案--------------------
自己在底层协议上折腾个人认为性价比不高。即使是你当前调试成功了,但你上层控制的可靠性要相当长时间才能验证。J20最少要到2018年才能成军呢。
------解决方案--------------------
先看下别人的源码看对自己的思路有没有帮助......