A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



今天在VS2010上做点练习,用Socket编程写的聊天程序。
长的比较丑


这是客户端的主要代码:
  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.Net;
  11. using System.Threading;

  12. namespace _01_socketclient
  13. {
  14. public partial class SocketClient : Form
  15. {
  16. Socket socketClient = null; //客户端套接字
  17. bool connectioned = false; //连接断开标识
  18. Thread sendThread = null; //发送线程
  19. Thread receiveThread = null; //接受线程
  20. delegate void SetTextCallback(string text);//invoke的方式实现安全调用
  21. delegate void ClearTextCallback();

  22. public SocketClient()
  23. {
  24. InitializeComponent();
  25. }

  26. private void btnConnection_Click(object sender, EventArgs e)
  27. {
  28. if (connectioned)
  29. {
  30. //结束接受线程
  31. if (receiveThread.IsAlive)
  32. receiveThread.Abort();
  33. //关闭套接字
  34. socketClient.Close();
  35. ShowMsg("断开连接。");

  36. btnConnection.Text = "Connection";
  37. connectioned = false;
  38. //设置发送不可用
  39. btnSend.Enabled = connectioned;
  40. }
  41. else
  42. {
  43. //创建客户端套接字
  44. socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  45. IPAddress adress = null;
  46. IPEndPoint endpoint = null;

  47. try
  48. {
  49. //IP不为空
  50. adress = IPAddress.Parse(txtIP.Text.Trim());
  51. }
  52. catch
  53. {
  54. //IP为空
  55. txtIP.Text = "192.168.1.100";
  56. }
  57. try
  58. {
  59. //PORT不为空
  60. endpoint = new IPEndPoint(adress, int.Parse(txtPort.Text.Trim()));
  61. }
  62. catch
  63. {
  64. //PORT为空
  65. txtPort.Text = "52113";
  66. }
  67. //连接服务器
  68. try
  69. {
  70. ShowMsg("连接到 " + txtIP.Text.ToString() + ":" + txtPort.Text.ToString());
  71. socketClient.Connect(endpoint);
  72. ShowMsg("成功连接到服务器。");
  73. }
  74. catch
  75. {
  76. ShowMsg("连接服务器失败。");
  77. return;
  78. }

  79. //实例接收线程
  80. receiveThread = new Thread(new ThreadStart(RecevieThread));
  81. //设置为后台线程
  82. receiveThread.IsBackground = true;
  83. //启动接受线程
  84. receiveThread.Start();

  85. btnConnection.Text = "Broke";
  86. connectioned = true;
  87. //设置发送可用
  88. btnSend.Enabled = connectioned;

  89. }//else

  90. }

  91. /// <summary>
  92. /// 显示文本信息
  93. /// </summary>
  94. /// <param name="msg"></param>
  95. private void ShowMsg(string msg)
  96. {
  97. if (txtShow.InvokeRequired)
  98. {

  99. SetTextCallback d = new SetTextCallback(ShowMsg); ;
  100. Invoke(d, new object[] { msg });
  101. }
  102. else
  103. {
  104. txtShow.AppendText(msg + "\r\n");
  105. }
  106. }

  107. private void SendTextClear()
  108. {
  109. if (txtSend.InvokeRequired)
  110. {
  111. ClearTextCallback d = new ClearTextCallback(SendTextClear);
  112. Invoke(d);
  113. }
  114. else
  115. txtSend.Clear();

  116. }

  117. /// <summary>
  118. /// 发送线程函数
  119. /// </summary>
  120. private void SendThread()
  121. {

  122. if (txtSend.Text.ToString() == "")
  123. {
  124. MessageBox.Show("发送内容不能为空!");
  125. }
  126. else
  127. {
  128. //获取发送字符数组
  129. byte[] arrSend = System.Text.Encoding.Default.GetBytes(txtSend.Text.ToString());
  130. //回显发送内容
  131. ShowMsg(txtSend.Text.ToString());
  132. //清空发送区
  133. SendTextClear();
  134. try
  135. {
  136. //发送信息
  137. socketClient.Send(arrSend);
  138. }
  139. catch
  140. {
  141. ShowMsg("服务器已关闭。");
  142. //关闭服务端套接字
  143. socketClient.Close();
  144. }

  145. }
  146. sendThread.Abort();
  147. MessageBox.Show("sendThread dead");

  148. }

  149. /// <summary>
  150. /// 接收线程执行方法
  151. /// </summary>
  152. private void RecevieThread()
  153. {
  154. while (true)
  155. {
  156. byte[] arrRec = new byte[1024 * 1024 * 2];
  157. int num = 0;

  158. try
  159. {
  160. num = socketClient.Receive(arrRec);
  161. string strMsg = socketClient.RemoteEndPoint.ToString();
  162. strMsg += ":" + System.Text.Encoding.Default.GetString(arrRec, 0, num);
  163. ShowMsg(strMsg);
  164. }
  165. catch
  166. {
  167. //ShowMsg("连接已断开。");
  168. socketClient.Close();
  169. return;
  170. }

  171. }//while
  172. }

  173. /// <summary>
  174. /// 发送按钮
  175. /// </summary>
  176. /// <param name="sender"></param>
  177. /// <param name="e"></param>
  178. private void btnSend_Click(object sender, EventArgs e)
  179. {
  180. //绑定发送线程函数
  181. sendThread = new Thread(new ThreadStart(SendThread));
  182. //设置为后台线程
  183. sendThread.IsBackground = true;
  184. //启动发送线程
  185. sendThread.Start();

  186. }
  187. }
  188. }
复制代码

-The End-

© Jervis


评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

3 个回复

倒序浏览
你可以写一哈 客户端通过客户端发送文件盒消息!!!     其原理就是运用 服务器 当做中间装换的桥梁
回复 使用道具 举报
值得学习ing!
回复 使用道具 举报
杞文明 发表于 2013-6-25 00:13
你可以写一哈 客户端通过客户端发送文件盒消息!!!     其原理就是运用 服务器 当做中间装换的桥梁 ...

o!    当时刚看socket那个视频还不知道文件读取呢,就是随便写写。  呵呵~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马