实例介绍
【实例简介】
可以内外网通讯,公网放置服务器端,两个内网放置客户端就可以使两个内网聊天,可发送文件,发送震动
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace Client { public partial class Client : Form { //客户端通信套接字 private Socket clientSocket; //新线程 private Thread thread; //当前登录的用户 private string userName = ""; private string friend; private string filePath; public Client() { InitializeComponent(); //防止新线程调用主线程卡死 CheckForIllegalCrossThreadCalls = false; } //通过IP地址与端口号与服务端建立链接 private void btnToServer_Click(object sender, EventArgs e) { //连接服务器前先选择用户 if (cmbUser.SelectedItem == null) { MessageBox.Show("请选择登录用户"); return; } userName = cmbUser.SelectedItem.ToString(); Text = "当前用户:" userName; //登录后禁止切换用户 cmbUser.Enabled = false; //加载好友列表 foreach (object item in cmbUser.Items) { if (item != cmbUser.SelectedItem) { lbFriends.Items.Add(item); } } //新建通信套接字 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //这里的ip地址,端口号都是服务端绑定的相关数据。 IPAddress ip = IPAddress.Parse(txtIP.Text); var endpoint = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); try { clientSocket.Connect(endpoint); //链接有端口号与IP地址确定服务端. //登录时给服务器发送登录消息 string str = userName "|" " "; byte[] buffer = Encoding.UTF8.GetBytes(str); var list = new List<byte>(); list.Add(0); list.AddRange(buffer); byte[] newbuffer = list.ToArray(); clientSocket.Send(newbuffer); } catch { MessageBox.Show("与服务器连接失败"); lbFriends.Items.Clear(); } //客户端在接受服务端发送过来的数据是通过Socket 中的Receive方法, //该方法会阻断线程,所以我们自己为该方法创建了一个线程 thread = new Thread(ReceMsg); thread.IsBackground = true; //设置后台线程 thread.Start(); } public void ReceMsg() { while (true) { try { var buffer = new byte[1024*1024*5]; int dateLength = clientSocket.Receive(buffer); //接收服务端发送过来的数据 //一般消息 if (buffer[0] == (byte) MsgTypeEnum.String) { //不解析第一位标识符 HandleStr(buffer, dateLength); } //抖屏消息 else if (buffer[0] == (byte) MsgTypeEnum.Shake) { HandleShake(buffer, dateLength); } //文件消息 else if (buffer[0] == (byte) MsgTypeEnum.File) { HandleFile(buffer, dateLength); } else { MessageBox.Show("接收文件解析失败"); } } catch { } } } private void btnSend_Click(object sender, EventArgs e) { if (!IsSelectFriend()) { return; } friend = lbFriends.SelectedItem.ToString(); try { //界面显示消息 string newstr = "我" ":" friend "\r\n" txtMsg.Text.Trim() " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(newstr); SendStr(txtMsg.Text.Trim()); } catch { MessageBox.Show("与服务器连接失败"); } } //展示消息 private void ShowSmsg(string newStr) { txtChat.AppendText(newStr); } private void btnCloseSer_Click(object sender, EventArgs e) { clientSocket.Close(); } private void btnShake_Click(object sender, EventArgs e) { if (!IsSelectFriend()) { return; } friend = lbFriends.SelectedItem.ToString(); try { //界面显示消息 string newstr = "我" ":" friend "\r\n" "\"发送了一个抖屏\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(newstr); SendShake(); } catch { MessageBox.Show("与服务器连接失败"); } } private void btnSelFile_Click(object sender, EventArgs e) { using (OpenFileDialog ofd = new OpenFileDialog()) { ofd.Multiselect = false; ofd.Title = "选择要发送的文件"; if (ofd.ShowDialog() == DialogResult.OK) { filePath = ofd.FileName; txtMsg.Text = filePath; } } } private void btnSendFile_Click(object sender, EventArgs e) { if (!IsSelectFriend()||filePath=="") { MessageBox.Show("选择好友与文件"); return; } friend = lbFriends.SelectedItem.ToString(); try { //界面显示消息 string newstr = "我" ":" friend "\r\n" "\"发送了一个文件\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(newstr); SendFile(); filePath = ""; } catch { MessageBox.Show("与服务器连接失败"); } } public void HandleStr(byte[] buffer, int dateLength) { //不解析第一位标识符 string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1); string[] msgTxt = ReceiveMsg.Split('|'); string newstr = " " msgTxt[0] ":我" "\r\n" " " msgTxt[2] " ____[" DateTime.Now "]" "\r\n" "\r\n"; //把接收到的字节数组转成字符串显示在文本框中。 ShowSmsg(newstr); } public void HandleShake(byte[] buffer, int dateLength) { //不解析第一位标识符 string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1); string[] msgTxt = ReceiveMsg.Split('|'); string newstr = " " msgTxt[0] ":我" "\r\n" " " "\"发送了一个抖屏\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; //把接收到消息显示在文本框中。 ShowSmsg(newstr); //震动 ShakeBody(); } public void HandleFile(byte[] buffer, int dateLength) { //不解析第一位标识符 string ReceiveMsg = Encoding.UTF8.GetString(buffer, 1, dateLength - 1); string[] msgTxt = ReceiveMsg.Split('|'); //获得收到的标识字节个数 int count = msgTxt[0].Length msgTxt[0].Length msgTxt[0].Length 3; string newstr = " " msgTxt[0] ":我" "\r\n" " " "\"发送了一个文件\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(newstr); if (MessageBox.Show("好友" msgTxt[0] "发来一个文件是否接收", "收到文件", MessageBoxButtons.YesNo) == DialogResult.Yes) { var sfd = new SaveFileDialog(); sfd.Title = "保存文件"; string fileType = "默认文件格式|*" msgTxt[2]; sfd.Filter = fileType; sfd.ShowDialog(this); using (var fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write)) { fs.Write(buffer, 1, dateLength - count); } MessageBox.Show("保存成功"); //把接收到的消息显示在文本框中。 string resultstr1 = " " msgTxt[0] ":我" "\r\n" " " "\"文件接收成功\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(resultstr1); } else { //把接收到的消息显示在文本框中。 string resultstr = " " msgTxt[0] ":我" "\r\n" " " "\"文件接收取消\"" " ____[" DateTime.Now "]" "\r\n" "\r\n"; ShowSmsg(resultstr); } } private bool IsSelectFriend() { if (lbFriends.SelectedItems.Count != 1) { MessageBox.Show("请选择好友"); return false; } else { return true ; } } private void SendStr(string MsgStr) { //发往服务器的消息 格式为 (发送者|接收者|信息) MyMessage msg = new MyMessage(MsgStr); //消息转字节 byte[] buffer = msg.ToByteData(); //添加标识符 发送者|接收者| byte[] sendbuffer= msg.MakeNewArrWithFlag(buffer,userName,friend); clientSocket.Send(sendbuffer); txtMsg.Text = ""; } private void SendShake() { //发往服务器的消息 格式为 (发送者|接收者|信息) MyMessage msg = new MyMessage(MsgTypeEnum.Shake); //消息转字节 byte[] buffer = msg.ToByteData(); //添加标识符 发送者|接收者| byte[] sendbuffer = msg.MakeNewArrWithFlag(buffer, userName, friend); clientSocket.Send(sendbuffer); txtMsg.Text = ""; } private void SendFile() { //发往服务器的消息 格式为 (发送者|接收者|信息) MyMessage msg = new MyMessage(filePath,MsgTypeEnum.File); //消息转字节 byte[] buffer = msg.ToByteData(); //添加标识符 发送者|接收者| byte[] sendbuffer = msg.MakeNewArrWithFlag(buffer, userName, friend); clientSocket.Send(sendbuffer); txtMsg.Text = ""; } Random randObj = new Random(); private void ShakeBody() { //1.获取窗体当前坐标 Point oldPoint = this.Location; //2.循环改变 窗体 坐标 for (int i = 0; i < 15; i ) { //3.设置新的随机坐标 this.Location = new Point(oldPoint.X randObj.Next(30), oldPoint.Y randObj.Next(30)); System.Threading.Thread.Sleep(50); //4.还原坐标 this.Location = oldPoint; System.Threading.Thread.Sleep(50); } } } }
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)