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尝鲜为准备的。后面一篇将与大家分享我自己写的有一定功能的代码
     

  • 相关阅读:
    bat批处理脚本学习系列(一)
    遇到的bug
    util.js 积累的一些基础函数代码
    session过期跳转到登陆页面并解决跳出iframe问题
    Centos7下的rabbitmq-server-3.8.11安装配置
    简单梳理 ES6 函数
    博客目录与学习计划
    DDD中聚合、聚合根的含义以及作用
    DDD中实体与值对象是干什么的
    DDD中限界上下文与通用语言的作用
  • 原文地址:https://www.cnblogs.com/inline/p/2520610.html
Copyright © 2011-2022 走看看