C# Socket 编程 Sample

Posted sunshineyph

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Socket 编程 Sample相关的知识,希望对你有一定的参考价值。

使用Socket通信的服务器端编程,熟悉了服务器端和客户端的通信流程,实现了收发信息、文件传送以及震动功能

服务器端先创建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 Dictionary<string, Socket> socketClientList = new Dictionary<string, 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             List<byte> list = new List<byte>();
 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                     List<byte> list = new List<byte>();
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的主要内容,如果未能解决你的问题,请参考以下文章

C# socket网络编程 基于TCP协议

C# Socket 编程 Sample

C# Socket编程基本的术语和概念

C# winForm Socket 多线程 编程 关闭问题

C#版 Winform界面 Socket编程 Client客户端

C#版 Winform界面 Socket编程 Server服务器端