找传奇、传世资源到传世资源站!

简单的通讯小工具(可跨网段)socket

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

可以内外网通讯,公网放置服务器端,两个内网放置客户端就可以使两个内网聊天,可发送文件,发送震动
from clipboard
from clipboard
简单的通讯小工具(可跨网段)socket C#网络编程-第3张
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); } } }}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复