博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#通信之Socket通信的简单例子
阅读量:4944 次
发布时间:2019-06-11

本文共 7927 字,大约阅读时间需要 26 分钟。

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

这里构建一个简单的例子,客户端发消息,服务端接收,然后回执一条消息。大致能够了解如何使用Socket进行通信。

服务端监听,接收信息:

客户端连接,并发送信息:

使用Socket通信,程序一般会在幕后运行,然后再合适的时间提示信息。这很自然的就会涉及到多线程的问题。在这个例子中因为每个连接都要创建一 个线程,所以需要对线程进行管理。这里我使用了两个类:Connection(管理具体Socket连接)和SocketListener(管理线程和连 接)。

看看代码吧:

1、Connection:服务端用于接收消息,处理具体的连接

1 public class Connection 2     { 3         Socket _connection; 4   5         public Connection(Socket socket) 6         { 7             _connection = socket; 8         } 9  10         public void WaitForSendData()11         {12             while (true)13             {14                 byte[] bytes = new byte[1024];15                 string data = "";16  17                 //等待接收消息18                 int bytesRec = this._connection.Receive(bytes);19  20                 if (bytesRec == 0)21                 {22                     ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭...");23                     break;24                 }25  26                 data += Encoding.UTF8.GetString(bytes, 0, bytesRec);27                 ReceiveText("收到消息:" + data);28  29                 string sendStr = "服务端已经收到信息!";30                 byte[] bs = Encoding.UTF8.GetBytes(sendStr);31                 _connection.Send(bs, bs.Length, 0);32             }33         }34  35         public delegate void ReceiveTextHandler(string text);36         public event ReceiveTextHandler ReceiveTextEvent;37         private void ReceiveText(string text)38         {39             if (ReceiveTextEvent != null)40             {41                 ReceiveTextEvent(text);42             }43         }44     }
Connection

2、SocketListener:启动服务端Socket监听

1 public class SocketListener 2     { 3         public Hashtable Connection = new Hashtable(); 4   5         public void StartListen() 6         { 7             try 8             { 9                 //端口号、IP地址10                 int port = 2000;11                 string host = "127.0.0.1";12                 IPAddress ip = IPAddress.Parse(host);13                 IPEndPoint ipe = new IPEndPoint(ip, port);14  15                 //创建一个Socket类16                 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);17                 s.Bind(ipe);//绑定2000端口18                 s.Listen(0);//开始监听19  20                 ReceiveText("启动Socket监听...");21  22                 while (true)23                 {24                     Socket connectionSocket = s.Accept();//为新建连接创建新的Socket25  26                     ReceiveText("客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立...");27  28                     Connection gpsCn = new Connection(connectionSocket);29                     gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText);30  31                     Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn);32  33                     //在新线程中启动新的socket连接,每个socket等待,并保持连接34                     Thread thread = new Thread(new ThreadStart(gpsCn.WaitForSendData));35                     thread.Name = connectionSocket.RemoteEndPoint.ToString();36                     thread.Start();37                 }38             }39             catch (ArgumentNullException ex1)40             {41                 ReceiveText("ArgumentNullException:" + ex1);42             }43             catch (SocketException ex2)44             {45                 ReceiveText("SocketException:" + ex2);46             }47         }48  49         public delegate void ReceiveTextHandler(string text);50         public event ReceiveTextHandler ReceiveTextEvent;51         private void ReceiveText(string text)52         {53             if (ReceiveTextEvent != null)54             {55                 ReceiveTextEvent(text);56             }57         }58     }
启动服务端Socket监听

3、服务端主程序

1  ///  2     /// Interaction logic for MainWindow.xaml 3     ///  4     public partial class MainWindow : Window 5     { 6         SocketListener listener; 7         public MainWindow() 8         { 9             InitializeComponent();10  11             InitServer();12         }13  14         private void InitServer()15         {16             System.Timers.Timer t = new System.Timers.Timer(2000);17             //实例化Timer类,设置间隔时间为5000毫秒;18             t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen);19             //到达时间的时候执行事件; 20             t.AutoReset = true;21             t.Start();22         }23  24         private void CheckListen(object sender, System.Timers.ElapsedEventArgs e)25         {26             if (listener != null && listener.Connection != null)27             {28                 //label2.Content = listener.Connection.Count.ToString();29                 ShowText("连接数:" + listener.Connection.Count.ToString());30             }31         }32  33         private void button1_Click(object sender, RoutedEventArgs e)34         {35             Thread th = new Thread(new ThreadStart(SocketListen));36             th.Start();37         }38  39         private void SocketListen()40         {41             listener = new SocketListener();42             listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText);43             listener.StartListen();44         }45  46         public delegate void ShowTextHandler(string text);47         ShowTextHandler setText;48  49         private void ShowText(string text)50         {51             if (System.Threading.Thread.CurrentThread != txtSocketInfo.Dispatcher.Thread)52             {53                 if (setText == null)54                 {55                     setText = new ShowTextHandler(ShowText);56                 }57                 txtSocketInfo.Dispatcher.BeginInvoke(setText, DispatcherPriority.Normal, new string[] { text });58             }59             else60             {61                 txtSocketInfo.AppendText(text + "\n");62             }63         }64  65         private void button2_Click(object sender, RoutedEventArgs e)66         {67             ClientWindow client = new ClientWindow();68             client.Show();69         }70     }
服务端主程序

4、客户端:建立连接,发送消息

456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354      public partial class ClientWindow : Window    {        Socket c;        public ClientWindow()        {            InitializeComponent();            InitClient();        }         private void InitClient()        {            int port = 2000;            string host = "127.0.0.1";            IPAddress ip = IPAddress.Parse(host);            IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例            c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket             ShowText("连接到Socket服务端...");             c.Connect(ipe);//连接到服务器        }         private void button1_Click(object sender, RoutedEventArgs e)        {            try            {                ShowText("发送消息到服务端...");                string sendStr = textBox2.Text;                byte[] bs = Encoding.ASCII.GetBytes(sendStr);                c.Send(bs, bs.Length, 0);                 string recvStr = "";                byte[] recvBytes = new byte[1024];                int bytes;                bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息                recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);                 ShowText("服务器返回信息:" + recvStr);            }            catch (ArgumentNullException ex1)            {                Console.WriteLine("ArgumentNullException:{0}", ex1);            }            catch (SocketException ex2)            {                Console.WriteLine("SocketException:{0}", ex2);            }        }         private void ShowText(string text)        {            txtSockInfo.AppendText(text + "\n");        }    }
建立连接,发送消息

这是一个WPF的程序,WPF对多线程访问控件和WinForm的处理方式不太一样。

转自,原文地址《》

转载于:https://www.cnblogs.com/bolanbujing/p/4290394.html

你可能感兴趣的文章
一次react滚动列表的实践---兼容ios安卓
查看>>
Vue组件通信(传值)
查看>>
linux中的信号简介和trap命令
查看>>
你可能不熟悉的JS总结
查看>>
JavaScript浏览器对象
查看>>
Java基础知识
查看>>
36选7 java代码
查看>>
keras启用tensorboard
查看>>
【JS面试】第二章 变量类型和计算
查看>>
iOS中使用RSA对数据进行加密解密
查看>>
简明Linux命令行笔记:mkfs
查看>>
移动开发 一些打包脚本
查看>>
Windows Service installutil 部署时,出错的解决办法-原创
查看>>
33、iOS10 由于权限问题导致崩溃的大坑
查看>>
【CQOI2015】多项式题解 (NKOJ3252)
查看>>
python辅助sql手工注入猜解数据库案例分析
查看>>
Android开发13——内容提供者ContentProvider的基本使用
查看>>
php 之根据mysql字段 批量生成 array 数组
查看>>
[BZOJ 1005] 明明的烦恼
查看>>
Atitit.Atiposter 发帖机 信息发布器 v7 q516
查看>>