小弟准备做一个基于C/S的聊天程序,基本需求参照QQ。当然我不是上来要代码的哈,只是有一些问题想大虾们给点意见。
   
  1.基于TCP聊天;
  以前做过用的是udp协议进行聊天,优点当然省事,client发送消息,server直接根据接收方的ip地址和端口直接转发给目标。但被老外各种吐槽,各种包丢失啊等好吧,这次用tcp(有高手采用udp但在应用层+了与tcp类似的控制机制,我没那能力哈)可是这就意味着client也必须建立TcpListener,我自己写了个草稿程序,client端TcpClient与服务器建立会话的时候,必须指定本地使用端口,而client端的TcpListener同样开启监听同一个端口,这样server端返回socket后利用IPEndPoint就能够得到正确的端口号(当server成为tcp会话发起方的时候必须知道端口号);  //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(); private void receiveMsg()
        {
            try
            {
                msgListener = new TcpListener(8001);//侦听同一个端口
                msgListener.Start(); 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那种....都懂的。 要完成这两个功能,有现成的控件吗?能否给几个名字,我也好去逐个研究~大概问题就这么多,其实我现在最纠结的是架构设计,有木有人能给个建议?谢谢~

解决方案 »

  1.   

    1 TcpClient 构造函数 (String, Int32) 也是指定的远程的IP和远程的端口,并且是直接连接可以不用再调用 Connect。
    2 我觉得除了监听的留着其它的用的时候建立用完就释放掉这样合适些吧。
    3 可以用 RichTextBox
      

  2.   

    现在这方面不是有开源框架叫什么 XAMPP的么
      

  3.   

    谢谢你的回答,但你看错了我调用的构造函数是:
    public TcpClient(IPEndPoint localEP);
    初始化 TcpClient 类的新实例,并将其绑定到指定的本地终结点。
    要不然server只能通过client发起的会话进行通信了,其实我一直在纠结我这么做合不合理啊,不然我想不出让server知道client在监听的端口....对您2,3的回答表示感谢:)