C# Socket编程

简介:

在.NET技术大系当中,有很多服务编程的技术,比如socket、windows service、.net remoting、message queue、web service、wcf等等,这些技术都往往与网络知识紧密相关,有时还会结合多线程等技术,实现特定的需求。这里只以Socket为例,看如何运用C#进行网络编程。

熟悉Socket编程的应该都不陌生,要实现Socket,需要一个服务端程序以及一个客户端程序,服务端程序绑定IP、Port,建立侦听;客户端程序建立连接,向服务端抛出请求,通过TCP或UDP协议,获得服务端的反馈,这是一个双工通信的过程。而且最重要的是,Socket通信与具体编程语言无关,C、C++、JAVA、C#、PHP、Flex等高级编程语言都提供了相应的实现。

下面这个是个客户端Socket的简单例子,也是实际工作中曾经用过的。当时的情况是Socket服务端是用Java开发的一个程序,通过使用Socket,让两台不同网络的的机器通过前置机获取对方的信息。通过客户端发起请求,服务端监听收到请求后,进行响应处理,并把封装好的XML文档返回客户端。客户端收到XML数据后进行解析处理即可。

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
/// <summary>
/// 获取通讯中间件通过socket发送的数据,DataTable
/// </summary>
/// <param name="requestCode">请求code</param>
/// <param name="array">查询的条件,封装在数组里</param>
/// <param name="errMsg">错误提示</param>
/// <returns>经过一系列处理过后的DataTable</returns>
public  DataTable GetDataTable( string  requestCode, IList< string > list,  out  string  errMsg)
{
     try
     {
         string  ip = ConfigurationManager.AppSettings[ "ip" ].ToString().Trim(); //中间件的ip地址
         int  port = Convert.ToInt32(ConfigurationManager.AppSettings[ "port" ].ToString().Trim()); //中间件的端口号
         IPEndPoint serverip =  new  IPEndPoint(IPAddress.Parse(ip), port);
         using  (Socket clientSocket =  new  Socket(serverip.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
         {
             clientSocket.Connect(serverip); //socket连接指定中间件前置机
             string  outBufferString =  string .Empty; //准备发送的报文
             switch  (requestCode)
             {
                 case  "111001" :
                     outBufferString = PrepareSendPackets( "111001" , list);
                     break ;
                 case  "111002" :
                     outBufferString = PrepareSendPackets( "111002" , list);
                     break ;
                 case  "111003" :
                     outBufferString = PrepareSendPackets( "111003" , list);
                     break ;
                 default :
                     break ;
             }
             byte [] outBuffer =  new  byte [2048];
             outBuffer = Encoding.GetEncoding( "gbk" ).GetBytes(outBufferString);
             clientSocket.Send(outBuffer, outBuffer.Length, 0); //发送报文
                            
             byte [] inBuffer =  new  byte [51200];
             clientSocket.Receive(inBuffer, inBuffer.Length, 0); //接收报文
             string  inBufferString =  "<?xml version='1.0' encoding='gb2312' ?> " ;
             inBufferString += Encoding.GetEncoding( "gbk" ).GetString(inBuffer);
             DataTable dt = ParsingPackets(requestCode, inBufferString,  out  errMsg);
             return  dt;
         }
     }
     catch  (Exception ex)
     {
         throw  ex;
     }
}

再附一个完整一点的小例子。

这个程序简单实现了客户端发送消息,服务端接收消息并反馈给客户端消息的过程。用了同步模式,是最简单的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
static  void  Main( string [] args)
     {
         //定义一个字典用于存放用户列表
         Dictionary< string string > users =  new  Dictionary< string string >();
                        
         using  (Socket socket =  new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
         {
             IPEndPoint ipe =  new  IPEndPoint(IPAddress.Parse( "192.168.1.7" ), 1234);
             socket.Bind(ipe);
             socket.Listen(10);
                        
             Console.WriteLine( "socket start!" );
                        
             while  ( true ) //服务端死循环,不断提供socket服务
             {
                 Socket clientSocket = socket.Accept(); //等待客户端请求
                        
                 IPEndPoint ip = (IPEndPoint)clientSocket.RemoteEndPoint;
                 string  remoteAddress = ip.Address.ToString(); //远程IP地址
                        
                 byte [] revBytes =  new  byte [512];
                 clientSocket.Receive(revBytes); //接收客户端发送的消息
                 string  user = Encoding.Default.GetString(revBytes);
                        
                 if  (!users.ContainsKey(remoteAddress))
                 {
                     users.Add(remoteAddress, user);
                 }
                 Console.WriteLine( "来自于"  + remoteAddress +  "的用户:"  + user);
                 string  content =  "欢迎来到socket的世界!" ;
                 byte [] bytes = Encoding.Default.GetBytes(content);
                 clientSocket.Send(bytes); //发送服务端消息到客户端
                        
                 clientSocket.Shutdown(SocketShutdown.Both);
                 clientSocket.Close();
             }
         }
     }

客户端WPF:

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
public  MainWindow()
     {
         InitializeComponent();
     }
                   
     private  string  ip; //传入的ip
     private  string  username; //传入的用户名
                   
     public  MainWindow( string  ip,  string  username)
     {
         InitializeComponent();
                   
         this .ip = ip;
         this .username = username;
     }
                   
     private  void  button1_Click( object  sender, RoutedEventArgs e)
     {
         SendSocketPackge();
     }
                   
     private  static  Socket client; //socket对象
                   
     /// <summary>
     /// 发送数据包
     /// </summary>
     private  void  SendSocketPackge()
     {
         //建立1个Socket对象发起TCP连接
         client =  new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         client.Connect(IPAddress.Parse( "192.168.1.7" ), 1234); //连接到服务器指定IP及Port
         string  userSays = username +  "说:"  this .textBox1.Text; //username自己用一个字符串代替
         client.Send(Encoding.Default.GetBytes(userSays)); //将当前的用户名发送给服务器端
                   
         byte [] bytes =  new  byte [512];
         client.Receive(bytes); //接收服务端发送的消息
         client.Shutdown(SocketShutdown.Both);
         client.Close();
                   
         string  content =  string .Join( " " , DateTime.Now.ToString(), Encoding.Default.GetString(bytes));
         listBox1.Items.Add(content); //将消息加载到listbox列表
     }
                   
     private  void  Window_Loaded( object  sender, RoutedEventArgs e)
     {
         ip = Dns.GetHostAddresses(Dns.GetHostName())[0].ToString();
         this .Title =  "来自:"  + ip +  "的用户:"  + username;
     }
                   
     private  void  Window_Closing( object  sender, System.ComponentModel.CancelEventArgs e)
     {
         if  (client !=  null  && client.Connected)
         {
             client.Shutdown(SocketShutdown.Both);
             client.Close();
         }
     }

效果图:

服务启动时:

Center

客户端界面:

Center

点击发送后,服务端显示的消息:

Center
由于代码比较简单,就不上传项目文件了,这里简单演示了一下C#Socket通信的核心代码。读者可以在此基础上不断扩展。




本文转自 guwei4037  51CTO博客,原文链接:http://blog.51cto.com/csharper/1345244
相关文章
|
2月前
|
C# 开发者
C# 一分钟浅谈:Socket 编程基础
【10月更文挑战第7天】本文介绍了Socket编程的基础知识、基本操作及常见问题,通过C#代码示例详细展示了服务器端和客户端的Socket通信过程,包括创建、绑定、监听、连接、数据收发及关闭等步骤,帮助开发者掌握Socket编程的核心技术和注意事项。
102 3
C# 一分钟浅谈:Socket 编程基础
|
2月前
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
2月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
26 0
|
5月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
60 4
|
5月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
37 3
|
5月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
67 2
|
5月前
|
网络协议 程序员 视频直播
|
5月前
|
消息中间件 网络协议 网络安全
Python Socket编程:打造你的专属网络通道,基础篇与进阶篇一网打尽!
【7月更文挑战第26天】在网络编程领域,Python以简洁语法和强大库支持成为构建应用的首选。Socket编程为核心,实现计算机间的数据交换。
73 1
|
5月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
5月前
|
Java API 开发者
Java中的Socket编程与应用
Java中的Socket编程与应用