日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
服務器+客戶端的聊天程序

最近也在接觸SOCKET編程,在當今這樣一個網(wǎng)絡時代,很多技術都以網(wǎng)絡為中心在誕生,至少我認為是這樣的,而SOCKET套接字接口,在實現(xiàn)網(wǎng)絡通訊上處于關鍵地位,所以不會SOCKET是不行的。

創(chuàng)新互聯(lián)一直通過網(wǎng)站建設和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務,以網(wǎng)站設計制作、成都網(wǎng)站建設、移動互聯(lián)產(chǎn)品、營銷型網(wǎng)站建設服務為核心業(yè)務。10年網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設技術,全新開發(fā)出的標準網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設的選擇。

首先,本文主要是針對那些剛接觸SOCKET編程的朋友,如果是高手,就可以不看此文啦

在開始之前,我們需要預習一些基礎知識:

什么是SOCKET套接字?

SOCKET通常有那幾種數(shù)據(jù)格式?

線程的概念?

(以上基本知識我就不講了,網(wǎng)上這方面資料很多的,大家找資料看下吧)

我要介紹的是一個服務器端+客戶端的聊天系統(tǒng),程序比較簡單,我先把程序運行的界面給大家看下:

上面是服務器端運行界面;下面把客戶端界面貼給大家看下:

功能比較簡單,服務器的端口號可以在“系統(tǒng)菜單”里面的參數(shù)配置進行修改的。

看了上面的圖,下面我們就給大家把代碼貼出來:(因為程序比較簡單,所以本人就沒有去分層啦)

服務器端代碼:

 
 
 
 
  1.  using System;  
  2.  using System.Collections.Generic;  
  3.  using System.ComponentModel;  
  4.  using System.Data;  
  5.  using System.Drawing;  
  6.  using System.Text;  
  7.  using System.Windows.Forms;  
  8.    
  9.  using System.Net;  
  10.  using System.Net.Sockets;  
  11.  using System.Threading;  
  12.  using System.Xml;  
  13.    
  14.  namespace Server  
  15.  {  
  16.      public partial class ServerMain : Form  
  17.      {  
  18.          public ServerMain()  
  19.          {  
  20.              InitializeComponent();  
  21.          }  
  22.    
  23.          private void ServerMain_Load(object sender, EventArgs e)  
  24.          {  
  25.              this.CmdStar.Enabled = true;  
  26.              this.CmdStop.Enabled = false;  
  27.          }  
  28.    
  29.          private void 配置參數(shù)ToolStripMenuItem_Click(object sender, EventArgs e)  
  30.          {  
  31.              Set TSet = new Set();  
  32.              TSet.ShowDialog();  
  33.          }  
  34.  
  35.          private void 關于ToolStripMenuItem_Click(object sender, EventArgs e)  
  36.          {  
  37.              About TAbout = new About();  
  38.              TAbout.Show();  
  39.          }  
  40.          /// < summary>  
  41.          /// 獲得XML文件中的端口號  
  42.          /// < /summary>  
  43.          /// < returns>< /returns>  
  44.          private int GetPort()  
  45.          {  
  46.              try 
  47.              {  
  48.                  XmlDocument TDoc = new XmlDocument();  
  49.                  TDoc.Load("Settings.xml");  
  50.                  string TPort = TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;  
  51.                  return Convert.ToInt32(TPort);  
  52.    
  53.              }  
  54.              catch { return 6600; }//默認是6600  
  55.          }  
  56.    
  57.          //聲明將要用到的類  
  58.          private IPEndPoint ServerInfo;//存放服務器的IP和端口信息  
  59.          private Socket ServerSocket;//服務端運行的SOCKET  
  60.          private Thread ServerThread;//服務端運行的線程  
  61.          private Socket[] ClientSocket;//為客戶端建立的SOCKET連接  
  62.          private int ClientNumb;//存放客戶端數(shù)量  
  63.          private byte[] MsgBuffer;//存放消息數(shù)據(jù)  
  64.    
  65.          private void CmdStar_Click(object sender, EventArgs e)  
  66.          {  
  67.              ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  68.              ServerInfo=new IPEndPoint(IPAddress.Any,this.GetPort());  
  69.              ServerSocket.Bind(ServerInfo);//將SOCKET接口和IP端口綁定  
  70.              ServerSocket.Listen(10);//開始監(jiān)聽,并且掛起數(shù)為10  
  71.    
  72.              ClientSocket = new Socket[65535];//為客戶端提供連接個數(shù)  
  73.              MsgBuffer = new byte[65535];//消息數(shù)據(jù)大小  
  74.              ClientNumb = 0;//數(shù)量從0開始統(tǒng)計  
  75.    
  76.              ServerThread = new Thread(RecieveAccept);//將接受客戶端連接的方法委托給線程  
  77.              ServerThread.Start();//線程開始運行  
  78.    
  79.              CheckForIllegalCrossThreadCalls = false;//不捕獲對錯誤線程的調(diào)用  
  80.    
  81.              this.CmdStar.Enabled = false;  
  82.              this.CmdStop.Enabled = true;  
  83.              this.StateMsg.Text = "服務正在運行"+"  運行端口:"+this.GetPort().ToString();  
  84.              this.ClientList.Items.Add("服務于 " + DateTime.Now.ToString() + " 開始運行.");  
  85.          }  
  86.            
  87.          //接受客戶端連接的方法  
  88.          private void RecieveAccept()  
  89.          {  
  90.              while (true)  
  91.              {  
  92.                  ClientSocket[ClientNumb] = ServerSocket.Accept();  
  93.                  ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);  
  94.                  this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString()+" 成功連接服務器.");  
  95.                  ClientNumb++;  
  96.              }  
  97.          }  
  98.    
  99.          //回發(fā)數(shù)據(jù)給客戶端  
  100.         private void RecieveCallBack(IAsyncResult AR)  
  101.         {  
  102.             try 
  103.             {  
  104.                 Socket RSocket = (Socket)AR.AsyncState;  
  105.                 int REnd = RSocket.EndReceive(AR);  
  106.                 for (int i = 0; i <  ClientNumb; i++)  
  107.                 {  
  108.                     if (ClientSocket[i].Connected)  
  109.                     {  
  110.                         ClientSocket[i].Send(MsgBuffer, 0, REnd,0);  
  111.                     }  
  112.                     RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);  
  113.  
  114.                 }  
  115.             }  
  116.             catch { }  
  117.  
  118.         }  
  119.  
  120.         private void CmdStop_Click(object sender, EventArgs e)  
  121.         {  
  122.             ServerThread.Abort();//線程終止  
  123.             ServerSocket.Close();//關閉SOCKET  
  124.  
  125.             this.CmdStar.Enabled = true;  
  126.             this.CmdStop.Enabled = false;  
  127.             this.StateMsg.Text = "等待運行";  
  128.             this.ClientList.Items.Add("服務于 " + DateTime.Now.ToString() + " 停止運行.");  
  129.         }  
  130.  
  131.  
  132.  
  133.     }  

客戶端代碼:

 
 
 
 
  1.  using System;  
  2.  using System.Collections.Generic;  
  3.  using System.ComponentModel;  
  4.  using System.Data;  
  5.  using System.Drawing;  
  6.  using System.Text;  
  7.  using System.Windows.Forms;  
  8.    
  9.  using System.Net;  
  10.  using System.Net.Sockets;  
  11.  
  12. namespace Client  
  13. {  
  14.     public partial class ClientMain : Form  
  15.     {  
  16.         public ClientMain()  
  17.         {  
  18.             InitializeComponent();  
  19.         }  
  20.  
  21.         private IPEndPoint ServerInfo;  
  22.         private Socket ClientSocket;  
  23.         private Byte[] MsgBuffer;  
  24.         private Byte[] MsgSend;  
  25.  
  26.         private void ClientMain_Load(object sender, EventArgs e)  
  27.         {  
  28.             this.CmdSend.Enabled = false;  
  29.             this.CmdExit.Enabled = false;  
  30.  
  31.             ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  32.             MsgBuffer = new Byte[65535];  
  33.             MsgSend = new Byte[65535];  
  34.             CheckForIllegalCrossThreadCalls = false;  
  35.  
  36.             Random TRand=new Random();  
  37.             this.UserName.Text = "用戶" + TRand.Next(10000).ToString();  
  38.         }  
  39.  
  40.         private void CmdEnter_Click(object sender, EventArgs e)  
  41.         {  
  42.             ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));  
  43.  
  44.             try 
  45.             {  
  46.                 ClientSocket.Connect(ServerInfo);  
  47.  
  48.                 ClientSocket.Send(Encoding.Unicode.GetBytes("用戶: " + this.UserName.Text + " 進入系統(tǒng)!\n"));  
  49.  
  50.                 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);  
  51.  
  52.                 this.SysMsg.Text += "登錄服務器成功!\n";  
  53.                 this.CmdSend.Enabled = true;  
  54.                 this.CmdEnter.Enabled = false;  
  55.                 this.CmdExit.Enabled = true;  
  56.             }  
  57.             catch 
  58.             {  
  59.                 MessageBox.Show("登錄服務器失敗,請確認服務器是否正常工作!");  
  60.             }  
  61.         }  
  62.  
  63.         private void ReceiveCallBack(IAsyncResult AR)  
  64.         {  
  65.             try 
  66.             {  
  67.                 int REnd = ClientSocket.EndReceive(AR);  
  68.                 this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer, 0, REnd));  
  69.                 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);  
  70.  
  71.             }  
  72.             catch 
  73.             {  
  74.                 MessageBox.Show("已經(jīng)與服務器斷開連接!");  
  75.                 this.Close();  
  76.            }  
  77.  
  78.         }  
  79.  
  80.         private void CmdSend_Click(object sender, EventArgs e)  
  81.         {  
  82.            MsgSend = Encoding.Unicode.GetBytes(this.UserName.Text + "說:\n" + this.SendMsg.Text + "\n");  
  83.             if (ClientSocket.Connected)  
  84.             {  
  85.                 ClientSocket.Send(MsgSend);  
  86.                 this.SendMsg.Text = "";  
  87.             }  
  88.             else 
  89.             {  
  90.                 MessageBox.Show("當前與服務器斷開連接,無法發(fā)送信息!");  
  91.             }  
  92.         }  
  93.  
  94.         private void CmdExit_Click(object sender, EventArgs e)  
  95.         {  
  96.             if (ClientSocket.Connected)  
  97.             {  
  98.                 ClientSocket.Send(Encoding.Unicode.GetBytes(this.UserName.Text + "離開了房間!\n"));  
  99.                 ClientSocket.Shutdown(SocketShutdown.Both);  
  100.                ClientSocket.Disconnect(false);  
  101.            }  
  102.            ClientSocket.Close();  
  103.  
  104.            this.CmdSend.Enabled = false;  
  105.            this.CmdEnter.Enabled = true;  
  106.            this.CmdExit.Enabled = false;  
  107.        }  
  108.  
  109.        private void RecieveMsg_TextChanged(object sender, EventArgs e)  
  110.        {  
  111.            this.RecieveMsg.ScrollToCaret();  
  112.        }  
  113.  
  114.        private void SendMsg_KeyDown(object sender, KeyEventArgs e)  
  115.        {  
  116.            if (e.Control && e.KeyValue == 13)  
  117.            {  
  118.                e.Handled = true;  
  119.                this.CmdSend_Click(this, null);  
  120.            }  
  121.        }  
  122.  
  123.  
  124.  
  125.  
  126.    }  

我只對服務器端的代碼做了注釋,客戶端就沒有寫注釋了,因為代碼是差不多的。區(qū)別在于客戶端不需要監(jiān)聽,也不需要啟用線程進行委托。

關于 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

這句代碼,我想給初學者解釋一下,這里“AddressFamily.InterNetwork”表示的是使用IPV4地址,“SocketType.Stream”表示使用的是流格式(另外還有數(shù)據(jù)包格式和原始套接字格式),“ProtocolType.Tcp”表示使用TCP協(xié)議(另外還有很多其它協(xié)議,例如大家常看到的UDP協(xié)議)。

服務器端+客戶端的聊天系統(tǒng)就介紹完了。另外關于SOCKET類中的BeginReceive方法,請大家參考MSDN,里面有詳細說明。


分享題目:服務器+客戶端的聊天程序
分享URL:http://www.dlmjj.cn/article/djejpsg.html