软件创新实践——聊天软件

  上学期的软件创新实践作业,简单的网络的编程(tcp/ip)和多线程,试着回忆得记录下来,因为花了比较多的时间,对我来说也是收获颇丰。

  使用VS2012+SqlServer2008,c#,我将在这次作业中所得大致归为以下几类:

   、数据库方面我采用了对我而言较新的DataBaseFirst + Entity Framework,二者都是大二暑假在亚尔迪公司实习时接触到的新知识,和asp.net MVC一样,全新的概念给我很大的冲击和学习热情,因此想借此机会好好熟悉下。

    DataBaseFirst + Entity Framework 大致可以参考 http://hi.baidu.com/wyg_bd/item/0be876f402abdabe30c1995c  

    EF将数据库对象抽象成为c#里的类,修改数据的操作也变成了简单的对象方法的调用,如sql的查询语句在EF里可以这样写:

      var check_user = data.listUsers.Where(p => p.Uid == loginResult.getUid).FirstOrDefault();

        这里的 var 编译器根据返回值类型自动定义check_user的数据类型,对编译器来说增加负担,所以不被建议。

     并且美中不足的是听说EF在大型系统中的效率不高,我相信EF会被开发的更加成熟而不是被淘汰。

  二、一起客户端的数据请求都经过了服务端的中转,包括数据库访问。和用java写的同学交流了一下,他们用了java自己封装的一个类,可以用socket直接发送类,我也希望自己用c#也能做到,查阅资料,整了半天也成功了,大致如下:

    

  //序列化二进制代码
  public static byte[] Serialize(Obj obj)
  {
    IFormatter formatter = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    byte[] b;
    formatter.Serialize(ms, obj);
    ms.Position = 0;
    b = new byte[ms.Length];
    ms.Read(b, 0, b.Length);
    ms.Close();
    return b;
  }

  //反序列化二进制代码
  public static Obj Deserialize(byte[] byteArray)
  {
    IFormatter formatter = new BinaryFormatter();
    //formatter.Binder = new UBinder();
    MemoryStream ms = new MemoryStream();
    ms.Write(byteArray, 0, byteArray.Length);
    ms.Position = 0;
    Obj obj = formatter.Deserialize(ms) as Obj;
    return obj;
  }

    序列化是将传入的obj(数据包的类)这个对象在内存中的二进制流存在byte数组中,再使用socket发送转化后的二进制数组byte,接收后再强转成我写的数据包类。

    这其中遇到的问题是服务端和客户端不在同一个项目里,数据包类的环境不同,反序列化出错,解决办法是新建第三个项目,重新定义了数据包类,导出为dll文件,再导入服务端和客户端的项目里,代替原来的数据包类。

    接下来的工作顺利的很多,但是工作量略大,每天写到半夜一两点,作业还是晚交了两天。其实最郁闷的是因为之前参加过老师的项目,直接给了优,连检查都没有。

  

原文地址:https://www.cnblogs.com/chbjaycn/p/3590815.html