Home 类库下载 C# class library C# socket server and client communication demonstration code

C# socket server and client communication demonstration code

Nov 10, 2016 am 09:24 AM

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

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

    }

    

}

Copy after login

客户端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

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

            }

        }

    }

         

}

Copy after login


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)