解决方案 »

  1.   

    可以使用 TcpListener 开发服务器端,使用 TcpClient 开发客户端。使用长连接双工操作,客户端可以不断地给服务器端推送任意多个消息信令,服务器端也可以给客户端推送(例如回复信息,或者提示消息)。由于这是字节流通讯,任何一段都在不断地读取Stream中的字节,所以你需要自己定义消息信令格式,要保证能够分辨出每一个消息的结束位置。例如使用 Guid.NewGuid.ToString() 做为消息分隔符,当客户端刚与服务器握手成功时,收到的前36个字符就是这个分隔符,之后收到的内容就可以用这个分隔符来识别消息结束位置了。
      

  2.   

    通常,你要用你熟悉的一种信令处理方式。这需要你自己动脑筋设计。例如如果你会使用json进行序列化、反序列化,那么你就可以把.net内存对象序列化为json字符串然后做为信令内容发送出去,到对方还能反序列化为.net内存对象。例如客户端可能发送这样一个消息:
        {
                    "type":"Chat.SendMessage", 
                   "TargetUserId":[1002,2898,32623],
                   "Content":"<p>今天中午吃了什么?<img src=\"http://www.mysite.com/chat_images/1.png\" />"
           }
    那么显然,对方根据 type 元素就知道要反序列化的.net内存对象的类型了,然后把它直接使用json反序列化为
        public class SendMessage: ICommand
           {
                 public string[] TargetUser;
                 public string Content;
        
                 public void Execute()
                {
                     .................
                }
          }
    这样一个对象,然后执行它。
      

  3.   

    那个可以详细一点,我现在只知道通过socket和networkstream来进行收发信息
      

  4.   


    看来你并不知道 NetworkStream,你需要重新了解一下它跟HttpListener和HttpClient的关系。
      

  5.   

    主要是考虑想做到多人进行客户端的聊天功能,所以我想觉得是不是要多个套接字,多个线程,简单说就是数组啊什么,来进行多线程接受数据,这个,单线程用socket接受数据,也可以么?
      

  6.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0
      

  7.   


    看来你并不知道 NetworkStream,你需要重新了解一下它跟HttpListener和HttpClient的关系。
    你刚说的那些类啊0.0,都还没见过(⊙o⊙)…0.0
      

  8.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。
      

  9.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。
    得,我算服了你,夏虫不可语冰拜拜,大神
      

  10.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。
    P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。
      

  11.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。
    P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。网上搜,表示经常会卡0.0,上次搜SQL的图片二进制存在,把我折腾的- -,弄得最后只能考虑文件路径了
      

  12.   


    胡乱从网上整点“听上去挺厉害的词儿”贴出来,丝毫没有自己的技术原创,这是自欺欺人的招数,而且只是欺负读者不懂分辨关键瓶颈问题,只会坑那些真心想学技术的人。哎,我是想c#类太多了,一个一个对MSDN看,既不效率又难于用于实际,所以想着做一些简单的例子顺带学,发这贴纯碎是找能实现多人点对点聊天的客户端的方法,然后对其中的代码,调试着学类。  让你这通说道- -
      

  13.   

    设计一个c/s模式聊天程序,就是要知道“打洞”这个字眼儿?谁跟你说的呢?“分析一个人的情况”,最后在别人的回应中才知道别人可能没有那个基本素质,但是我至少之前尽量做到了。总比一开始就胡乱扔出一两个词儿要好。我又不是在csdn上搞乐子的,喜欢大家“嘻嘻哈哈”地交往的人不应该在技术论坛,应该去天涯论坛啊。
      

  14.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。
    P哥我很早就跟你说过你跟一个人说话的时候应该先分析一下人家的情况,在结合着说。我真的很好奇你为什么每次说话的时候都可以不用考虑别人的感受?难道你不是跟他说么?去网上搜有很多点对点通讯的代码不就完了么。关键字 打洞 。网上搜,表示经常会卡0.0,上次搜SQL的图片二进制存在,把我折腾的- -,弄得最后只能考虑文件路径了
    卡你就弄明白为什么会卡不就完事了,这样就能提高很多了,大多数的学习都是在研究中进行的。
      

  15.   

    如果你不纠结于 点对点,允许使用服务器转发数据,可以看看这个帖子http://bbs.csdn.net/topics/390754071
      

  16.   

    网上有聊天通讯的demo  可以下下来看下
    先要搞清楚tcp通信的结构
      

  17.   

    我是刚学C#语言(大一新生),因为老师讲语法啊基本严重略- -(上课全过书),所以语法都是对着MSDN的类库里对着类看下来,没有系统哦0.0如果是这样,你怎么会纠结什么“聊天程序”?你应该先把基础打好,3年级的时候再学习这个。你上的专门死记硬背的培训班么?那么你就死记硬背这些吧,虽然我写的有错误,但是我不指望你现在能分辨啊。我认识很多的大学教授, 他们并不是什么都会的,他们在谈及自己的经历的时候会这样说,
    有一次有人让我做一个东西,我不会做,于是我边学边做,在做的过程中我学会了很多的东西,最终把问题解决了。如果按照你的逻辑他应该这么做,我不会做,等我N年以后会做了再做吧。假设他不会做,那么在做这个东西的过程中,他必须会一些基础的东西才能学会。这并不影响他的学习,反而加速了他的学习。
      

  18.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Configuration;namespace Client
    {
        public partial class FrmClient : Form
        {
            public FrmClient()
            {
                InitializeComponent();
            }        Socket client = null;
            byte[] Rcvbuffer;
            string SendStr;        delegate void AppendDelegate(string str);
            AppendDelegate AppendString;        string Host = ConfigurationManager.AppSettings["Host"].ToString();
            int Port = Convert.ToInt32(ConfigurationManager.AppSettings["Port"].ToString());
            AddressFamily af = ConfigurationManager.AppSettings["AddressFamily"].ToString() == "0" ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6;        private void AppendMethod(string str)
            {
                lstStatus.Items.Add(str);
                lstStatus.SelectedIndex = lstStatus.Items.Count - 1;
            }        private void ConnectCallback(IAsyncResult ar)
            {
                try
                {
                    client.EndConnect(ar);
                    lstStatus.Invoke(AppendString, String.Format("已经成功连接到服务器{0}!", client.RemoteEndPoint.ToString()));
                    lstStatus.Invoke(AppendString, String.Format("本地端点为{0}!", client.LocalEndPoint.ToString()));                //接收数据
                    Rcvbuffer = new byte[client.SendBufferSize];
                    AsyncCallback callback = new AsyncCallback(ReceiveCallback);
                    client.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, client);
                }
                catch (Exception ex)
                {
                    lstStatus.Invoke(AppendString, "连接服务器出现异常!异常信息:" + ex.Message);
                }
            }        private void ReceiveCallback(IAsyncResult ar)
            {
                try
                {
                    int i = client.EndReceive(ar);
                    string data = String.Format("收:{0}", Encoding.UTF8.GetString(Rcvbuffer, 0, i));
                    lstStatus.Invoke(AppendString, data);                //继续异步接收
                    Rcvbuffer = new byte[client.SendBufferSize];
                    AsyncCallback callback = new AsyncCallback(ReceiveCallback);
                    client.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, client);
                }
                catch (Exception ex)
                {
                    if (null != client)
                    {
                        client.Shutdown(SocketShutdown.Both);
                        client.Close();
                        client = null;
                        lstStatus.Invoke(AppendString, ex.Message);
                    }
                }
            }        private void FrmClient_Load(object sender, EventArgs e)
            {
                AppendString = new AppendDelegate(AppendMethod);
            }        private void BtnStart_Click(object sender, EventArgs e)
            {
                if (client == null)
                {
                    client = new Socket(af, SocketType.Stream, ProtocolType.Tcp);
                }
                if (!client.Connected)
                {
                    IPEndPoint remoteep = new IPEndPoint(IPAddress.Parse(Host), Port);
                    AsyncCallback callback = new AsyncCallback(ConnectCallback);                //启动新的连接
                    client = new Socket(af, SocketType.Stream, ProtocolType.Tcp);
                    client.BeginConnect(remoteep, ConnectCallback, client);
                }
            }        private void BtnStop_Click(object sender, EventArgs e)
            {
                if (null == client) return;
                if (!client.Connected) return;
                client.Shutdown(SocketShutdown.Both);
                client.Close(50);
                client = null;
                lstStatus.Invoke(AppendString, "断开了到服务器的TCP连接!");
            }        private void BtnClear_Click(object sender, EventArgs e)
            {
                this.lstStatus.Items.Clear();
            }        private void SendCallback(IAsyncResult ar)
            {
                try
                {
                    client.EndSend(ar);
                    lstStatus.Invoke(AppendString, "发:" + SendStr);
                }
                catch (Exception ex)
                {
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();
                    client = null;
                    lstStatus.Invoke(AppendString, "发送消息出现异常!异常信息:" + ex.Message);
                }
            }        private void SendData()
            {
                try
                {
                    byte[] msg = Encoding.UTF8.GetBytes(SendStr);
                    AsyncCallback callback = new AsyncCallback(SendCallback);
                    client.BeginSend(msg, 0, msg.Length, SocketFlags.None, callback, client);
                }
                catch
                {
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();
                    client = null;
                    lstStatus.Invoke(AppendString, "服务器断开了TCP连接!");
                }
                finally
                {
                    TxTMessage.Text = "";
                }
            }        private void BtnSendMsg_Click(object sender, EventArgs e)
            {
                if (String.IsNullOrEmpty(TxTMessage.Text))
                {
                    lstStatus.Invoke(AppendString, "不能发送空字符串!");
                    TxTMessage.Focus();
                    return;
                }
                if (client == null || !client.Connected)
                {
                    lstStatus.Invoke(AppendString, "尚未建立到服务器的连接!");
                    BtnStart.Focus();
                    return;
                }
                SendStr = TxTMessage.Text.Trim();
                SendData();
            }
        }
    }