这段时间再看socket编程,虽然现在是刚刚接触,但是还是忍不住想写一篇总结,来激励自己努力学习,写的不好的地方,还请大家指教啊!

下面针对一个简单的发送消息和文件的程序说说吧。   首先是服务器需要准备二个Socket和二个Thread如下:

  1. //和客户机进行通信
  2. private Socket sckCommit;
  3. //监听客户机
  4. private Socket sckListen;
  5. private Thread thdListen;
  6. private Thread thdCommit;

对客户机的监听和通信放在二个单独的线程中,服务端的简单界面如下:

点击启动按钮时调用下面的函数:

  1. #region 初始化监听
  2. //初始化监听
  3. public void Listen()
  4. {
  5. try
  6. {
  7. string ip = txtIp.Text.Trim();
  8. string port = txtPort.Text.Trim();
  9. //创建IP地址
  10. IPAddress ipaddress = IPAddress.Parse(ip);
  11. //创建IP节点
  12. IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(port));
  13. //创建套接字
  14. sckListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  15. //绑定IP节点
  16. sckListen.Bind(endpoint);
  17. sckListen.Listen();//10为同时最大连接数
  18.  
  19. //在单独的线程里监听
  20. thdListen = new Thread(Watch);
  21. thdListen.IsBackground = true;
  22. thdListen.Start();
  23. ShowMsg("服务器启动.................");
  24. }
  25. catch (Exception ex)
  26. {
  27. ShowErr(ex);
  28. }
  29. }
  30. #endregion
  31.  
  32. #region 在单独的线程里监听端口
  33. public void Watch()
  34. {
  35. while (true)
  36. {
  37. try
  38. {
  39. sckCommit= sckListen.Accept();
  40. thdCommit = new Thread(ReceiveMsg);
  41. thdCommit.IsBackground = true;
  42. thdCommit.Start();
  43. ShowMsg("监听到连接");
  44. }
  45. catch (Exception ex)
  46. {
  47. ShowErr(ex);
  48. break;
  49. }
  50. }
  51. }
  52. #endregion

启动服务器进行监听,程序运行到sckCommit= sckListen.Accept();时,由于Accept();阻塞运行等待客户的连接,然后开始启动接受消息的线程。

  1. public void ReceiveMsg()
  2. {
  3. while (true)
  4. {
  5. try
  6. {
  7. byte[] b = new byte[ * * ];
  8. int size = sckCommit.Receive(b);
  9. string msg = Encoding.UTF8.GetString(b, , size);
  10. ShowMsg(msg);
  11. }
  12. catch (Exception ex)
  13. {
  14. ShowErr(ex);
  15. break;
  16. }
  17. }
  18. }

对于客户端,首先需要主动与服务器进行连接,客户端截图如下:

点击连接时,调用下面的函数:

  1. public void Connnetion()
  2. {
  3. try
  4. {
  5. sckConnection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  6. //创建ip地址
  7. IPAddress ipaddress = IPAddress.Parse(txtIp.Text.Trim());
  8. //创建IP节点
  9. IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPort.Text.Trim()));
  10. //连接ip地址为txtIp.Text.Trim()Port为txtPort.Text.Trim()
  11. sckConnection.Connect(endpoint);
  12. thdConnection = new Thread(ReceiveMsg);
  13. thdConnection.IsBackground = true;
  14. thdConnection.Start();
  15. }
  16. catch (Exception ex)
  17. {
  18. ShowErr(ex);
  19. }
  20. }
  21.  
  22. public void ReceiveMsg()
  23. {
  24. while (true)
  25. {
  26. try
  27. {
  28. byte[] byteMsg = new byte[ * * ];
  29. int length = sckConnection.Receive(byteMsg);
  30. if (byteMsg[] == )
  31. {
  32. string strMsg = Encoding.UTF8.GetString(byteMsg, , length-);
  33. ShowMsg(strMsg);
  34. }
  35. else if (byteMsg[] == )
  36. {
  37. //OpenFileDialog sfd = new OpenFileDialog();
  38. //if (sfd.ShowDialog() == DialogResult.OK)
  39. //{
  40. // string savePath = sfd.FileName;
  41. using (FileStream fs = new FileStream(@"1.txt", FileMode.Create))
  42. {
  43. fs.Write(byteMsg, , length - );
  44. ShowMsg("文件保存成功:");
  45. }
  46. //}
  47. }
  48. else
  49. {
  50. ShowMsg("sdf");
  51. }
  52.  
  53. }
  54. catch (Exception ex)
  55. {
  56. ShowErr(ex);
  57. break;
  58. }
  59. }
  60. }

这样就能接受服务器发来的数据了,为了节省篇幅,其他重复性的代码就不粘上来了。

还需要注意的是,如何区别发送的是文件还是消息还是窗口抖动,我的做法就是在发送的字节数组的第一位做一个标记位,

如果是0怎发送的是字符串,如果是1则发送的是文件,如果是2则发送的是窗口抖动。

对于文件和字符串上面的代码都有,窗口抖动现在还没实现,我的思路是用一个for循环,循环10-30次,每一次都用随机数生成x,y二个数然后加在

窗口的现在的坐标上,就能实现窗口的抖动了。

哈哈,暂时先总结到这,现在去吃饭,回来实现窗口的抖动,加油!!!!

关于Socket编写简单聊天工具的总结(原创)的更多相关文章

  1. [更新Github地址]python学习,自己写了个简单聊天工具mychat

    最近在学习python,自己写了个最最简单的聊天工具mychatv0.1. 第一版,完成基本的聊天功能. GUI用的是自带的TKinter,用到的模块主要就是socket(网络编程), thread( ...

  2. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...

  3. 【总结】学习Socket编写的聊天室小程序

    1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...

  4. 二、socket编写简单BIO的HTTP服务器

    一.目标 诸如tomcat等web服务器中间件简化了我们web的开发成本,但有时候我们或许并不需要这么一个完备的服务器,只是希望做一个简单地处理或者做特殊用途的服务器. 本文将提供一个HTTP的服务器 ...

  5. socket编写简单回显server

    socket在公司代码中应用比较广,比如接口调用的IPCRPC机制,经常看到这样的代码,但是一直也没有动手写过. 在某个比较大的进程中创建一个子进程,由于父子进程复制会浪费内存,可以将创建进程的命令通 ...

  6. c# UDP/TCP协议简单实现(简单聊天工具)

    长时间没有摸这两个协议,写个代码温习下 下面是界面 [服务器界面] [登陆界面] [好友列表界面(我登陆了2个)] [聊天界面] 下面大致讲解下用到的内容 1.用户登陆于服务器通信用到的tcp协议,服 ...

  7. java自己写的简单聊天工具SimpleQQ感悟

    Demo如下: 客户端: /* * 一个简单的QQ * 2013-8-1 * @李志杰 */ package SimpleQQ_Client; import java.awt.*; import ja ...

  8. 用Socket编写的聊天小程序

    Socket是什么? 是套接字,除此之外我也不太清楚,先略过 直接上实例,首先服务端: ; //自定义端口号 private string ServerUser = "Tracy" ...

  9. WPF使用socket实现简单聊天软件

    公司网络限制不能传文件,先贴部分代码 控件添加到界面就行,界面随意布局 项目结构: 1.解决方案 1.1. Client 1.2. Server Client: <Window x:Class= ...

随机推荐

  1. win7 下 qwt安装教程

    一.安装:qwt的安装很简单,可以参看它的install文档.1.解开下载下来的zip文件,比如解开到d:\qt\qwt-5.0.2目录下,修改目录下的qwtconfig.pri文件里面的安装路径,比 ...

  2. 忘记redhat linux root密码怎么办

    自己VM虚拟机里安装redhat linux root密码忘了,刚开始想重新安装,但是后来想到还有linux有一个single模式,使用single可以直接进入字符界面,然后修改: 启动vm虚拟机,启 ...

  3. 项目源码--Android应用商店源码

      下载源码   技术要点: 1.互联网应用 客户端框架 2.综合应用开发所 有技术 3.安装应用的管理 4. HTTP网络通信技 术 5.下载安装.评论 框架 6.使用.版本升级 等统计方案 7.源 ...

  4. Eclipse常用快捷键集合

    一.通用快捷键 [ALT+/]   此快捷键为用户编辑的神级好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁下 [Ctrl+T] 搜索当前接口的实现类 [Ctrl+O]  显示类中方法和 ...

  5. Android XML文件布局各个属性详解

    第一常用类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android: ...

  6. Fliptile

      开关题   尺度法  Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3394   Accepted:  ...

  7. UTF8 与 UTF16 编码

    Unicode 的发展,英文好的直接去 unicode.org 上去看吧,不好的可以移步到这里 看dengyunze的总结:<关于UTF8,UTF16,UTF32,UTF16-LE,UTF16- ...

  8. Android 高级UI设计笔记02:可以拖动交换item位置的GridView(转载)

    如果大家不知道GridView基本使用,可以先参见:Android(java)学习笔记154:使用GridView以及重写BaseAdapter 1. 首先我们明白GridView拖拽的思路: ()根 ...

  9. 关于启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

  10. 用Activator.CreateInstance代替new实现类的实例化(转)

    一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例. 这在工厂模式中是非常有用的 这样,可以使程序有更高的扩展性,例如,,下面的例子 如果现在有一个类,专门用来计算交通工具的速度, ...