首页 > 代码库 > 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客户端的代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。