用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

免费源代码下载整理    -  云代码空间

—— 每天更新整理各种PHP、JSP、ASP源代码,敬请关注我的微博 http://weibo.com/freecodedownload

网络编程 TCP异步 群聊客户 端代码

2013-11-22|2413阅||

摘要:   最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。     该程序可以在公共网络上运行,只要输入服务器的IP地址即可。

   最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。

    该程序可以在公共网络上运行,只要输入服务器的IP地址即可。

    程序不是很难,由于时间过了一年多了,现在也不好详细讲解了。就贴一下代码,程序还是很容易理解的,看英文单词就知道代码的意思了。


服务器代码在:http://blog.csdn.net/arsenal1109389480/article/details/12399803


第一步:建一个Winform程序

第二步:添加一个类

[csharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. using System.Net.Sockets;  
  8.   
  9. namespace Client  
  10. {  
  11.     class ReadObject  
  12.     {  
  13.         public NetworkStream netStream;  
  14.         public byte[] bytes;  
  15.         public ReadObject(NetworkStream netStream, int bufferSize)  
  16.         {  
  17.             this.netStream = netStream;  
  18.             bytes = new byte[bufferSize];  
  19.         }  
  20.     }  
  21. }  


第三步:客户端代码

[csharp] view plaincopy
  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.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. using System.Net;  
  12. using System.Net.Sockets;  
  13. using System.Threading;  
  14.   
  15. namespace Client  
  16. {  
  17.     public partial class Client : Form  
  18.     {  
  19.         private bool isExit = false;  
  20.         private TcpClient client;  
  21.         private NetworkStream networkStream;  
  22.   
  23.         private EventWaitHandle allDone =  
  24.             new EventWaitHandle(false, EventResetMode.ManualReset);  
  25.   
  26.         private delegate void SetRichtextBoxRecieve(string str);  
  27.         SetRichtextBoxRecieve setrichtextboxrecieve;  
  28.         private delegate void SetRichtextBoxSend(string str);  
  29.         SetRichtextBoxSend setrichtextboxsend;  
  30.         private delegate void SetRichtextBoxStatus(string str);  
  31.         SetRichtextBoxStatus setrichtextboxstatu;  
  32.   
  33.         public Client()  
  34.         {  
  35.             InitializeComponent();  
  36.             buttonStart.Enabled = true;  
  37.             buttonSend.Enabled = false;  
  38.             buttonStop.Enabled = true;  
  39.   
  40.             setrichtextboxrecieve = new SetRichtextBoxRecieve(RecieceRichtextBox);  
  41.             setrichtextboxsend = new SetRichtextBoxSend(SendRichtextBox);  
  42.             setrichtextboxstatu = new SetRichtextBoxStatus(StatuRichtextBox);  
  43.         }  
  44.   
  45.         private void buttonStart_Click(object sender, EventArgs e)  
  46.         {  
  47.             client = new TcpClient(AddressFamily.InterNetwork);  
  48.   
  49.             AsyncCallback requestCallback = new AsyncCallback(RequestCallback);  
  50.   
  51.             allDone.Reset();  
  52.   
  53.             client.BeginConnect(textBoxIP.Text, Convert.ToInt32(textBoxPort.Text), requestCallback, client);  
  54.   
  55.             richTextBoxStatu.Invoke(setrichtextboxstatu, string.Format("本机EndPoint:{0}",  
  56.                client.Client.LocalEndPoint));  
  57.             richTextBoxStatu.Invoke(setrichtextboxstatu, "开始与服务器建立连接");  
  58.   
  59.             allDone.WaitOne();  
  60.   
  61.             buttonSend.Enabled = true;  
  62.             buttonStart.Enabled = false;  
  63.             buttonStop.Enabled = true;  
  64.         }  
  65.   
  66.         private void RequestCallback(IAsyncResult ar)  
  67.         {  
  68.             allDone.Set();  
  69.             try  
  70.             {  
  71.                 client = (TcpClient)ar.AsyncState;  
  72.                 client.EndConnect(ar);  
  73.   
  74.                 richTextBoxStatu.Invoke(setrichtextboxstatu,  
  75.                     string.Format("与服务器{0}连接成功", client.Client.RemoteEndPoint));  
  76.   
  77.                 networkStream = client.GetStream();  
  78.   
  79.                 ReadObject readobject =  
  80.                     new ReadObject(networkStream, client.ReceiveBufferSize);  
  81.   
  82.                 networkStream.BeginRead(readobject.bytes,  
  83.                     0, readobject.bytes.Length, ReadCallback, readobject);  
  84.             }  
  85.             catch (Exception err)  
  86.             {  
  87.                 MessageBox.Show(err.Message);  
  88.             }  
  89.         }  
  90.   
  91.         private void ReadCallback(IAsyncResult ar)  
  92.         {  
  93.             try  
  94.             {  
  95.                 ReadObject readobject = (ReadObject)ar.AsyncState;  
  96.                 int count = readobject.netStream.EndRead(ar);  
  97.   
  98.                 richTextBoxRecieve.Invoke(setrichtextboxrecieve,  
  99.                     System.Text.Encoding.UTF8.GetString(readobject.bytes, 0, count));  
  100.   
  101.                 if (isExit == false)  
  102.                 {  
  103.                     //重新调用BeginRead进行异步读取  
  104.                     readobject = new ReadObject(networkStream, client.ReceiveBufferSize);  
  105.                     networkStream.BeginRead(readobject.bytes,  
  106.                         0, readobject.bytes.Length, ReadCallback, readobject);  
  107.                 }  
  108.             }  
  109.             catch  
  110.             {  
  111.                 MessageBox.Show("与服务器断开连接!");  
  112.             }  
  113.         }  
  114.   
  115.         private void SendString(string str)  
  116.         {  
  117.             try  
  118.             {  
  119.                 byte[] bytesData = System.Text.Encoding.UTF8.GetBytes(str);  
  120.                 networkStream.BeginWrite(bytesData,  
  121.                     0, bytesData.Length, new AsyncCallback(SendCallback), networkStream);  
  122.                 networkStream.Flush();  
  123.             }  
  124.             catch(Exception err)  
  125.             {  
  126.                 MessageBox.Show(err.Message);  
  127.             }  
  128.         }  
  129.   
  130.         private void SendCallback(IAsyncResult ar)  
  131.         {  
  132.             try  
  133.             {  
  134.                 networkStream.EndWrite(ar);  
  135.             }  
  136.             catch  
  137.             {  
  138.                 MessageBox.Show("已断开连接!");  
  139.             }  
  140.         }  
  141.   
  142.         private void StatuRichtextBox(string str)  
  143.         {  
  144.             richTextBoxStatu.AppendText(str+"\r\n");  
  145.         }  
  146.         private void SendRichtextBox(string str)  
  147.         {  
  148.             richTextBoxSend.AppendText(str + "\r\n");  
  149.         }  
  150.         private void RecieceRichtextBox(string str)  
  151.         {  
  152.             richTextBoxRecieve.AppendText(str + "\r\n");  
  153.         }  
  154.   
  155.         private void buttonSend_Click(object sender, EventArgs e)  
  156.         {  
  157.             SendString(richTextBoxSend.Text);  
  158.             richTextBoxSend.Clear();  
  159.         }  
  160.   
  161.         private void buttonStop_Click(object sender, EventArgs e)  
  162.         {  
  163.             try  
  164.             {  
  165.                 SendString(textBoxUser.Text + "离开了房间!!");  
  166.                 networkStream.Close();  
  167.             }  
  168.             catch (Exception err)  
  169.             {  
  170.                 MessageBox.Show(err.Message);  
  171.             }  
  172.   
  173.             buttonSend.Enabled = false;  
  174.             buttonStart.Enabled = true;  
  175.             buttonStop.Enabled = false;  
  176.         }  
  177.   
  178.         private void Client_FormClosing(object sender, FormClosingEventArgs e)  
  179.         {  
  180.             isExit = true;  
  181.             allDone.Set();  
  182.         }  
  183.   
  184.         private void buttonSend_KeyDown(object sender, KeyEventArgs e)  
  185.         {  
  186.             if (e.Control && e.KeyValue == 13)  
  187.             {  
  188.                 e.Handled = true;  
  189.                 buttonSend_Click(thisnull);  
  190.             }  
  191.         }  
  192.     }  
  193. }  

顶 0踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: 免费源代码下载整理
    • 等级: 资深程序员
    • 积分: 1676
    • 代码: 110 个
    • 文章: 56 篇
    • 随想: 5 条
    • 访问: 425 次
    • 关注

    最新提问

      站长推荐