关键词搜索

源码搜索 ×
×

C# Socket 线程

发布2014-03-18浏览1689次

详情内容

最初的版本是这样的:点击打开链接。但一直没有调好,所以就咨询了一下同事翔哥,最后初步搞定!

客户端代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net.Sockets;
  10. using System.Threading;
  11. using System.Net;
  12. using System.Diagnostics;
  13. namespace SocketClient
  14. {
  15. public partial class Client : Form
  16. {
  17. Socket vsServerSocket;
  18. Thread vsClientThread;
  19. string strIP = "127.0.0.1";
  20. public delegate void PassString(string strMsg);
  21. int nPort = 9001;
  22. public Client()
  23. {
  24. InitializeComponent();
  25. }
  26. public void SetSendData(string strMsg)
  27. {
  28. if (tBoxClientSend.InvokeRequired == true)
  29. {
  30. PassString d = new PassString(SetSendData);
  31. this.Invoke(d, new object[] { strMsg });
  32. }
  33. else
  34. {
  35. tBoxClientSend.Text = strMsg;
  36. }
  37. }
  38. public void SetRecvData(string strMsg)
  39. {
  40. if (tBoxClientReceive.InvokeRequired == true)
  41. {
  42. PassString d = new PassString(SetRecvData);
  43. this.Invoke(d, new object[] { strMsg });
  44. }
  45. else
  46. {
  47. tBoxClientReceive.Text = strMsg;
  48. }
  49. }
  50. private void ClientHandle()
  51. {
  52. string strRecv = string.Empty;
  53. //IPEndPoint其实就是一个IP地址和端口的绑定,可以代表一个服务,用来Socket通讯。
  54. //IPAddress类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类
  55. IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(strIP), nPort);
  56. //创建套接字实例
  57. //这里创建的时候用ProtocolType.Tcp,表示建立一个面向连接(TCP)的Socket
  58. vsServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  59. try
  60. {
  61. //将所创建的套接字与IPEndPoint绑定
  62. vsServerSocket.Bind(ipep);
  63. }
  64. catch (SocketException ex)
  65. {
  66. MessageBox.Show("Connect Error: " + ex.Message);
  67. return;
  68. }
  69. Byte[] buffer = new Byte[1024];
  70. //设置套接字为收听模式
  71. vsServerSocket.Listen(10);
  72. //循环监听
  73. while (true)
  74. {
  75. //接收服务器信息
  76. int bufLen = 0;
  77. try
  78. {
  79. Socket vsClientSocket = vsServerSocket.Accept();
  80. bufLen=vsClientSocket.Receive(buffer);
  81. vsClientSocket.Send(Encoding.ASCII.GetBytes("aaaaa"), 5, SocketFlags.None);
  82. }
  83. catch (Exception ex)
  84. {
  85. MessageBox.Show("Receive Error:" + ex.Message);
  86. }
  87. strRecv = Encoding.ASCII.GetString(buffer, 0, bufLen);
  88. SetRecvData(strRecv);
  89. //vsClientSocket.Shutdown(SocketShutdown.Both);
  90. //vsClientSocket.Close();
  91. }
  92. }
  93. //发送数据
  94. private void btnSend_Click(object sender, EventArgs e)
  95. {
  96. byte[] data = new byte[1024];
  97. string ss = tBoxClientSend.Text;
  98. Socket centerClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  99. IPEndPoint GsServer = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9002);
  100. centerClient.Connect(GsServer);
  101. centerClient.Send(Encoding.ASCII.GetBytes(ss));
  102. centerClient.Close();
  103. }
  104. private void Client_Load(object sender, EventArgs e)
  105. {
  106. //连接服务器
  107. //通过ThreadStart委托告诉子线程讲执行什么方法
  108. vsClientThread = new Thread(new ThreadStart(ClientHandle));
  109. vsClientThread.Start();
  110. }
  111. //窗体关闭时杀死客户端进程
  112. private void Client_FormClosing(object sender, FormClosingEventArgs e)
  113. {
  114. KillProcess();
  115. }
  116. //杀死客户端进程
  117. private void KillProcess()
  118. {
  119. Process[] processes = Process.GetProcessesByName("SocketClient");
  120. foreach (Process process in processes)
  121. {
  122. process.Kill();
  123. break;
  124. }
  125. }
  126. }
  127. }
服务端代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Net.Sockets;
  11. using System.Net;
  12. using System.Diagnostics;
  13. namespace SocketServer
  14. {
  15. public partial class Server : Form
  16. {
  17. Thread vsServerThread;
  18. Socket vsServerSocket;
  19. string strIP = "127.0.0.1";
  20. public delegate void PassString(string strMsg);
  21. int nPort = 9002;
  22. public Server()
  23. {
  24. InitializeComponent();
  25. }
  26. private void SeverSendData(string strMsg)
  27. {
  28. //Control.InvokeRequired 属性,命名空间: System.Windows.Forms
  29. //获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
  30. if (tBoxServerSend.InvokeRequired == true)
  31. {
  32. //Control.Invoke 方法 (Delegate)
  33. //在拥有此控件的基础窗口句柄的线程上执行指定的委托。
  34. PassString d = new PassString(SeverSendData);
  35. this.Invoke(d, new object[] { strMsg });
  36. }
  37. else
  38. {
  39. tBoxServerSend.Text = strMsg;
  40. }
  41. }
  42. private void SeverRecvData(string strMsg)
  43. {
  44. if (tBoxServerReceive.InvokeRequired == true)
  45. {
  46. PassString d = new PassString(SeverRecvData);
  47. this.Invoke(d, new object[] { strMsg });
  48. }
  49. else
  50. {
  51. tBoxServerReceive.Text = strMsg;
  52. }
  53. }
  54. private void ServerStart()
  55. {
  56. string strRecv = string.Empty;
  57. //创建IPEndPoint实例
  58. IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(strIP), nPort);
  59. //创建一个套接字
  60. vsServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  61. //将所创建的套接字与IPEndPoint绑定
  62. try
  63. {
  64. vsServerSocket.Bind(ipep);
  65. }
  66. catch (Exception ee)
  67. {
  68. MessageBox.Show(ee.ToString());
  69. return;
  70. }
  71. //设置套接字为收听模式
  72. vsServerSocket.Listen(10);
  73. int bufLen = 0;
  74. //循环监听
  75. while (true)
  76. {
  77. //在套接字上接收接入的连接
  78. Socket vsClientSocket = vsServerSocket.Accept();
  79. try
  80. {
  81. Byte[] buffer = new Byte[1024];
  82. //在套接字上接收客户端发送的信息
  83. bufLen = vsClientSocket.Receive(buffer);
  84. vsClientSocket.Send(Encoding.ASCII.GetBytes("aaaaa"), 5, SocketFlags.None);
  85. if (bufLen == 0)
  86. continue;
  87. //将指定字节数组中的一个字节序列解码为一个字符串。
  88. strRecv = Encoding.ASCII.GetString(buffer, 0, bufLen);
  89. SeverRecvData(strRecv.ToString());
  90. }
  91. catch (Exception ex)
  92. {
  93. MessageBox.Show("Listening Error: " + ex.Message);
  94. vsClientSocket.Close();
  95. vsServerSocket.Close();
  96. }
  97. }
  98. }
  99. private void btnSend_Click(object sender, EventArgs e)
  100. {
  101. byte[] data = new byte[1024];
  102. string ss = tBoxServerSend.Text;
  103. Socket centerClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  104. IPEndPoint GsServer = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001);
  105. centerClient.Connect(GsServer);
  106. centerClient.Send(Encoding.ASCII.GetBytes(ss));
  107. centerClient.Send(Encoding.ASCII.GetBytes(ss));
  108. //Thread.Sleep(100);
  109. //centerClient.Close();
  110. }
  111. private void Server_Load(object sender, EventArgs e)
  112. {
  113. vsServerThread = new Thread(new ThreadStart(ServerStart));
  114. vsServerThread.Start();
  115. }
  116. //窗体关闭时杀死客户端进程
  117. private void Server_FormClosing(object sender, FormClosingEventArgs e)
  118. {
  119. KillProcess();
  120. }
  121. //杀死客户端进程
  122. private void KillProcess()
  123. {
  124. Process[] processes = Process.GetProcessesByName("Server");
  125. foreach (Process process in processes)
  126. {
  127. process.Kill();
  128. break;
  129. }
  130. }
  131. }
  132. }

效果如下:

客户端可以发送消息给服务端,服务端也可以发送消息给客户端。

缺点:

现在服务端只能连接一个客户端


相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载