这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。

注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。。

下面是两个程序的代码,(两个程序均为控制台程序)

先发服务端的(Server)完整代码如下:

引入命名空间:

1
2
3
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 

  完整代码如下:

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
namespace SocketServer 
    class Program 
    
        private static byte[] result = new byte[1024]; 
        private static int myProt = 8885;   //端口 
        static Socket serverSocket; 
        static void Main(string[] args) 
        
            //服务器IP地址 
            IPAddress ip = IPAddress.Parse("127.0.0.1"); 
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口 
            serverSocket.Listen(10);    //设定最多10个排队连接请求 
            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()); 
            //通过Clientsoket发送数据 
            Thread myThread = new Thread(ListenClientConnect); 
            myThread.Start(); 
            Console.ReadLine(); 
        
   
        /// <summary> 
        /// 监听客户端连接 
        /// </summary> 
        private static void ListenClientConnect() 
        
            while (true
            
                Socket clientSocket = serverSocket.Accept(); 
                clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); 
                Thread receiveThread = new Thread(ReceiveMessage); 
                receiveThread.Start(clientSocket); 
            
        
   
        /// <summary> 
        /// 接收消息 
        /// </summary> 
        /// <param name="clientSocket"></param> 
        private static void ReceiveMessage(object clientSocket) 
        
            Socket myClientSocket = (Socket)clientSocket; 
            while (true
            
                try 
                
                    //通过clientSocket接收数据 
                    int receiveNumber = myClientSocket.Receive(result); 
                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)); 
                
                catch(Exception ex) 
                
                    Console.WriteLine(ex.Message); 
                    myClientSocket.Shutdown(SocketShutdown.Both); 
                    myClientSocket.Close(); 
                    break
                
            
        
    

  

以上是服务端(server)的完整代码。

客户端(Client)的完整代码如下:

引入命名空间:

1
2
3
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

  完整代码:

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
namespace SocketClient 
    class Program 
    
        private static byte[] result = new byte[1024]; 
        static void Main(string[] args) 
        
            //设定服务器IP地址 
            IPAddress ip = IPAddress.Parse("127.0.0.1"); 
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            try 
            
                clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口 
                Console.WriteLine("连接服务器成功"); 
            
            catch 
            
                Console.WriteLine("连接服务器失败,请按回车键退出!"); 
                return
            
            //通过clientSocket接收数据 
            int receiveLength = clientSocket.Receive(result); 
            Console.WriteLine("接收服务器消息:{0}",Encoding.ASCII.GetString(result,0,receiveLength)); 
            //通过 clientSocket 发送数据 
            for (int i = 0; i < 10; i++) 
            
                try 
                
                    Thread.Sleep(1000);    //等待1秒钟 
                    string sendMessage = "client send Message Hellp" + DateTime.Now; 
                    clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); 
                    Console.WriteLine("向服务器发送消息:{0}" + sendMessage); 
                
                catch 
                
                    clientSocket.Shutdown(SocketShutdown.Both); 
                    clientSocket.Close(); 
                    break
                
            
            Console.WriteLine("发送完毕,按回车键退出"); 
            Console.ReadLine(); 
        
    

  编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。

效果如下图:

该程序已在局域网测试通过。(192.168.X.X)

C# 之 Socket 简单入门示例的更多相关文章

  1. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  2. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  3. Web Service简单入门示例

    Web Service简单入门示例     我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...

  4. .NET Socket 简单入门

    说到Socket,想必大家都或多或少有所涉及,从最初的计算机网络课程,讲述了tcp协议,而Socket就是对协议的进一步封装,使我们开发人员能够更加容易轻松的进行软件之间的通信. 这个星期刚好接受一个 ...

  5. spring简单入门示例

    1 控制反转IOC\依赖注入DI,因为翻译的不同,因此有两个名字.       控制反转意思就是说,当我们调用一个方法或者类时,不再有我们主动去创建这个类的对象,控制权交给别人(spring). 依赖 ...

  6. socket.io入门示例参考

    参考示例地址:http://www.linchaoqun.com/html/cms/content.jsp?menu=nodejs&id=1480081169735

  7. JavaGUI之Swing简单入门示例

    简介 AWT(译:抽象窗口工具包),是Java的平台独立的窗口系统,图形和用户界面器件工具包. Swing 是为了解决 AWT 存在的问题而以 AWT 为基础新开发的包(在使用Swing时也常会用到j ...

  8. 【java开发系列】—— struts2简单入门示例

    前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了js ...

  9. 百度 WebUploader 简单入门示例

    首先一定要引入:jquery.js 然后是webuploader的一个 css和还一个js 三个必须引用. <!DOCTYPE html> <html xmlns="htt ...

随机推荐

  1. jsonp实现跨域资源共享原理

  2. Kali Linux安装字典StarDict

     Kali Linux安装字典StarDictStartDict是国外知名的字典框架,也可以加入国内翻译工具的字典.Kali Linux软件源提供该字典框架.用户需要安装qstardict软件包和词库 ...

  3. Kali Linux更新后无法启动解决了

    Kali Linux更新后无法启动解决了   1月3日,Kali Linux从上游Debian引入systemd组件的升级版本240-2.一旦更新该版本,就可能造成系统无法启动,直接进入(initra ...

  4. C语言柔性数组讲解

    #include<stdio.h> typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { ; ...

  5. 我的 FPGA 学习历程(09)—— 时序逻辑入门

    讲到这篇时,组合逻辑就告一段落了,下面是一些总结: 描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量 描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 ...

  6. TortoiseGit的ssh key和Git的ssh key

    情景模拟: 你使用Git+TortoiseGit对项目进行版本控制,本地库(自己电脑建立的.git)与远程库(如GitLab上建立)通信需要使用ssh验证,你用git生成公钥并保存到了Gitlab上, ...

  7. pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    数据介绍 先随机生成一组数据: import pandas as pd import numpy as np state = ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'N ...

  8. gridlayout代码注释

    <div class="wrapper"> //定义一节或者一部分区域,它的css样式对应的css中class选择器的wrapper <div class=&qu ...

  9. vue font-icon 图标

    1.vue 游览器左上角小图标 把.ico文件放在根目录下的static文件夹下,然后link标签引入 <link rel="shortcut icon" href=&quo ...

  10. redis消息队列,tp5.0,高并发,抢购

    redis处理抢购,并发,防止超卖,提速 1.商品队列(List列表),goods_list           控制并发,防止超卖 2.订单信息(Hash集合),order_info        ...