zoukankan      html  css  js  c++  java
  • 用socket来写一个聊天软件吧(二)实现基本通信

      之前实现在监听客户端的上线,

      现在服务器要接收客户端发来的消息来了:

      

     //接收消息,由于服务器不知道什么时候接收到消息,它就得不一直在等待接收,所以要用一个线程来完成它
            Thread th = new Thread(RecMsg);
      //把 这个线程转换成后台线程,以关闭它的时候在后台运行,就不会报错了。
            th.IsBackground = true;
            th.Start(connSocket);
      //接收消息的方法,这里为什么要用object呢?看一个start方法,只能传一个object类型,为什么这个方法只能传object呢?自己转到定义看看。
      void RecMsg(object o)
            {
                Socket connSocket = o as Socket;
                while (true)
                {
       //由于是网络通信,经常会出现一个连接强迫终止的情况,所以这里要做异常处理
                    try
                    {
                        //接收客户端发送过来的消息
                        byte[] buffer = new byte[1024 * 1024];
                        //num 接收到的实际有效的字节个数
                        int num = connSocket.Receive(buffer);
                        string s = Encoding.UTF8.GetString(buffer, 0, num);
                        ShowMsg(connSocket.RemoteEndPoint.ToString() + ":" + s);
                    }
                    catch (Exception ex)
                    {
                        ShowMsg(ex.Message);
                        break;
                    }
                }
            }
      
    

     

      既然服务器在接收了,那我们就来个客户端去给它发个hello world吧:
           

     //发送消息
            //虽然socket连接上了,但我们要考虑,中途网线不小心断了时候,在网络通信的时候一定要做异常处理,后面就不再说了
                if (socket != null)
                {
                    try
                    {    //把文本框里的字符串转换成字节数组,注意客户端与服务器的编码要一致
                        byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);
         //这个负责通信的socket我定义成了全局了
                        socket.Send(buffer);
                    }
                    catch (Exception ex)
                    {
                        ShowMsg(ex.Message);
                    }
                }
    

     

      好了,客户端可以向服务器发消息了。socket通信的最基础的学完了。
       现在我们来测试一下吧,给服务器发一个hello,world
       哎呀,出问题了:
      

       原来txtLog控件是在Form1里,主程序也是一个线程,自己创建的一个线程来访问它就会出错。程序默认是检查跨线程之间的操作的,那现要我们要在实体加载的时候写上这样一句
         //不检测跨线程操作的合法性
          Control.CheckForIllegalCrossThreadCalls = false;
      
    A:socket大体上就那么多了?
    B:发送消息,接收消息就这么多了。
    A:哥们!你这也太简单了吧?人家QQ还可以发文件、震动呢,还可以一对一,一对多聊天呢。
    B:其实原理都一样,QQ是把用户的消息做了一个转发而已。
    A:别老说简单,说出来容易,写起来难呀
    B:好吧,那我就简单的实现它吧,现在就要求你理解请求的原理,和序列化,后面就可以用到它了


    ------------此处前两篇代码只是为刚学  socket尝鲜为准备的。后面一篇将与大家分享我自己写的有一定功能的代码
     

  • 相关阅读:
    asp.net textbox 控件如何清除缓存
    extjs Accordion 怎样把展开符号:加号(+)放在左边?
    ORACLE 调试输出,字符串执行函数
    Oracle中table函数的应用
    Oracle LAST_DAY(d)
    Oracle 管道化表函数(Pipelined Table)[转载]
    ext中fieldLabel文本太宽的问题,以及Panel居中显示
    什么是泛型(C#)
    设置Ext tab的宽度自动适应
    js选择日期即时把两个日期相差天数显示出来?
  • 原文地址:https://www.cnblogs.com/inline/p/2520610.html
Copyright © 2011-2022 走看看