成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

服務器+客戶端的聊天程序

開發 后端
在當今這樣一個網絡時代,很多技術都以網絡為中心在誕生。本文介紹了服務器端+客戶端的聊天系統,希望對大家有用。

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

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

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

什么是SOCKET套接字?

SOCKET通常有那幾種數據格式?

線程的概念?

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

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

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

客戶端界面 

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

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

服務器端代碼:

  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 配置參數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;//存放客戶端數量  
  63.          private byte[] MsgBuffer;//存放消息數據  
  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);//開始監聽,并且掛起數為10  
  71.    
  72.              ClientSocket = new Socket[65535];//為客戶端提供連接個數  
  73.              MsgBuffer = new byte[65535];//消息數據大小  
  74.              ClientNumb = 0;//數量從0開始統計  
  75.    
  76.              ServerThread = new Thread(RecieveAccept);//將接受客戶端連接的方法委托給線程  
  77.              ServerThread.Start();//線程開始運行  
  78.    
  79.              CheckForIllegalCrossThreadCalls = false;//不捕獲對錯誤線程的調用  
  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.          //回發數據給客戶端  
  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 + " 進入系統!\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("已經與服務器斷開連接!");  
  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("當前與服務器斷開連接,無法發送信息!");  
  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(thisnull);  
  120.            }  
  121.        }  
  122.  
  123.  
  124.  
  125.  
  126.    }  

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

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

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

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

【編輯推薦】

  1. 關于C#知識點總結
  2. C#開發和使用中的33個技巧
  3. SQL Server存儲過程介紹
  4. C#下SQL Server 2008表類型參數傳遞
  5. C#向SQL Server中插入記錄時的問題
責任編輯:book05 來源: 博客園
相關推薦

2011-06-09 10:51:26

Qt 服務器 客戶端

2014-01-17 15:23:55

Nagios

2010-06-09 14:39:58

2018-07-17 09:59:10

PythonUDP服務器

2018-12-18 10:47:37

2009-12-25 10:47:17

DNS服務器

2009-09-16 16:09:41

NIS服務器客戶端NIS

2019-08-28 15:19:15

PythonTCP服務器

2018-12-19 10:31:32

客戶端IP服務器

2012-05-29 09:38:04

Linux客戶端服務器

2010-10-11 17:46:01

mysql客戶端

2018-12-20 08:50:53

TCPIP服務器

2010-10-26 13:54:45

連接Oracle服務器

2009-06-27 20:32:00

LinuxNFS客戶端

2010-08-27 10:18:24

DHCP服務

2025-06-19 02:30:00

Spring服務器MCP

2014-06-01 11:03:13

VDI零客戶端

2024-02-22 13:47:40

2012-05-07 13:55:41

JavaJava Web

2009-06-10 16:25:02

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 三区在线观看 | 九九久久国产 | 欧美一级片在线观看 | 羞羞视频免费观 | 91在线一区 | 日韩在线视频精品 | 日韩精品 电影一区 亚洲 | 亚洲视频一区二区三区 | 精品久久久久久亚洲综合网站 | 欧洲成人 | 久产久精国产品 | 婷婷福利 | 影音av| 国产色婷婷精品综合在线播放 | 精品国产一区二区在线 | av在线一区二区三区 | 一区二区三区视频免费观看 | 欧美色综合网 | 精品久久久久久久 | 成人久久久久 | 欧洲精品视频一区 | 国产一级免费视频 | japanhdxxxx裸体| 国产一区二区在线视频 | 一区二区三区韩国 | 不卡一区二区三区四区 | 欧美激情一区二区 | 日本不卡免费新一二三区 | 女同久久另类99精品国产 | 精品视频在线免费观看 | 日韩国产高清在线观看 | 91免费视频 | 国产精品99久久久久久宅男 | 日韩1区2区 | 国产在线网站 | 99资源| 天天弄天天操 | 中文字幕1区2区3区 日韩在线视频免费观看 | 欧美美女一区二区 | 日本一区二区三区四区 | 91精品久久久久久久久久入口 |