本文转载自:http://blog.csdn.net/andrew_wx/article/details/6629721

这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。

注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。。

下面是两个程序的代码,(两个程序均为控制台程序)

先发服务端的(Server)完整代码如下:

引入命名空间:

  1. using System.Net.Sockets;
  2. using System.Net;
  3. using System.Threading;

完整代码如下:

  1. namespace SocketServer
  2. {
  3. class Program
  4. {
  5. private static byte[] result = new byte[1024];
  6. private static int myProt = 8885;   //端口
  7. static Socket serverSocket;
  8. static void Main(string[] args)
  9. {
  10. //服务器IP地址
  11. IPAddress ip = IPAddress.Parse("127.0.0.1");
  12. serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  13. serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口
  14. serverSocket.Listen(10);    //设定最多10个排队连接请求
  15. Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
  16. //通过Clientsoket发送数据
  17. Thread myThread = new Thread(ListenClientConnect);
  18. myThread.Start();
  19. Console.ReadLine();
  20. }
  21. /// <summary>
  22. /// 监听客户端连接
  23. /// </summary>
  24. private static void ListenClientConnect()
  25. {
  26. while (true)
  27. {
  28. Socket clientSocket = serverSocket.Accept();
  29. clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
  30. Thread receiveThread = new Thread(ReceiveMessage);
  31. receiveThread.Start(clientSocket);
  32. }
  33. }
  34. /// <summary>
  35. /// 接收消息
  36. /// </summary>
  37. /// <param name="clientSocket"></param>
  38. private static void ReceiveMessage(object clientSocket)
  39. {
  40. Socket myClientSocket = (Socket)clientSocket;
  41. while (true)
  42. {
  43. try
  44. {
  45. //通过clientSocket接收数据
  46. int receiveNumber = myClientSocket.Receive(result);
  47. Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
  48. }
  49. catch(Exception ex)
  50. {
  51. Console.WriteLine(ex.Message);
  52. myClientSocket.Shutdown(SocketShutdown.Both);
  53. myClientSocket.Close();
  54. break;
  55. }
  56. }
  57. }
  58. }
  59. }

以上是服务端(server)的完整代码。

客户端(Client)的完整代码如下:

引入命名空间:

  1. using System.Net;
  2. using System.Net.Sockets;
  3. using System.Threading;

完整代码:

  1. namespace SocketClient
  2. {
  3. class Program
  4. {
  5. private static byte[] result = new byte[1024];
  6. static void Main(string[] args)
  7. {
  8. //设定服务器IP地址
  9. IPAddress ip = IPAddress.Parse("127.0.0.1");
  10. Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  11. try
  12. {
  13. clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口
  14. Console.WriteLine("连接服务器成功");
  15. }
  16. catch
  17. {
  18. Console.WriteLine("连接服务器失败,请按回车键退出!");
  19. return;
  20. }
  21. //通过clientSocket接收数据
  22. int receiveLength = clientSocket.Receive(result);
  23. Console.WriteLine("接收服务器消息:{0}",Encoding.ASCII.GetString(result,0,receiveLength));
  24. //通过 clientSocket 发送数据
  25. for (int i = 0; i < 10; i++)
  26. {
  27. try
  28. {
  29. Thread.Sleep(1000);    //等待1秒钟
  30. string sendMessage = "client send Message Hellp" + DateTime.Now;
  31. clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
  32. Console.WriteLine("向服务器发送消息:{0}" + sendMessage);
  33. }
  34. catch
  35. {
  36. clientSocket.Shutdown(SocketShutdown.Both);
  37. clientSocket.Close();
  38. break;
  39. }
  40. }
  41. Console.WriteLine("发送完毕,按回车键退出");
  42. Console.ReadLine();
  43. }
  44. }
  45. }

编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。

效果如下图:

该程序已在局域网测试通过。(192.168.X.X)

若编译失败,可到下面的地址下载项目文件:

http://download.csdn.net/source/3465765

最新文章

  1. Redis集群研究和实践(基于redis 3.0.5)
  2. 数据库基础,表及SQL语句
  3. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
  4. ASP.NET MVC学习之模型绑定(2)
  5. javascript的alert()的消息框不弹出或者弹出信息有误
  6. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
  7. idea 15破解方法记录
  8. 第4章 同步控制 Synchronization ----事件(Event Objects)
  9. 安卓图片加载框架之Glide框架
  10. P4098 [HEOI2013]ALO
  11. java 集合(一)ArrayList的继承树
  12. 转: Linux mount/unmount命令
  13. feign client 的简单使用(1)
  14. C#.NET常见问题(FAQ)-如何把文本复制粘贴到文本框的光标位置
  15. HDU1211 RSA
  16. hashCode方法
  17. js获取IP地址多种方法实例教程
  18. css笔记 - 张鑫旭css课程笔记之 line-height 篇
  19. C语言——&lt;算法&gt;_冒泡算法的使用及理解
  20. 关于windows10 CMD 的一些操作

热门文章

  1. Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置
  2. 前端分布引导插件IntroJs的使用
  3. Linux find 命令大全
  4. spring mvc: 页面重定向调整
  5. shell基础复习笔记
  6. 连接mysql报错:error 2003 (hy000):can&#39;t connect to mysql server on &#39;localhost&#39; (10061)
  7. Qt事件系统基本概念
  8. dojo学习教程
  9. Leetcode 1013. Partition Array Into Three Parts With Equal Sum
  10. 【MFC】断言(ASSERT)的用法