C#中Socket通信用法实例详解

2023-05-16

本文实例讲述了C#中Socket通信用法。分享给大家供大家参考。具体如下:

一、UDP方式:

服务器端代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

static void Main(string[] args)

{

  int recv;

  byte[] data = new byte[1024];

  IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点

  Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket

  newsock.Bind(ipep);//Socket与本地的一个终结点相关联

  Console.WriteLine("Waiting for a client..");

  IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址

  EndPoint Remote = (EndPoint)(sender);//

  recv = newsock.ReceiveFrom(data, ref Remote);//接受数据     

  Console.WriteLine("Message received from{0}:", Remote.ToString());

  Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

  string welcome = "Welcome to my test server!";

  data = Encoding.ASCII.GetBytes(welcome);

  newsock.SendTo(data, data.Length, SocketFlags.None, Remote);

  while (true)

  {

    data = new byte[1024];

    recv = newsock.ReceiveFrom(data, ref Remote);

    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

    newsock.SendTo(data, recv, SocketFlags.None, Remote);

  }

}

客户端代码:

?

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

void MainInfo()

{

  byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区

  string input, stringData;

  IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.21"), 9050);

  Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

  string welcome = "Hello,are you there?";

  data = Encoding.ASCII.GetBytes(welcome);

  server.SendTo(data, data.Length, SocketFlags.None, ipep);//将数据发送到指定的终结点

  IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

  EndPoint Remote = (EndPoint)sender;

  data = new byte[1024];

  int recv = server.ReceiveFrom(data, ref Remote);//接受来自服务器的数据

  Console.WriteLine("Message received from{0}:", Remote.ToString());

  Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

  while (true)//读取数据

  {

    input = richTextBox1.Text;//从键盘读取数据

    if (input == "text")//结束标记

    {

      break;

    }

    server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//将数据发送到指定的终结点Remote

    data = new byte[1024];

    recv = server.ReceiveFrom(data, ref Remote);//从Remote接受数据

    stringData = Encoding.ASCII.GetString(data, 0, recv);

    Console.WriteLine(stringData);

  }

  Console.WriteLine("Stopping client");

  server.Close();

}

二、TCP方式:

服务器端代码:

?

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

62

63

64

65

66

67

68

69

70

71

72

73

74

Socket serverSocket = null;

Thread clientThread = null;

Socket clientSocket = null;

Thread thread = null;

IPAddress ips = null;

PEndPoint ipep = null;

void ServerStart()

{

  ips = Dns.GetHostAddresses(Dns.GetHostName())[0];

  //创建IPEndPoint实例 

  ipep = new IPEndPoint(ips, 9050);

  //创建一个套接字 

  serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

  //将所创建的套接字与IPEndPoint绑定 

  serverSocket.Bind(ipep);

  //设置套接字为收听模式 

  serverSocket.Listen(20);

  while (listenalive)

  {

    try

    {

      //在套接字上接收接入的连接 

      clientSocket = serverSocket.Accept();

      clientThread = new Thread(new ParameterizedThreadStart(ReceiveData));

      clientThread.Start(clientSocket);

    }

    catch (Exception ex)

    {

      WriteErrorLog(ex.Message);

      serverSocket.Close();

      serverSocket = null;

    }

  }

}

static void ReceiveData(object obj)

{

  bool keepalive = true;

  Socket s = obj as Socket;

  Byte[] buffer = new Byte[1024];

  //根据收听到的客户端套接字向客户端发送信息 

  IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;

  Console.WriteLine("客户端ip:" + clientep.Address + " 端口:" + clientep.Port);

  string welcome = "连接服务器成功";

  buffer = System.Text.Encoding.Unicode.GetBytes(welcome);

  //向客户端发送“连接服务器成功”消息

  s.Send(buffer, buffer.Length, SocketFlags.None);

  buffer = new Byte[1024];

  int bufLen = 0;

  string content = string.Empty;

  while (true)

  {

    //在套接字上接收客户端发送的信息 

    bufLen = 0;

    try

    {

      bufLen = s.Receive(buffer);

      if (bufLen == 0)

      {

        break;

      }

      content += System.Text.Encoding.Unicode.GetString(buffer, 0, bufLen);

    }

    catch (Exception ex)

    {

      break; ;

    }

  }

  Send(s, content);

  s = null;

  buffer = null;

  clientep = null;

  Thread.CurrentThread.Abort();

}

客户端代码:

?

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

void Send(string content)

{

  byte[] data = new byte[1024];

  newclient = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);

  ie = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ipadd), port);//服务器的IP和端口

  try

  {

    //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。

    newclient.Connect(ie);

  }

  catch (System.Net.Sockets.SocketException e)

  {

    Console.WriteLine(e.ToString());

    return;

  }

  int recv = newclient.Receive(data);

  //连接服务器成功

  string stringdata = System.Text.Encoding.Unicode.GetString(data, 0, recv);

  if (stringdata == "连接服务器成功")

  {

    newclient.Send(System.Text.Encoding.Unicode.GetBytes(content));

    newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send);

    data = new byte[1024];

    recv = newclient.Receive(data);

    string result = System.Text.Encoding.Unicode.GetString(data, 0, recv);    

    newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive);

    newclient.Close();

    MessageBox.Show(result);

  }

  else

  {

    MessageBox.Show("连接服务器失败", "友情提示");

  }

}

希望本文所述对大家的C#程序设计有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中Socket通信用法实例详解 的相关文章

  • QT中UDPSocket丢包问题

    1 配置和编程 下位机向上位机发送UDP数据包 由于UDP小包不能写太大 每个小包也就1kB左右 下位机周期性地发送数据 每个周期发送数百个udp包 并且是使用while死循环来发送的 上位机使用QUdpSocket类接收UDP数据 采用信
  • MFC实现socket网络通信--主机与服务器之间传送数据

    MFC实现socket网络通信 模拟主机与服务器之间传送数据 MFC实现socket网络通信 1 新建MFC应用程序 2 创建服务端窗口界面 3 写服务器代码 4 创建客户端窗口界面 5 客户端代码部分 6 开始调试 7 小结 MFC实现s
  • 读书笔记_《Linux高性能服务器编程》_第 5 章:网络编程基础API

    第 5 章 Linux网络编程基础API 知识要点 socket 地址 API socket 基础 API 网络信息 API 1 socket 地址API 主机字节序和网络字节序 CPU 32位 的累加器一次至少可以装载 4 字节 即一个整
  • 带外数据

    定义带 外 数据 想 像一下在银行人们排起队等待处理他们的帐单 在这个队伍中每个人最后都会移到前面由出纳员进行服务 现在想像一下一个走入银行 越过整个队伍 然后用枪抵 住出纳员 这个就可以看作为带 外 数据 这个强盗越过整个队伍 是因为这把
  • 阿里云:网络编程 bind:cannot assign requested address errno:99 问题

    解决方案 阿里云上的服务器代码绑定的 IP 需要时内网 IP ifconfig 查看 其他客户端连接服务器时所用的 IP 得是阿里云的外网 IP 查看实例即可 分析思路 猜想1 bind cannot assign requested ad
  • 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6

    如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6 如何巧妙地设计代码结构 陈 鲁 软件工程师 IBM 孙 妍 软件工程师 IBM 简介 当今的网络主流是 IPv4 网络 但随着 IP 地址的日益短缺 IPv6 网络开
  • 物联网实训总结——简易的智能农场

    物联网实训总结 简易的智能农场 一 场景需求 1 农场环境监测 对农场的环境实现智能感知 对温度 湿度 光照值实时显示 同时检测农场烟雾状态 判断火情 实时监控农场人员出现情况 2 控制管理 智能农场控制部分分为 通风系统和补光系统 实现对
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • Websocket(一)——原理及基本属性和方法

    初次接触 WebSocket 的人 都会问同样的问题 我们已经有了 HTTP 协议 为什么还需要另一个协议 它能带来什么好处 答案很简单 因为 HTTP 协议有一个缺陷 通信只能由客户端发起 举例来说 我们想了解今天的天气 只能是客户端向服
  • Socket传输文件/传输图片(Windows)

    利用UDP socket 来传输文件与图片 流程图如下 主要流程 1 client端发送command请求 上传数据或者下载数据 选择文件路径 2 server端应答 start代表开始传输 no代表拒绝 3 fopen打开文件进行读取 f
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • Qt之TCP心跳包

    Qt之TCP心跳包 当Qt作为客户端程序 而服务器需要监控客户端的在线状态时 就需要Qt端发送心跳包 心跳包可以是TCP也可以是UDP 这里介绍TCP心跳包的实现方法 心跳包通常要单开一个线程 在进程运行的过程中一直执行 代码示例 h文件
  • Java实现一个简单的命令行聊天程序

    Socket编程 Java实现 客户端 package net import java io BufferedReader import java io InputStreamReader import java io PrintWrite
  • JAVA socket编程实例

    转载文章 原作者无从考证 感谢作者的无私奉献 事实上网络编程简单的理解就是两台计算机相互通讯数据而已 对于程序员而言 去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了 Java SDK提供一些相对简单的Api来完成这些工作 Soc
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • Windows平台下MingGW的网络socket编程模型

    Windows平台下MingGW的网络socket编程模型 1 TCP服务器 include
  • node socket 简易聊天室

    服务端 const net require net const server net createServer 用户列表 let clients 监听连接 server on connection client gt client on d
  • socket,socket.io,mongodb

    Socket 网络上的程序实现双向的数据链接 这个链接的一端成为socket 1 Socket是一个持久链接 2 Socket是双向通信的 Socket VS ajax轮询 ajax轮询 是利用客户端来发送请求 每隔几秒发送一个http请求
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • broken pipe

    1 broken pipe的字面意思是 管道破裂 broken pip的原因是该管道的读端被关闭 2 broken pipe经常发生socket关闭之后 或者其他的描述符关闭之后 的write操作中 3 发生broken pipe错误时 进

随机推荐

  • CPU,寄存器,内存三者的关系

    一 皇帝身边的小太监 寄存器 不知道什么是寄存器 xff1f 那见过太监没有 xff1f 没有 xff1f 其实我也没有 没见过不要紧 xff0c 见过就麻烦大了 xff0c 大家都看过古装戏 xff0c 那些皇帝们要阅读奏章的时候 xff
  • 内网和外网通信的问题

    各位大神 xff0c 我把两台电脑 xff0c 其中一台通过路由器映射了 xff0c 也就成为了所为的服务器了 xff0c 另一台也就是处在内网的 xff0c 也就是我们平时一般人的电脑 xff0c 也就是客户端了 xff0c 那么客户端是
  • OpenCV进行图像相似度对比的几种办法

    转载请注明出处 xff1a http blog csdn net wangyaninglm article details 43853435 xff0c 来自 xff1a shiter编写程序的艺术 对计算图像相似度的方法 xff0c 本文
  • Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后 xff0c 真心感觉python的功能实在太强大 xff0c 因此将这些文章总结一下 xff0c 建立一下自己的知识体系 当然了 xff0c 图像识别这个话题作为计算机科学的一个分支 xff0c
  • OpenCV进行图像相似度对比的几种办法

    1 直方图方法 方法描述 xff1a 有两幅图像patch 当然也可是整幅图像 xff0c 分别计算两幅图像的直方图 xff0c 并将直方图进行归一化 xff0c 然后按照某种距离度量的标准进行相似度的测量 方法的思想 xff1a 基于简单
  • 比较两幅图像的相似度

    现在以图搜图的功能比较火热 xff0c 很好奇其原理 简单的搜索学习得知 xff0c 实现相似图片搜索的关键技术是 感知哈希算法 xff0c 作用是对每一张图片按照某种规律生成一个对应的指纹字符串 比较不同图片之间的指纹字符串 xff0c
  • 查找文献方法整理

    1 dblp computer science bibliography 在搜索框查找文献关键字 xff0c 或文献标题 xff0c 右边可以筛选 找到想找的论文之后 xff0c 可以将鼠标移到view xff0c 找到原网站 有些网站可以
  • OpenCV进行图像相似度对比的几种办法

    平均哈希算法 实现步骤 缩小尺寸 xff1a 将图像缩小到8 8的尺寸 xff0c 总共64个像素 这一步的作用是去除图像的细节 xff0c 只保留结构 明暗等基本信息 xff0c 摒弃不同尺寸 比例带来的图像差异 xff1b 简化色彩 x
  • opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记 xff08 六 xff09 直方图比较图片相似度 opencv提供了API来比较图片的相似程度 xff0c 使我们很简单的就能对2个图片进行比较 xff0c 这就是直方图的比较 xff0c 直方图英文是histogra
  • 完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比

    成对几何直方图匹配 public static string MatchHist string haarXmlPath 61 64 34 haarcascade frontalface alt tree xml 34 HaarCascade
  • OpenCV学习笔记——判断两张图的相似度

    判断两张图的相似度 方法 直方图对比法ORB算法 实验 1 直方图对比法 参考如何使用OpenCV3直方图方法进行人脸相似度对比 因为我的环境是VS2010 43 OpenCV2 4 8 xff0c 所以在原版的基础上做了一点小修改 inc
  • 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图

    本文链接 xff1a https blog csdn net xiaowei cqu article details 7606607 前面介绍了 数字图像灰度直方图 xff0c 现在来尝试直方图的应用 直方图均衡化 直方图均衡化 xff08
  • C# Socket服务器及多客户端连接应用例程

    服务端代码 控制台示例 static List lt Socket gt Sockets 61 new List lt Socket gt static void Main string args int port 61 10 byte b
  • C#Socket文件传输(发送与接收代码)

    原文链接 xff1a http www cnblogs com reynoldchan p 3762014 html 这里是发送的代码 xff1a SendVarData是转码后发送函数 1 lt summary gt 2 发送文件 3 l
  • C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤 xff1a 一 服务端的建立 1 服务端的项目建立以及页面布局 2 各功能按键的事件代码 1 xff09 传输类型说明以及全局变量 2 xff09 Socket通信服务端具体步骤 xff1a xff08 1 xff09 建立一个Soc
  • C# Socket案例(服务端与客户端)

    本文链接 xff1a https blog csdn net qq 42203978 article details 80520299 服务端完整代码 using System using System Net using System N
  • C#中的Socket编程-TCP客户端

    TCP客户端 using System using System Collections Generic using System Linq using System Net using System Net Sockets using S
  • 最小花费(图论算法)

    Description 在n个人中 xff0c 某些人的银行账号之间可以互相转账 这些人之间转账的手续费各不相同 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费 xff0c 请问A最少需要多少钱使得转账后B收到100元 Input
  • C#获取本机IP地址字符串

    1 using System Net 2 using System Net Sockets 3 4 lt summary gt 5 获取本机IP地址 6 lt summary gt 7 lt returns gt 本机IP地址 lt ret
  • C#中Socket通信用法实例详解

    本文实例讲述了C 中Socket通信用法 分享给大家供大家参考 具体如下 xff1a 一 UDP方式 xff1a 服务器端代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22