在当今这样一个网络时代,很多技术都以网络为中心在诞生。本文介绍了服务器端+客户端的聊天系统,希望对大家有用。

最近也在触摸SOCKET编程,在当今这样一个网络时代,许多技能都以网络为中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在完成网络通讯上处于要害位置,所以不会SOCKET是不可的。

首要,本文主要是针对那些刚触摸SOCKET编程的朋友,如果是高手,就能够不看此文啦

在开端之前,咱们需求预习一些基础知识:

什么是SOCKET套接字?

SOCKET一般有那几种数据格式?

线程的概念?

(以上基本知识我就不讲了,网上这方面材料许多的,咱们找材料看下吧)

我要介绍的是一个服务器端+客户端的谈天体系,程序比较简单,我先把程序运转的界面给咱们看下:

上面是服务器端运转界面;下面把客户端界面贴给咱们看下:

服务器+客户端的谈天程序  服务器+客户端 第1张

功用比较简单,服务器的端口号能够在“体系菜单”里边的参数装备进行修正的。

看了上面的图,下面咱们就给咱们把代码贴出来:(由于程序比较简单,所以自己就没有去分层啦)

服务器端代码:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.ComponentModel;
  4. usingSystem.Data;
  5. usingSystem.Drawing;
  6. usingSystem.Text;
  7. usingSystem.Windows.Forms;
  8. usingSystem.Net;
  9. usingSystem.Net.Sockets;
  10. usingSystem.Threading;
  11. usingSystem.Xml;
  12. namespaceServer
  13. {
  14. publicpartialclassServerMain:Form
  15. {
  16. publicServerMain()
  17. {
  18. InitializeComponent();
  19. }
  20. privatevoidServerMain_Load(objectsender,EventArgse)
  21. {
  22. this.CmdStar.Enabled=true;
  23. this.CmdStop.Enabled=false;
  24. }
  25. privatevoid装备参数ToolStripMenuItem_Click(objectsender,EventArgse)
  26. {
  27. SetTSet=newSet();
  28. TSet.ShowDialog();
  29. }
  30. privatevoid关于ToolStripMenuItem_Click(objectsender,EventArgse)
  31. {
  32. AboutTAbout=newAbout();
  33. TAbout.Show();
  34. }
  35. ///<summary>
  36. ///取得XML文件中的端口号
  37. ///</summary>
  38. ///<returns></returns>
  39. privateintGetPort()
  40. {
  41. try
  42. {
  43. XmlDocumentTDoc=newXmlDocument();
  44. TDoc.Load("Settings.xml");
  45. stringTPort=TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;
  46. returnConvert.ToInt32(TPort);
  47. }
  48. catch{return6600;}//默许是6600
  49. }
  50. //声明即将用到的类
  51. privateIPEndPointServerInfo;//寄存服务器的IP和端口信息
  52. privateSocketServerSocket;//服务端运转的SOCKET
  53. privateThreadServerThread;//服务端运转的线程
  54. privateSocket[]ClientSocket;//为客户端树立的SOCKET衔接
  55. privateintClientNumb;//寄存客户端数量
  56. privatebyte[]MsgBuffer;//寄存音讯数据
  57. privatevoidCmdStar_Click(objectsender,EventArgse)
  58. {
  59. ServerSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  60. ServerInfo=newIPEndPoint(IPAddress.Any,this.GetPort());
  61. ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
  62. ServerSocket.Listen(10);//开端监听,而且挂起数为10
  63. ClientSocket=newSocket[65535];//为客户端供给衔接个数
  64. MsgBuffer=newbyte[65535];//音讯数据巨细
  65. ClientNumb=0;//数量从0开端计算
  66. ServerThread=newThread(RecieveAccept);//将承受客户端衔接的办法托付给线程
  67. ServerThread.Start();//线程开端运转
  68. CheckForIllegalCrossThreadCalls=false;//不捕获对过错线程的调用
  69. this.CmdStar.Enabled=false;
  70. this.CmdStop.Enabled=true;
  71. this.StateMsg.Text="服务正在运转"+"运转端口:"+this.GetPort().ToString();
  72. this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"开端运转.");
  73. }
  74. //承受客户端衔接的办法
  75. privatevoidRecieveAccept()
  76. {
  77. while(true)
  78. {
  79. ClientSocket[ClientNumb]=ServerSocket.Accept();
  80. ClientSocket[ClientNumb].BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);
  81. this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString()+"成功衔接服务器.");
  82. ClientNumb++;
  83. }
  84. }
  85. //回发数据给客户端
  86. privatevoidRecieveCallBack(IAsyncResultAR)
  87. {
  88. try
  89. {
  90. SocketRSocket=(Socket)AR.AsyncState;
  91. intREnd=RSocket.EndReceive(AR);
  92. for(inti=0;i<ClientNumb;i++)
  93. {
  94. if(ClientSocket[i].Connected)
  95. {
  96. ClientSocket[i].Send(MsgBuffer,0,REnd,0);
  97. }
  98. RSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(RecieveCallBack),RSocket);
  99. }
  100. }
  101. catch{}
  102. }
  103. privatevoidCmdStop_Click(objectsender,EventArgse)
  104. {
  105. ServerThread.Abort();//线程中止
  106. ServerSocket.Close();//封闭SOCKET
  107. this.CmdStar.Enabled=true;
  108. this.CmdStop.Enabled=false;
  109. this.StateMsg.Text="等候运转";
  110. this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"中止运转.");
  111. }
  112. }
  113. }

客户端代码:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.ComponentModel;
  4. usingSystem.Data;
  5. usingSystem.Drawing;
  6. usingSystem.Text;
  7. usingSystem.Windows.Forms;
  8. usingSystem.Net;
  9. usingSystem.Net.Sockets;
  10. namespaceClient
  11. {
  12. publicpartialclassClientMain:Form
  13. {
  14. publicClientMain()
  15. {
  16. InitializeComponent();
  17. }
  18. privateIPEndPointServerInfo;
  19. privateSocketClientSocket;
  20. privateByte[]MsgBuffer;
  21. privateByte[]MsgSend;
  22. privatevoidClientMain_Load(objectsender,EventArgse)
  23. {
  24. this.CmdSend.Enabled=false;
  25. this.CmdExit.Enabled=false;
  26. ClientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  27. MsgBuffer=newByte[65535];
  28. MsgSend=newByte[65535];
  29. CheckForIllegalCrossThreadCalls=false;
  30. RandomTRand=newRandom();
  31. this.UserName.Text="用户"+TRand.Next(10000).ToString();
  32. }
  33. privatevoidCmdEnter_Click(objectsender,EventArgse)
  34. {
  35. ServerInfo=newIPEndPoint(IPAddress.Parse(this.ServerIP.Text),Convert.ToInt32(this.ServerPort.Text));
  36. try
  37. {
  38. ClientSocket.Connect(ServerInfo);
  39. ClientSocket.Send(Encoding.Unicode.GetBytes("用户:"+this.UserName.Text+"进入体系!\n"));
  40. ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(ReceiveCallBack),null);
  41. this.SysMsg.Text+="登录服务器成功!\n";
  42. this.CmdSend.Enabled=true;
  43. this.CmdEnter.Enabled=false;
  44. this.CmdExit.Enabled=true;
  45. }
  46. catch
  47. {
  48. MessageBox.Show("登录服务器失利,请承认服务器是否正常作业!");
  49. }
  50. }
  51. privatevoidReceiveCallBack(IAsyncResultAR)
  52. {
  53. try
  54. {
  55. intREnd=ClientSocket.EndReceive(AR);
  56. this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer,0,REnd));
  57. ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(ReceiveCallBack),null);
  58. }
  59. catch
  60. {
  61. MessageBox.Show("现已与服务器断开衔接!");
  62. this.Close();
  63. }
  64. }
  65. privatevoidCmdSend_Click(objectsender,EventArgse)
  66. {
  67. MsgSend=Encoding.Unicode.GetBytes(this.UserName.Text+"说:\n"+this.SendMsg.Text+"\n");
  68. if(ClientSocket.Connected)
  69. {
  70. ClientSocket.Send(MsgSend);
  71. this.SendMsg.Text="";
  72. }
  73. else
转载请说明出处
知优网 » 服务器+客户端的谈天程序

发表评论

您需要后才能发表评论