C# Socket 编程 Sample
2021-02-02 00:29
标签:cbo code back box tle namespace 阻塞 stream round 使用Socket通信的服务器端编程,熟悉了服务器端和客户端的通信流程,实现了收发信息、文件传送以及震动功能 客户端代码如下: C# Socket 编程 Sample 标签:cbo code back box tle namespace 阻塞 stream round 原文地址:https://www.cnblogs.com/SunShineYPH/p/11568678.html
服务器端先创建Socket,然后将其和本地ip地址以及端口号连接,也就是使用Bind方法,然后使用Listen方法监听。
用Accept方法接受客户端的连接申请,并且等待客户端连接(在winform中,由于Accept方法是阻塞方法,必须创建一个线程来执行,防止主窗体卡死)
客户端连接成功Accept方法会返回一个用于发送和接收消息的Socket,之后就要用这个socket进行通信
在通信过程中要像实现不同功能,比如传送文件,就要在发送的字节流中使用一定的位置来存储信息,也就是使用自己的协议,在这个案例中,取第一个字节标识信息,0代表发送信息,1代表传递文件,2代表震动窗体
服务端代码如下 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using System.Net.Sockets;
11 using System.Net;
12 using System.Threading;
13 using System.IO;
14
15 namespace ServerReview
16 {
17 public partial class Form1 : Form
18 {
19 public Form1()
20 {
21 InitializeComponent();
22 }
23 private Socket socketSend;
24 private Socket socketWatch;
25 private Dictionarystring, Socket> socketClientList = new Dictionarystring, Socket>();
26 private void btnStart_Click(object sender, EventArgs e)
27 {
28 socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
29 IPAddress ip = IPAddress.Any;
30 IPEndPoint iep = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
31 //将套接字和本机地址绑定
32 socketWatch.Bind(iep);
33 ShowMsg("监听成功");
34 //用Listen监听
35 socketWatch.Listen(10);
36 //创建新线程不停接受客户端请求
37 Thread thread = new Thread(ServerAccept);
38 thread.IsBackground = true;
39 thread.Start();
40 }
41 private void ServerAccept()
42 {
43 while (true)
44 {
45 socketSend = socketWatch.Accept();
46 socketClientList.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
47 cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
48 ShowMsg(socketSend.RemoteEndPoint.ToString() + "连接成功");
49 //开启新线程不停接收消息
50 Thread thread = new Thread(ServerReceive);
51 thread.IsBackground = true;
52 thread.Start();
53 }
54 }
55 private void ServerReceive()
56 {
57 while (true)
58 {
59 try
60 {
61 byte[] buffer = new byte[1024 * 1024 * 2];
62 int byteNum = socketSend.Receive(buffer);
63 if (byteNum == 0)
64 {
65 break;
66 }
67 string str = Encoding.UTF8.GetString(buffer, 0, byteNum);
68 ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
69 }
70 catch { }
71 }
72 }
73 private void ShowMsg(string str)
74 {
75 txtLog.AppendText(str + "\r\n");
76 }
77
78 private void Form1_Load(object sender, EventArgs e)
79 {
80 Control.CheckForIllegalCrossThreadCalls = false;
81 }
82
83 private void btnSend_Click(object sender, EventArgs e)
84 {
85 string str = txtMsg.Text;
86 Listbyte> list = new Listbyte>();
87 list.Add(0);
88 byte[] buffer = Encoding.UTF8.GetBytes(str);
89 list.AddRange(buffer);
90 byte[] newBuffer = list.ToArray();
91 string ip = cboUsers.SelectedItem.ToString();
92 socketClientList[ip].Send(newBuffer);
93 }
94
95 private void btnSelectFile_Click(object sender, EventArgs e)
96 {
97 OpenFileDialog ofd = new OpenFileDialog();
98 ofd.InitialDirectory = @"D:\";
99 ofd.Title = "请选择要发送的文件";
100 ofd.Filter = "所有文件|*.*";
101 ofd.ShowDialog();
102 txtFilePath.Text = ofd.FileName;
103 }
104
105 private void btnSendFile_Click(object sender, EventArgs e)
106 {
107 string path = txtFilePath.Text;
108 using(FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read))
109 {
110 try
111 {
112 byte[] buffer = new byte[1024 * 1024 * 5];
113 int l = fsRead.Read(buffer, 0, buffer.Length);
114 Listbyte> list = new Listbyte>();
115 list.Add(1);
116 list.AddRange(buffer);
117 byte[] newBuffer = list.ToArray();
118 socketClientList[cboUsers.SelectedItem.ToString()].Send(newBuffer,0,l+1,SocketFlags.None);
119 }
120 catch { }
121 }
122 }
123
124 private void btnShake_Click(object sender, EventArgs e)
125 {
126 byte[] buffer = new byte[1];
127 buffer[0] = 2;
128 socketClientList[cboUsers.SelectedItem.ToString()].Send(buffer);
129 }
130 }
131 }
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.IO;
7 using System.Linq;
8 using System.Net;
9 using System.Net.Sockets;
10 using System.Text;
11 using System.Threading;
12 using System.Threading.Tasks;
13 using System.Windows.Forms;
14
15 namespace ClientRevier
16 {
17 public partial class Form1 : Form
18 {
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void Form1_Load(object sender, EventArgs e)
25 {
26 Control.CheckForIllegalCrossThreadCalls = false;
27 }
28 private Socket socketClient;
29 private void btnStart_Click(object sender, EventArgs e)
30 {
31 socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32 IPAddress ip = IPAddress.Parse(txtServer.Text);
33 IPEndPoint iep = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
34 socketClient.Connect(iep);
35 ShowMsg("连接成功");
36 //因为要不停接受消息,所以用while循环,并且为了接受消息的同时能做其他事,把这个放到线程中执行
37 Thread thread = new Thread(ClientRecieve);
38 thread.IsBackground = true;
39 thread.Start();
40 }
41 private void ClientRecieve()
42 {
43 while (true)
44 {
45 byte[] buffer = new byte[1024 * 1024 * 2];
46 int byteNum = socketClient.Receive(buffer);
47 if (byteNum == 0)
48 {
49 break;
50 }
51 switch (buffer[0])
52 {
53 case 0:
54 string str = Encoding.UTF8.GetString(buffer, 1, byteNum-1);
55 ShowMsg(socketClient.RemoteEndPoint + ":" + str);
56 break;
57 case 1:
58 SaveFileDialog sfd = new SaveFileDialog();
59 sfd.InitialDirectory = @"D\";
60 sfd.Title = "请选择需要保存的路径";
61 sfd.Filter = "文本文件|*.txt|图片文件|*.jpg|所有文件|*.*";
62 sfd.ShowDialog(this);
63 using(FileStream fsWrite = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write))
64 {
65 fsWrite.Write(buffer, 1, byteNum - 1);
66 MessageBox.Show("保存成功");
67 }
68 break;
69 case 2:
70 for(int i = 0; i 1000; i++)
71 {
72 this.Location = new Point(200, 200);
73 this.Location = new Point(230, 230);
74 }
75 break;
76 default:break;
77 }
78
79 }
80 }
81 private void ShowMsg(string str)
82 {
83 txtLog.AppendText(str + "\r\n");
84 }
85
86 private void btnSend_Click(object sender, EventArgs e)
87 {
88 string str = txtMsg.Text;
89 byte[] buffer = Encoding.UTF8.GetBytes(str);
90 socketClient.Send(buffer);
91
92 }
93 }
94 }
文章标题:C# Socket 编程 Sample
文章链接:http://soscw.com/index.php/essay/49730.html