码迷,mamicode.com
首页 > 其他好文 > 详细

Tcp客户端的代码

时间:2014-10-22 06:14:34      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   使用   for   sp   

  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             try
103             {
104                 //将字符串写入网络流,此方法会自动附加字符串长度前缀
105                 bw.Write(message);
106                 bw.Flush();
107             }
108             catch
109             {
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             else
123             {
124                 MessageBox.Show("请先在[当前在线]中选择一个对话者");
125             }
126         }
127         /// <summary>关闭窗口时触发的事件</summary>
128         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
129         {
130             //未与服务器连接前client为null
131             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             else
159             {
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             else
174             {
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             else
190             {
191                 listBoxOnlineStatus.Items.Remove(userName);
192                 listBoxOnlineStatus.SelectedIndex = listBoxOnlineStatus.Items.Count - 1;
193                 listBoxOnlineStatus.ClearSelected();
194             }
195         }
196     }
197 }

 

Tcp客户端的代码

标签:style   blog   color   io   os   ar   使用   for   sp   

原文地址:http://www.cnblogs.com/goodlqy/p/4042070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!