首页 > 代码库 > Tcp客户端的代码

Tcp客户端的代码

  1 using System;  2 using System.Windows.Forms;  3 //添加的命名空间引用  4 using System.Net;  5 using System.Net.Sockets;  6 using System.Threading;  7 using System.IO;  8 namespace SyncChatClient  9 { 10     public partial class MainForm : Form 11     { 12         private bool isExit = false; 13         private TcpClient client; 14         private BinaryReader br; 15         private BinaryWriter bw; 16         public MainForm() 17         { 18             InitializeComponent(); 19             Random r = new Random((int)DateTime.Now.Ticks);//?????????????????????????????????????? 20             textBoxUserName.Text = "user" + r.Next(100, 999);//????????????????????????????????????? 21             listBoxOnlineStatus.HorizontalScrollbar = true;//??????????????????????????????????????????????????????????????????????????? 22  23         } 24         /// <summary> 25         /// 【连接服务器】按钮的Click事件 26         /// </summary> 27         private void buttonConnect_Click(object sender, EventArgs e) 28         { 29             buttonConnect.Enabled = false; 30             try 31             { 32                 //此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名 33                 client = new TcpClient(Dns.GetHostName(), 51888); 34                 //后面添加的函数,给文本框中添加信息 35                 AddTalkMessage("连接成功"); 36             } 37             catch 38             { 39                 AddTalkMessage("连接失败"); 40                 buttonConnect.Enabled = true; 41                 return; 42             } 43             //获取网络流 44             NetworkStream networkStream = client.GetStream(); 45             //将网络流作为二进制读写对象 46             br = new BinaryReader(networkStream); 47             bw = new BinaryWriter(networkStream); 48             //向服务器端发送信息 49             SendMessage("Login," + textBoxUserName.Text); 50             Thread threadReceive = new Thread(new ThreadStart(ReceiveData));//??????????????????????????????????????????????????????? 51             threadReceive.IsBackground = true;//??????????????????????????????????????????????????????????????????????????? 52             threadReceive.Start(); 53         } 54         /// <summary>处理接收的服务器端数据</summary> 55         private void ReceiveData() 56         { 57             string receiveString = null; 58             while (isExit == false) 59             { 60                 try 61                 { 62                     //从网络流中读出字符串 63                     //此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串 64                     receiveString = br.ReadString(); 65                 } 66                 catch 67                 { 68                     if (isExit == false) 69                     { 70                         MessageBox.Show("与服务器失去联系。"); 71                     } 72                     break; 73                 } 74                 string[] splitString= receiveString.Split(,); 75                 string command = splitString[0].ToLower(); 76                 switch (command) 77                 { 78                     case "login":  //格式:login,用户名 79                         AddOnline(splitString[1]);//在listBoxOnlineStatus当中添加已经登陆的用户的信息 80                         break; 81                     case "logout":  //格式:logout,用户名 82                         RemoveUserName(splitString[1]);//移除listBoxOnlineStatus当中已经离线的信息 83                         break; 84                     case "talk":  //格式:talk,用户名,对话信息 85                         //AddTalkMessage(splitString[1] + ":\r\n"); 86                         //AddTalkMessage(receiveString.Substring( 87                         //    splitString[0].Length + splitString[1].Length+2)); 88                         AddTalkMessage(string.Format("[{0}]说:{1}", 89                             splitString[1],receiveString.Substring( 90                             splitString[0].Length + splitString[1].Length + 2))); 91                         break; 92                     default: 93                         AddTalkMessage("什么意思啊:" + receiveString); 94                         break; 95                 } 96             } 97             Application.Exit(); 98         } 99         /// <summary>向服务器端发送信息</summary>100         private void SendMessage(string message)101         {102             try103             {104                 //将字符串写入网络流,此方法会自动附加字符串长度前缀105                 bw.Write(message);106                 bw.Flush();107             }108             catch109             {110                 AddTalkMessage("发送失败!");111             }112         }113         /// <summary>【发送】按钮的Click事件</summary>114         private void buttonSend_Click(object sender, EventArgs e)115         {116             if (listBoxOnlineStatus.SelectedIndex != -1)117             {118                 //SendMessage("Talk," + listBoxOnlineStatus.SelectedItem + "," + textBoxSend.Text+"\r\n");119                 SendMessage("Talk," + listBoxOnlineStatus.SelectedItem + "," + textBoxSend.Text);120                 textBoxSend.Clear();121             }122             else123             {124                 MessageBox.Show("请先在[当前在线]中选择一个对话者");125             }126         }127         /// <summary>关闭窗口时触发的事件</summary>128         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)129         {130             //未与服务器连接前client为null131             if (client != null)132             {133                 SendMessage("Logout," + textBoxUserName.Text);134                 isExit = true;135                 br.Close();136                 bw.Close();137                 client.Close();138             }139         }140         /// <summary>在发送信息文本框中按下【Enter】键触发的事件</summary>141         private void textBoxSend_KeyPress(object sender, KeyPressEventArgs e)142         {143             if (e.KeyChar == (char)Keys.Return)144             {145                 //触发buttonSend的Click事件146                 buttonSend.PerformClick();147             }148         }149         private delegate void MessageDelegate(string message);150         /// <summary> 在richTextBoxTalkInfo中追加聊天信息</summary>151         private void AddTalkMessage(string message)152         {153             if (richTextBoxTalkInfo.InvokeRequired)154             {155                 MessageDelegate d = new MessageDelegate(AddTalkMessage);156                 richTextBoxTalkInfo.Invoke(d, new object[] { message });//?????????????????????????????????????????????157             }158             else159             {160                 richTextBoxTalkInfo.AppendText(message + Environment.NewLine);161                 richTextBoxTalkInfo.ScrollToCaret();162             }163         }164         private delegate void AddOnlineDelegate(string message);165         /// <summary> 在listBoxOnlineStatus中添加在线的其它客户端信息</summary>166         private void AddOnline(string userName)167         {168             if (listBoxOnlineStatus.InvokeRequired)169             {170                 AddOnlineDelegate d = new AddOnlineDelegate(AddOnline);171                 listBoxOnlineStatus.Invoke(d, new object[] { userName });172             }173             else174             {175                 listBoxOnlineStatus.Items.Add(userName);176                 listBoxOnlineStatus.SelectedIndex = listBoxOnlineStatus.Items.Count - 1;177                 listBoxOnlineStatus.ClearSelected();178             }179         }180         private delegate void RemoveUserNameDelegate(string userName);181         /// <summary> 在listBoxOnlineStatus中移除不在线的其它客户端信息</summary>182         private void RemoveUserName(string userName)183         {184             if (listBoxOnlineStatus.InvokeRequired)185             {186                 RemoveUserNameDelegate d = RemoveUserName;187                 listBoxOnlineStatus.Invoke(d, userName);188             }189             else190             {191                 listBoxOnlineStatus.Items.Remove(userName);192                 listBoxOnlineStatus.SelectedIndex = listBoxOnlineStatus.Items.Count - 1;193                 listBoxOnlineStatus.ClearSelected();194             }195         }196     }197 }

 

Tcp客户端的代码