实例介绍
实验内容:基于服务器的客户端相互直接通信
具体要求包括:
1,Server支持多客户访问;
2,C与S之间使用TCP连接;
3,C与C之间直接通信(不是通过S传递)。
4,C与C之间直接通信既可以使用TCP,也可以使用UDP。
5,可以使用Socket,也可以使用TcpClient/UdpClient等;
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SyncChatClient { public partial class Client : Form { private bool isExit = false; private TcpClient client; private BinaryReader br; private BinaryWriter bw; private List<User> userList = new List<User>(); private TcpListener myListener; IPAddress localAddress; private static int myport; public Client() { InitializeComponent(); Random r = new Random((int)DateTime.Now.Ticks); textBoxUserName.Text = "User" r.Next(100, 999); listBoxOnline.HorizontalScrollbar = true; //---------------------c-c---------------------------------- IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName()); localAddress = addrIP[0]; while (true) { myport = r.Next(2049, 8888); try { myListener = new TcpListener(localAddress, myport); break; } catch { //如果端口不可用 } } myListener.Start(); Thread myThread = new Thread(ListenClientConnect); myThread.IsBackground=true; myThread.Start(); } //---------------------c-c---------------------------------- private void ListenClientConnect() { TcpClient newClient = null; while (true) { try { newClient = myListener.AcceptTcpClient(); } catch { break; } User user = new User(newClient); Thread threadReceive = new Thread(ServerReceive); threadReceive.Start(user); threadReceive.IsBackground = true; } } //---------------------c-c---------------------------------- private void ServerReceive(Object userState) //客户端充当server的接收方法 { User user = (User)userState ;////////////////////////////////////////// TcpClient client = user.client; while (isExit == false) { string receiveString = null; try { receiveString = user.br.ReadString(); AddTalkMessage(receiveString); } catch { if (isExit == false) { user.Close(); AddTalkMessage("接收信息失败"); } break; } } user.Close(); } private void buttonConnect_Click(object sender, EventArgs e) { buttonConnect.Enabled = false; try { client = new TcpClient(Dns.GetHostName(), 51888); AddTalkMessage("连接成功"); NetworkStream networkStream = client.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); SendMessage("Login," textBoxUserName.Text "," localAddress "," myport); Thread threadReceive = new Thread(new ThreadStart(ReceiveData)); threadReceive.IsBackground = true; threadReceive.Start(); } catch { AddTalkMessage("连接失败"); buttonConnect.Enabled = true; return; } AddOnline("Server"); //添加在线者——Server } private void ReceiveData() //客户端是client的接收方法 { string receiveString = null; while (isExit == false) { try { receiveString = br.ReadString(); } catch { if (isExit == false) { MessageBox.Show("与服务器失去联系。"); } break; } string[] splitString = receiveString.Split(','); string command = splitString[0].ToLower(); switch (command) { case "login": AddOnline(receiveString); break; case "logout": RemoveUserName(splitString[1]); break; case "talk": AddTalkMessage(splitString[1] "对我说:" receiveString.Substring(splitString[0].Length splitString[1].Length 2)); break; default: AddTalkMessage("什么意思啊:" receiveString); break; } } Application.Exit(); } private void SendMessage(string message) { try { bw.Write(message); bw.Flush(); } catch { AddTalkMessage("发送失败!"); } } private delegate void MessageDelegate(string message); private void AddTalkMessage(string message) { if (richTextBoxTalkInfo.InvokeRequired) { MessageDelegate d = new MessageDelegate(AddTalkMessage); richTextBoxTalkInfo.Invoke(d, new object[] { message });//////////// } else { richTextBoxTalkInfo.AppendText(message Environment.NewLine); richTextBoxTalkInfo.ScrollToCaret(); } } private delegate void AddOnlineDelegate(string message); private void AddOnline(string message) //把新用户添加道listBox并储存在userList中(保存ip端口) { if (message == "Server") { if (listBoxOnline.InvokeRequired) { AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline); listBoxOnline.Invoke(d, message); } else { ToAddOnline(message); } User u = new User("Server", Dns.GetHostName(), 51888); userList.Add(u); return; } string[] splitString = message.Split(','); int port1; if (listBoxOnline.InvokeRequired) { AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline); listBoxOnline.Invoke(d, splitString[1]); } else { ToAddOnline(splitString[1]); } port1 = int.Parse(splitString[3]); User user = new User(splitString[1], splitString[2], port1); userList.Add(user); } private void ToAddOnline(string message) { listBoxOnline.Items.Add(message); listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1; listBoxOnline.ClearSelected(); } private delegate void RemoveUserNameDelegate(string userName); private void RemoveUserName(string userName) { if (listBoxOnline.InvokeRequired) { RemoveUserNameDelegate d = RemoveUserName; listBoxOnline.Invoke(d, userName); } else { listBoxOnline.Items.Remove(userName); listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1; listBoxOnline.ClearSelected(); } } private void buttonSend_Click(object sender, EventArgs e) { if (listBoxOnline.SelectedIndex != -1) { SendMessage("Talk," listBoxOnline.SelectedItem "," textBoxSend.Text); AddTalkMessage("我对" listBoxOnline.SelectedItem "说:" textBoxSend.Text); textBoxSend.Clear(); } else { MessageBox.Show("请先在[当前在线]中选择一个对话者"); } } private void Client_FormClosing(object sender, FormClosingEventArgs e) { if (client != null) { SendMessage("Logout," textBoxUserName.Text); isExit = true; br.Close(); bw.Close(); client.Close(); } } private void Client_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (Char)Keys.Return) { buttonSend.PerformClick(); } } private void buttonTcpSend_Click(object sender, EventArgs e) { User myUser; if (listBoxOnline.SelectedIndex != -1) { for(int i = 0; i < listBoxOnline.SelectedItems.Count; i ) { foreach(User u in userList) { if (u.userName.Equals("Server")) { // } else if (u.userName.Equals(listBoxOnline.SelectedItems[i].ToString())) { try { IPAddress ip = IPAddress.Parse(u.ip); ///IPEndPoint iep = new IPEndPoint(ip, u.port); //TcpClient myClient = new TcpClient(); //myClient.Connect(iep); //connect一直出错,ip没问题,奇怪 TcpClient myClient = new TcpClient(Dns.GetHostName(), u.port); myUser = new User(myClient); myUser.bw.Write(textBoxUserName.Text "向我发来TCP消息:" textBoxSend.Text); } catch { AddTalkMessage("发送失败"); } } } AddTalkMessage("向" listBoxOnline.SelectedItem "发送TCP消息:" textBoxSend.Text); } textBoxSend.Clear(); } else { MessageBox.Show("请先在[当前在线]中选择一个对话者"); } } } }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论