在当今这样一个网络时代,很多技术都以网络为中心在诞生。本文介绍了服务器端+客户端的聊天系统,希望对大家有用。
最近也在触摸SOCKET编程,在当今这样一个网络时代,许多技能都以网络为中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在完成网络通讯上处于要害位置,所以不会SOCKET是不可的。
首要,本文主要是针对那些刚触摸SOCKET编程的朋友,如果是高手,就能够不看此文啦
在开端之前,咱们需求预习一些基础知识:
什么是SOCKET套接字?
SOCKET一般有那几种数据格式?
线程的概念?
(以上基本知识我就不讲了,网上这方面材料许多的,咱们找材料看下吧)
我要介绍的是一个服务器端+客户端的谈天体系,程序比较简单,我先把程序运转的界面给咱们看下:
上面是服务器端运转界面;下面把客户端界面贴给咱们看下:
功用比较简单,服务器的端口号能够在“体系菜单”里边的参数装备进行修正的。
看了上面的图,下面咱们就给咱们把代码贴出来:(由于程序比较简单,所以自己就没有去分层啦)
服务器端代码:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.ComponentModel;
- usingSystem.Data;
- usingSystem.Drawing;
- usingSystem.Text;
- usingSystem.Windows.Forms;
- usingSystem.Net;
- usingSystem.Net.Sockets;
- usingSystem.Threading;
- usingSystem.Xml;
- namespaceServer
- {
- publicpartialclassServerMain:Form
- {
- publicServerMain()
- {
- InitializeComponent();
- }
- privatevoidServerMain_Load(objectsender,EventArgse)
- {
- this.CmdStar.Enabled=true;
- this.CmdStop.Enabled=false;
- }
- privatevoid装备参数ToolStripMenuItem_Click(objectsender,EventArgse)
- {
- SetTSet=newSet();
- TSet.ShowDialog();
- }
- privatevoid关于ToolStripMenuItem_Click(objectsender,EventArgse)
- {
- AboutTAbout=newAbout();
- TAbout.Show();
- }
- ///<summary>
- ///取得XML文件中的端口号
- ///</summary>
- ///<returns></returns>
- privateintGetPort()
- {
- try
- {
- XmlDocumentTDoc=newXmlDocument();
- TDoc.Load("Settings.xml");
- stringTPort=TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;
- returnConvert.ToInt32(TPort);
- }
- catch{return6600;}//默许是6600
- }
- //声明即将用到的类
- privateIPEndPointServerInfo;//寄存服务器的IP和端口信息
- privateSocketServerSocket;//服务端运转的SOCKET
- privateThreadServerThread;//服务端运转的线程
- privateSocket[]ClientSocket;//为客户端树立的SOCKET衔接
- privateintClientNumb;//寄存客户端数量
- privatebyte[]MsgBuffer;//寄存音讯数据
- privatevoidCmdStar_Click(objectsender,EventArgse)
- {
- ServerSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
- ServerInfo=newIPEndPoint(IPAddress.Any,this.GetPort());
- ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
- ServerSocket.Listen(10);//开端监听,而且挂起数为10
- ClientSocket=newSocket[65535];//为客户端供给衔接个数
- MsgBuffer=newbyte[65535];//音讯数据巨细
- ClientNumb=0;//数量从0开端计算
- ServerThread=newThread(RecieveAccept);//将承受客户端衔接的办法托付给线程
- ServerThread.Start();//线程开端运转
- CheckForIllegalCrossThreadCalls=false;//不捕获对过错线程的调用
- this.CmdStar.Enabled=false;
- this.CmdStop.Enabled=true;
- this.StateMsg.Text="服务正在运转"+"运转端口:"+this.GetPort().ToString();
- this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"开端运转.");
- }
- //承受客户端衔接的办法
- privatevoidRecieveAccept()
- {
- while(true)
- {
- ClientSocket[ClientNumb]=ServerSocket.Accept();
- ClientSocket[ClientNumb].BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);
- this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString()+"成功衔接服务器.");
- ClientNumb++;
- }
- }
- //回发数据给客户端
- privatevoidRecieveCallBack(IAsyncResultAR)
- {
- try
- {
- SocketRSocket=(Socket)AR.AsyncState;
- intREnd=RSocket.EndReceive(AR);
- for(inti=0;i<ClientNumb;i++)
- {
- if(ClientSocket[i].Connected)
- {
- ClientSocket[i].Send(MsgBuffer,0,REnd,0);
- }
- RSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(RecieveCallBack),RSocket);
- }
- }
- catch{}
- }
- privatevoidCmdStop_Click(objectsender,EventArgse)
- {
- ServerThread.Abort();//线程中止
- ServerSocket.Close();//封闭SOCKET
- this.CmdStar.Enabled=true;
- this.CmdStop.Enabled=false;
- this.StateMsg.Text="等候运转";
- this.ClientList.Items.Add("服务于"+DateTime.Now.ToString()+"中止运转.");
- }
- }
- }
客户端代码:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.ComponentModel;
- usingSystem.Data;
- usingSystem.Drawing;
- usingSystem.Text;
- usingSystem.Windows.Forms;
- usingSystem.Net;
- usingSystem.Net.Sockets;
- namespaceClient
- {
- publicpartialclassClientMain:Form
- {
- publicClientMain()
- {
- InitializeComponent();
- }
- privateIPEndPointServerInfo;
- privateSocketClientSocket;
- privateByte[]MsgBuffer;
- privateByte[]MsgSend;
- privatevoidClientMain_Load(objectsender,EventArgse)
- {
- this.CmdSend.Enabled=false;
- this.CmdExit.Enabled=false;
- ClientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
- MsgBuffer=newByte[65535];
- MsgSend=newByte[65535];
- CheckForIllegalCrossThreadCalls=false;
- RandomTRand=newRandom();
- this.UserName.Text="用户"+TRand.Next(10000).ToString();
- }
- privatevoidCmdEnter_Click(objectsender,EventArgse)
- {
- ServerInfo=newIPEndPoint(IPAddress.Parse(this.ServerIP.Text),Convert.ToInt32(this.ServerPort.Text));
- try
- {
- ClientSocket.Connect(ServerInfo);
- ClientSocket.Send(Encoding.Unicode.GetBytes("用户:"+this.UserName.Text+"进入体系!\n"));
- ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(ReceiveCallBack),null);
- this.SysMsg.Text+="登录服务器成功!\n";
- this.CmdSend.Enabled=true;
- this.CmdEnter.Enabled=false;
- this.CmdExit.Enabled=true;
- }
- catch
- {
- MessageBox.Show("登录服务器失利,请承认服务器是否正常作业!");
- }
- }
- privatevoidReceiveCallBack(IAsyncResultAR)
- {
- try
- {
- intREnd=ClientSocket.EndReceive(AR);
- this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer,0,REnd));
- ClientSocket.BeginReceive(MsgBuffer,0,MsgBuffer.Length,0,newAsyncCallback(ReceiveCallBack),null);
- }
- catch
- {
- MessageBox.Show("现已与服务器断开衔接!");
- this.Close();
- }
- }
- privatevoidCmdSend_Click(objectsender,EventArgse)
- {
- MsgSend=Encoding.Unicode.GetBytes(this.UserName.Text+"说:\n"+this.SendMsg.Text+"\n");
- if(ClientSocket.Connected)
- {
- ClientSocket.Send(MsgSend);
- this.SendMsg.Text="";
- }
- else
转载请说明出处
知优网 » 服务器+客户端的谈天程序
知优网 » 服务器+客户端的谈天程序