您的位置:首页 > 编程语言 > C#

C# socket 服务端与客户端通信演示代码

2013-07-04 23:53 721 查看
C# socket 服务端与客户端通信演示代码

主要实现服务端与客户端消息和文件的相互发送,服务端可以控制客户端:重启、关机、注销,截屏(截客户端的屏)。服务端也可向客户端发送闪屏。

转自:http://my.csdn.net/luohuayouy/code/detail/33533

C# 服务端:

view sourceprint?

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

}

}

//该代码片段来自于: http://www.sharejs.com/codes/csharp/6777

客户端:

view sourceprint?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("我在这里!!!");

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: