- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Windows.Forms;
- using System.IO;
- using System.Threading;
- using System.Runtime.InteropServices;
- public delegate void DGShowMsg(string strMsg);
- namespace Server
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程修改控件检查
- // txtIP.Text = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString();
- txtIP.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
- }
- [DllImport("kernel32")] ///获取系统时间
- public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);
- ///定义系统时间结构信息
- [StructLayout(LayoutKind.Sequential)]
- public struct SYSTEMTIME_INFO
- {
- public ushort wYear;
- public ushort wMonth;
- public ushort wDayOfWeek;
- public ushort wDay;
- public ushort wHour;
- public ushort wMinute;
- public ushort wSecond;
- public ushort wMilliseconds;
- }
- Socket sokWatch = null;//负责监听 客户端段 连接请求的 套接字(女生宿舍的大妈)
- Thread threadWatch = null;//负责 调用套接字, 执行 监听请求的线程
- //开启监听 按钮
- private void btnStartListen_Click(object sender, EventArgs e)
- {
- //实例化 套接字 (ip4寻址协议,流式传输,TCP协议)
- sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //创建 ip对象
- IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
- // IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
- //string ip= this.geta
- //创建网络节点对象 包含 ip和port
- // IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim())); comboBox1.Text.Trim();
- IPEndPoint endpoint = new IPEndPoint(address, int.Parse(comboBox1.Text.Trim()));
- //将 监听套接字 绑定到 对应的IP和端口
- sokWatch.Bind(endpoint);
- //设置 监听队列 长度为10(同时能够处理 10个连接请求)
- sokWatch.Listen(20);
- threadWatch = new Thread(StartWatch);
- threadWatch.IsBackground = true;
- threadWatch.Start();
- //txtShow.AppendText("启动服务器成功......rn");
- label4.Text = "启动服务器成功......";
- }
- //Dictionary<string, Socket> dictSocket = new Dictionary<string, Socket>();
- Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>();
- bool isWatch = true;
- #region 1.被线程调用 监听连接端口
- /// <summary>
- /// 被线程调用 监听连接端口
- /// </summary>
- void StartWatch()
- {
- string recode;
- while (isWatch)
- {
- //threadWatch.SetApartmentState(ApartmentState.STA);
- //监听 客户端 连接请求,但是,Accept会阻断当前线程
- Socket sokMsg = sokWatch.Accept();//监听到请求,立即创建负责与该客户端套接字通信的套接字
- ConnectionClient connection = new ConnectionClient(sokMsg, ShowMsg, RemoveClientConnection);
- //将负责与当前连接请求客户端 通信的套接字所在的连接通信类 对象 装入集合
- dictConn.Add(sokMsg.RemoteEndPoint.ToString(), connection);
- //将 通信套接字 加入 集合,并以通信套接字的远程IpPort作为键
- //dictSocket.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg);
- //将 通信套接字的 客户端IP端口保存在下拉框里
- cboClient.Items.Add(sokMsg.RemoteEndPoint.ToString());
- MessageBox.Show("有一个客户端新添加!");
- recode = sokMsg.RemoteEndPoint.ToString();
- //调用GetSystemTime函数获取系统时间信息
- SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO();
- GetSystemTime(ref StInfo);
- recode +="子计算机在"+StInfo.wYear.ToString() + "年" + StInfo.wMonth.ToString() + "月" + StInfo.wDay.ToString() + "日";
- recode += (StInfo.wHour + 8).ToString() + "点" + StInfo.wMinute.ToString() + "分" + StInfo.wSecond.ToString() + "秒"+"连接服务";
- //记录每台子计算机连接服务主机的日志
- StreamWriter m_sw = new StreamWriter(System.Windows.Forms.Application.StartupPath + @"\file.DAT", true);
- m_sw.WriteLine(recode);
- m_sw.WriteLine("------------------------------------------------------------------");
- m_sw.Close();
- //MessageBox.Show(recode);
- dictConn[sokMsg.RemoteEndPoint.ToString()].SendTrue();
- //启动一个新线程,负责监听该客户端发来的数据
- //Thread threadConnection = new Thread(ReciveMsg);
- //threadConnection.IsBackground = true;
- //threadConnection.Start(sokMsg);
- }
- }
- #endregion
- //bool isRec = true;
- //与客户端通信的套接字 是否 监听消息
- #region 发送消息 到指定的客户端 -btnSend_Click
- //发送消息 到指定的客户端
- private void btnSend_Click(object sender, EventArgs e)
- {
- //byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim());
- //从下拉框中 获得 要哪个客户端发送数据
- string time;
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- //从字典集合中根据键获得 负责与该客户端通信的套接字,并调用send方法发送数据过去
- dictConn[connectionSokKey].Send(txtInput.Text.Trim());
- SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO();
- GetSystemTime(ref StInfo);
- time = StInfo.wYear.ToString() + "/" + StInfo.wMonth.ToString() + "/" + StInfo.wDay.ToString() +" ";
- time += (StInfo.wHour + 8).ToString() + ":" + StInfo.wMinute.ToString();
- richTextBox1.AppendText(time + "rn");
- richTextBox1.AppendText("对" + cboClient.Text +"说:"+ txtInput.Text.Trim() + "rn");
- txtInput.Text = "";
- //sokMsg.Send(arrMsg);
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- #endregion
- //发送闪屏
- private void btnShack_Click(object sender, EventArgs e)
- {
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- dictConn[connectionSokKey].SendShake();
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- //群闪
- private void btnShackAll_Click(object sender, EventArgs e)
- {
- foreach (ConnectionClient conn in dictConn.Values)
- {
- conn.SendShake();
- }
- }
- #region 2 移除与指定客户端的连接 +void RemoveClientConnection(string key)
- /// <summary>
- /// 移除与指定客户端的连接
- /// </summary>
- /// <param name="key">指定客户端的IP和端口</param>
- public void RemoveClientConnection(string key)
- {
- if (dictConn.ContainsKey(key))
- {
- dictConn.Remove(key);
- MessageBox.Show(key +"断开连接");
- cboClient.Items.Remove(key);
- }
- }
- #endregion
- //选择要发送的文件
- private void btnChooseFile_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- txtFilePath.Text = ofd.FileName;
- }
- }
- //发送文件
- private void btnSendFile_Click(object sender, EventArgs e)
- {
- //拿到下拉框中选中的客户端IPPORT
- string key = cboClient.Text;
- if (!string.IsNullOrEmpty(key))
- {
- dictConn[key].SendFile(txtFilePath.Text.Trim());
- // txtFilePath.Text = "";
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~");
- }
- }
- #region 向文本框显示消息 -void ShowMsg(string msgStr)
- /// <summary>
- /// 向文本框显示消息
- /// </summary>
- /// <param name="msgStr">消息</param>
- public void ShowMsg(string msgStr)
- {
- //MessageBox.Show("1040414");
- txtShow1.AppendText(msgStr + "rn");
- }
- #endregion
- //群消息
- private void btnSendMsgAll_Click(object sender, EventArgs e)
- {
- string time;
- foreach (ConnectionClient conn in dictConn.Values)
- {
- conn.Send(txtInput.Text.Trim());
- }
- SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO();
- GetSystemTime(ref StInfo);
- time = StInfo.wYear.ToString() + "/" + StInfo.wMonth.ToString() + "/" + StInfo.wDay.ToString() + " ";
- time += (StInfo.wHour + 8).ToString() + ":" + StInfo.wMinute.ToString();
- richTextBox1.AppendText(time + "rn");
- richTextBox1.AppendText("群发消息:"+ txtInput.Text.Trim() + "rn");
- txtInput.Text = "";
- }
- //群发文件
- private void button1_Click(object sender, EventArgs e)
- {
- foreach (ConnectionClient conn in dictConn.Values)
- {
- // dictConn.SendFile(txtFilePath.Text.Trim());
- conn.SendFile(txtFilePath.Text.Trim());
- }
- }
- private void button2_Click(object sender, EventArgs e)
- {
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- dictConn[connectionSokKey].guanji();
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- private void button3_Click(object sender, EventArgs e)
- {
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- dictConn[connectionSokKey].chongqi();
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- private void button4_Click(object sender, EventArgs e)
- {
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- dictConn[connectionSokKey].zhuxiao();
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- private void button5_Click(object sender, EventArgs e)
- {
- string connectionSokKey = cboClient.Text;
- if (!string.IsNullOrEmpty(connectionSokKey))
- {
- dictConn[connectionSokKey].jieping();
- }
- else
- {
- MessageBox.Show("请选择要发送的子计算机~~");
- }
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- ////在这里,我新建了一个与客户端的通信和线程的类(ConnectionClient)//////////////////////
- /// <summary>
- /// 与客户端的 连接通信类(包含了一个 与客户端 通信的 套接字,和线程)
- /// </summary>
- public class ConnectionClient
- {
- Socket sokMsg;
- DGShowMsg dgShowMsg;//负责 向主窗体文本框显示消息的方法委托
- DGShowMsg dgRemoveConnection;// 负责 从主窗体 中移除 当前连接
- Thread threadMsg;
- #region 构造函数
- /// <summary>
- ///
- /// </summary>
- /// <param name="sokMsg">通信套接字</param>
- /// <param name="dgShowMsg">向主窗体文本框显示消息的方法委托</param>
- public ConnectionClient(Socket sokMsg, DGShowMsg dgShowMsg, DGShowMsg dgRemoveConnection)
- {
- this.sokMsg = sokMsg;
- this.dgShowMsg = dgShowMsg;
- this.dgRemoveConnection = dgRemoveConnection;
- this.threadMsg = new Thread(RecMsg);
- this.threadMsg.IsBackground = true;
- this.threadMsg.Start();
- }
- #endregion
- bool isRec = true;
- #region 02负责监听客户端发送来的消息
- void RecMsg()
- {
- while (isRec)
- {
- try
- {
- byte[] arrMsg = new byte[1024 * 1024 * 1];
- //接收 对应 客户端发来的消息
- int length = sokMsg.Receive(arrMsg);
- // string abc = Encoding.Default.GetString(arrMsg);
- // MessageBox.Show(abc);
- //将接收到的消息数组里真实消息转成字符串
- if (arrMsg[0] == 1)
- {
- //string abc = Encoding.Default.GetString(arrMsg);
- //MessageBox.Show(abc);
- //发送来的是文件
- //MessageBox.Show("00000s");
- //SaveFileDialog sfd = new SaveFileDialog();
- SaveFileDialog sfd = new SaveFileDialog();
- sfd.Filter = "文本文件(.txt)|*.txt|所有文件(*.*)|*.*";
- // MessageBox.Show(sfd.Filter);
- //sfd.ShowDialog();
- //弹出文件保存选择框
- if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- //MessageBox.Show("111110");
- //创建文件流
- using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate))
- {
- fs.Write(arrMsg, 1, length - 1);
- MessageBox.Show("文件保存成功!");
- }
- }
- }
- /*else if(arrMsg[0] == 2)
- {
- // MemoryStream ms = new MemoryStream(arrMsg, 0, length-1);
- MemoryStream ms = new MemoryStream(arrMsg);
- Image returnImage = Image.FromStream(ms);//??????????
- PictureBox district = (PictureBox)Application.OpenForms["Form1"].Controls["pictureBox1"].Controls["pictureBox1"];
- district.Image = returnImage;
- // this.saveFileDialog1.FileName = "";//清空名称栏
- /*
- SaveFileDialog sfd = new SaveFileDialog();
- sfd.Filter = "图像文件(.jpg)|*.jpg|所有文件(*.*)|*.*";
- MessageBox.Show(sfd.Filter);
- if (DialogResult.OK == sfd.ShowDialog())
- {
- string strFileName = sfd.FileName;
- //Image img = (Image)this.pictureBox1.Image;
- returnImage.Save(strFileName);
- }
- }*/
- else//发送来的是消息
- {
- //MessageBox.Show("2222");
- string strMsg = sokMsg.RemoteEndPoint.ToString()+"说:"+"rn"+System.Text.Encoding.UTF8.GetString(arrMsg, 0, length); //// 我在这里 Request.ServerVariables.Get("Remote_Addr").ToString()+
- //通过委托 显示消息到 窗体的文本框
- dgShowMsg(strMsg);
- }
- //MessageBox.Show("11111");
- }
- catch (Exception ex)
- {
- isRec = false;
- //从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象
- dgRemoveConnection(sokMsg.RemoteEndPoint.ToString());
- }
- }
- }
- #endregion
- #region 03向客户端发送消息
- /// <summary>
- /// 向客户端发送消息
- /// </summary>
- /// <param name="strMsg"></param>
- public void Send(string strMsg)
- {
- byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
- byte[] arrMsgFinal = new byte[arrMsg.Length + 1];
- arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
- arrMsg.CopyTo(arrMsgFinal, 1);
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 04向客户端发送文件数据 +void SendFile(string strPath)
- /// <summary>
- /// 04向客户端发送文件数据
- /// </summary>
- /// <param name="strPath">文件路径</param>
- public void SendFile(string strPath)
- {
- //通过文件流 读取文件内容
- //MessageBox.Show("12540");
- using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate))
- {
- byte[] arrFile = new byte[1024 * 1024 * 2];
- //读取文件内容到字节数组,并 获得 实际文件大小
- int length = fs.Read(arrFile, 0, arrFile.Length);
- //定义一个 新数组,长度为文件实际长度 +1
- byte[] arrFileFina = new byte[length + 1];
- arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件
- //将 文件数据数组 复制到 新数组中,下标从1开始
- //arrFile.CopyTo(arrFileFina, 1);
- Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length);
- // MessageBox.Show("120");
- //发送文件数据
- sokMsg.Send(arrFileFina);//, 0, length + 1, SocketFlags.None);
- }
- }
- #endregion
- #region 05向客户端发送闪屏
- /// <summary>
- /// 向客户端发送闪屏
- /// </summary>
- /// <param name="strMsg"></param>
- public void SendShake()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 2;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 06关闭与客户端连接
- /// <summary>
- /// 关闭与客户端连接
- /// </summary>
- public void CloseConnection()
- {
- isRec = false;
- }
- #endregion
- #region 07向客户端发送连接成功提示
- /// <summary>
- /// 向客户端发送连接成功提示
- /// </summary>
- /// <param name="strMsg"></param>
- public void SendTrue()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 3;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 08向客户端发送关机命令
- /// <summary>
- /// 向客户端发送关机命令
- /// </summary>
- /// <param name="strMsg"></param>
- public void guanji()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 4;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 09向客户端发送重启命令
- /// <summary>
- /// 向客户端发送关机命令
- /// </summary>
- /// <param name="strMsg"></param>
- public void chongqi()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 5;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 10向客户端发送待机命令
- /// <summary>
- /// 向客户端发送关机命令
- /// </summary>
- /// <param name="strMsg"></param>
- public void zhuxiao()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 6;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- #region 11向客户端发送截屏命令
- /// <summary>
- /// 向客户端发送截屏命令
- /// </summary>
- /// <param name="strMsg"></param>
- public void jieping()
- {
- byte[] arrMsgFinal = new byte[1];
- arrMsgFinal[0] = 7;
- sokMsg.Send(arrMsgFinal);
- }
- #endregion
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Net.Sockets;
- using System.Net;
- using System.Threading;
- using System.Windows.Forms;
- using System.IO;
- using System.Text;
- using System.Runtime.InteropServices;
- public delegate void DGShowMsg(string strMsg);
- namespace Client
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- TextBox.CheckForIllegalCrossThreadCalls = false;
- }
- #region[成员函数]
- ///<summary>
- ///图像函数
- ///</summary>
- private Image _img;
- #endregion
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- internal struct TokPriv1Luid
- {
- public int Count;
- public long Luid;
- public int Attr;
- }
- [DllImport("kernel32.dll", ExactSpelling = true)]
- internal static extern IntPtr GetCurrentProcess();
- [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
- internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
- [DllImport("advapi32.dll", SetLastError = true)]
- internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
- [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
- internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
- ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
- [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
- internal static extern bool ExitWindowsEx(int flg, int rea);
- internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
- internal const int TOKEN_QUERY = 0x00000008;
- internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
- internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
- internal const int EWX_LOGOFF = 0x00000000; //注销
- internal const int EWX_SHUTDOWN = 0x00000001; //关机
- internal const int EWX_REBOOT = 0x00000002; //重启
- internal const int EWX_FORCE = 0x00000004;
- internal const int EWX_POWEROFF = 0x00000008; //断开电源
- internal const int EWX_FORCEIFHUNG = 0x00000010; //强制终止未响应的程序
- // internal const int WM_POWERBROADCAST
- private static void DoExitWin(int flg)
- {
- bool ok;
- TokPriv1Luid tp;
- IntPtr hproc = GetCurrentProcess();
- IntPtr htok = IntPtr.Zero;
- ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
- tp.Count = 1;
- tp.Luid = 0;
- tp.Attr = SE_PRIVILEGE_ENABLED;
- ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
- ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
- ok = ExitWindowsEx(flg, 0);
- }
- Socket sokClient = null;//负责与服务端通信的套接字
- Thread threadClient = null;//负责 监听 服务端发送来的消息的线程
- bool isRec = true; //是否循环接收服务端数据
- // Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>();
- private void btnConnect_Click(object sender, EventArgs e)
- {
- //实例化 套接字
- sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //创建 ip对象
- IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
- //MessageBox.Show("address");
- //创建网络节点对象 包含 ip和port
- IPEndPoint endpoint = new IPEndPoint(address, int.Parse(comboBox1.Text.Trim()));
- //连接 服务端监听套接字
- sokClient.Connect(endpoint);
- //创建负责接收 服务端发送来数据的 线程
- threadClient = new Thread(ReceiveMsg);
- threadClient.IsBackground = true;
- //如果在win7下要通过 某个线程 来调用 文件选择框的代码,就需要设置如下
- threadClient.SetApartmentState(ApartmentState.STA);
- threadClient.Start();
- }
- /// <summary>
- /// 接收服务端发送来的消息数据
- /// </summary>
- void ReceiveMsg()
- {
- while (isRec)
- {
- byte[] msgArr = new byte[1024 * 1024 * 1];//接收到的消息的缓冲区
- int length = 0;
- //接收服务端发送来的消息数据
- length = sokClient.Receive(msgArr);//Receive会阻断线程
- if (msgArr[0] == 0)//发送来的是文字
- {
- string strMsg = System.Text.Encoding.UTF8.GetString(msgArr, 1, length - 1);
- txtShow.AppendText(strMsg + "rn");
- }
- else if (msgArr[0] == 1)
- {
- //发送来的是文件
- //string abc = Encoding.Default.GetString(msgArr);
- //MessageBox.Show(abc);
- SaveFileDialog sfd = new SaveFileDialog();
- sfd.Filter = "文本文件(.txt)|*.txt|所有文件(*.*)|*.*";
- //弹出文件保存选择框
- if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- //创建文件流
- using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate))
- {
- fs.Write(msgArr, 1, length - 1);
- MessageBox.Show("文件保存成功!");
- }
- }
- }
- else if (msgArr[0] == 2)
- {
- ShakeWindow();
- }
- else if (msgArr[0] == 3)
- {
- MessageBox.Show("连接成功");
- }
- else if (msgArr[0] == 4)
- {
- DoExitWin(EWX_SHUTDOWN);
- }
- else if (msgArr[0] == 5)
- {
- DoExitWin(EWX_REBOOT);
- }
- else if (msgArr[0] == 6)
- {
- DoExitWin(EWX_LOGOFF);
- }
- else if (msgArr[0] == 7)
- {
- PrintScreen();
- }
- }
- }
- #region[方法]
- ///<summary>
- ///截屏
- ///</summary>
- private void PrintScreen()
- {
- string Opath = @"C:/Picture";
- if (Opath.Substring(Opath.Length - 1, 1) != @"/")
- Opath = Opath + @"/";
- string photoname = DateTime.Now.Ticks.ToString();
- string path1 = Opath + DateTime.Now.ToShortDateString();
- if (!Directory.Exists(path1))
- Directory.CreateDirectory(path1);
- try
- {
- Screen scr = Screen.PrimaryScreen;
- Rectangle rc = scr.Bounds;
- int iWidth = rc.Width;
- int iHeight = rc.Height;
- Bitmap myImage = new Bitmap(iWidth, iHeight);
- Graphics gl = Graphics.FromImage(myImage);
- gl.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(iWidth, iHeight));
- _img = myImage;
- //pictureBox1.Image = _img;
- // IntPtr dc1 = gl.GetHdc();
- //gl.ReleaseHdc(dc1);
- MessageBox.Show(path1);
- MessageBox.Show(photoname);
- _img.Save(path1 + "//" + photoname + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
- // _img.Save("D:\1.jpeg");
- SendFile(path1+"//"+photoname+".jpg");
- }
- catch (Exception ex)
- {
- MessageBox.Show("截屏失败!n" + ex.Message.ToString() + "n" + ex.StackTrace.ToString());
- }
- // MessageBox.Show("12322222");
- /////////////////////////////////////////////////////////
- ///////////////////发送图片流///////////////////////////
- /*
- MemoryStream ms = new MemoryStream();
- byte[] imagedata = null;
- _img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
- imagedata = ms.GetBuffer();
- byte[] arrFile = new byte[1024 * 1024 * 2];
- //读取文件内容到字节数组,并 获得 实际文件大小
- int length = ms.Read(arrFile, 0, arrFile.Length);
- // int length = ms.Read(arrFile, 0, arrFile.Length);
- //定义一个 新数组,长度为文件实际长度 +1
- byte[] arrFileFina = new byte[length + 1];
- arrFileFina[0] = 2;//设置 数据标识位等于1,代表 发送的是文件
- //将 图片流数据数组 复制到 新数组中,下标从1开始
- //arrFile.CopyTo(arrFileFina, 1);
- Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length);
- //发送文件数据
- sokClient.Send(arrFileFina);//, 0, length + 1, SocketFlags.None);
- //MessageBox.Show("我在这里!!!");
- // byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(_img);
- MessageBox.Show("2222");
- */
- }
- #endregion
- /*
- private void button1_Click(object sender, EventArgs e)
- {
- // this.WindowState = FormWindowState.Minimized;
- PrintScreen();
- if (_img != null)
- {
- this.pictureBox1.Image = _img;
- }
- this.WindowState = FormWindowState.Normal;
- }
- */
- /// <summary>
- /// 闪屏
- /// </summary>
- private void ShakeWindow()
- {
- Random ran = new Random();
- //保存 窗体原坐标
- System.Drawing.Point point = this.Location;
- for (int i = 0; i < 30; i++)
- {
- //随机 坐标
- this.Location = new System.Drawing.Point(point.X + ran.Next(8), point.Y + ran.Next(8));
- System.Threading.Thread.Sleep(15);//休息15毫秒
- this.Location = point;//还原 原坐标(窗体回到原坐标)
- System.Threading.Thread.Sleep(15);//休息15毫秒
- }
- }
- //发送消息
- private void btnSend_Click(object sender, EventArgs e)
- {
- byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim());
- sokClient.Send(arrMsg);
- richTextBox1.AppendText(txtInput.Text.Trim()+"rn");
- txtInput.Text = "";
- }
- private void btnChooseFile_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- txtFilePath.Text = ofd.FileName;
- }
- }
- //发送文件
- private void btnSendFile_Click(object sender, EventArgs e)
- {
- string key = txtIP.Text + ":" + comboBox1.Text.Trim();
- //MessageBox.Show(key);
- if (!string.IsNullOrEmpty(key))
- {
- SendFile(txtFilePath.Text.Trim());
- // MessageBox.Show("1230");
- // txtFilePath.Text = "";
- }
- }
- private void SendFile(string strPath)
- {
- //通过文件流 读取文件内容
- using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate))
- {
- byte[] arrFile = new byte[1024 * 1024 * 2];
- //读取文件内容到字节数组,并 获得 实际文件大小
- int length = fs.Read(arrFile, 0, arrFile.Length);
- //定义一个 新数组,长度为文件实际长度 +1
- byte[] arrFileFina = new byte[length + 1];
- arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件
- //将 文件数据数组 复制到 新数组中,下标从1开始
- //arrFile.CopyTo(arrFileFina, 1);
- Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length);
- //发送文件数据
- sokClient.Send(arrFileFina);//, 0, length + 1, SocketFlags.None);
- //MessageBox.Show("我在这里!!!");
- }
- }
- }
- }
来源: http://www.phpxs.com/code/1004383/