这个例子只是一个简单的连续发送数据,接收数据的DEMO。因为最近做一个项目,要求robot连续的通过Socket传回自己的当前的位置坐标,然后客户端接收到坐标信息,在本地绘制地图,实时显示robot的位置。

里面还有好多的问题,在实际的项目中一定要解决,不然肯定跑步起来。比如:消息边界问题(帧的边界)、消息命令的解析等


下面直接代码:

服务器的代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.Net;

using System.Net.Sockets;

using System.Threading;

 

namespace ConsoleApplication6

{

    class Program

    {

        //定义接收缓冲数组,端口号,监听socket

        private static byte[] buffer = new byte[1024];

        private static int port = 8887;

        private 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, port));//绑定IP地址:端口

            serverSocket.Listen(10);//设定最多10个连接请求排队

            Console.WriteLine("监听:" + serverSocket.LocalEndPoint.ToString());

 

            //建立线程监听client连接请求

            Thread myThread = new Thread(ListenClientConnection);

            //myThread.IsBackground = true;

            myThread.Start();

 

        }//Main()

 

        /// <summary>

        /// 新线程:监听客户端连接

        /// </summary>

        private static void ListenClientConnection()

        {

            while (true)

            {

                Socket clientSocket = serverSocket.Accept();

                clientSocket.Send(Encoding.UTF8.GetBytes("Server Say Hello"));

                //没接收到一个连接,启动新线程接收数据

                Thread receiveThread = new Thread(ReceiveMessage);

                receiveThread.Start(clientSocket);

            }//while

        }//ListenClientConnection()

 

        /// <summary>

        /// 接收数据消息

        /// </summary>

        /// <param name="clientSocket">监听socket生成的普通通信socket</param>

        private static void ReceiveMessage(object clientSocket)

        { 

            Socket myClientSocket = (Socket)clientSocket;

            while (true)

            {

                try

                {

                    //通过myClientSocket接收数据

                    int receiveNumber = myClientSocket.Receive(buffer);

                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(buffer, 0, receiveNumber));

                }

                catch(Exception ex)

                {

                    Console.WriteLine(ex.Message);

                    //关闭所有的Socket连接功能Receive、Send、Both

                    myClientSocket.Shutdown(SocketShutdown.Both);

                    myClientSocket.Close();

                    break;

                }

            }//while

        }//ReceiveMessage()

    }//class

}

客户端的代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.Net;

using System.Net.Sockets;

using System.Threading;

 

namespace ConsoleApplication7

{

    class Program

    {

        private static byte[] buffer = 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, 8887));

                Console.WriteLine("连接服务器成功");

            }

            catch(Exception ex)

            {

                Console.WriteLine("服务器连接失败,请按回车退出");

                return;

            }

 

            //通过clientSocket接收数据

            int receiveNumber = clientSocket.Receive(buffer);

            Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(buffer, 0, receiveNumber));

 

            //启动新的线程,给Server连续发送数据

            Thread sendThread = new Thread(SendMessage);

            //把线程设置为前台线程,不然Main退出了线程就会死亡

            sendThread.IsBackground = false;

            sendThread.Start(clientSocket);

 

        }//Main

 

        /// <summary>

        /// 启动新的线程,发送数据

        /// </summary>

        /// <param name="clientSocket"></param>

        private static void SendMessage(object clientSocket)

        {

            Socket sendSocket = (Socket)clientSocket;

            //利用新线程,通过sendSocket发送数据

            for (int i = 0; i < 100; i++)

            {

                try

                {

                    Thread.Sleep(1000);

                    string sendMessage = "client send Message Hellp" + DateTime.Now;

 

                    sendSocket.Send(Encoding.ASCII.GetBytes(sendMessage));

                    Console.WriteLine("向服务器发送消息:{0}", sendMessage);

 

                }

                catch (Exception ex)

                {

                    sendSocket.Shutdown(SocketShutdown.Both);

                    sendSocket.Close();

                    //一旦出错,就结束循环

                    break;

                }

            }//for

        }//SendMessage()

 

    }//class

}


代码总结:

上面的代码没什么难点,就简单的说一下注意的地方:

(1)字符串和字符数组之间的转换方法:Ecoding.UTF8.Get或者Ecoding.ASCII.Get这两个方法,很简单。但是当要把结构体和字符数组转换就没那么简单了。

(2)客户端和服务器中启动了一些新的线程发送或者接收数据,在控制台,必须把线程设置为前台线程。不然Main函数一结束,就意味着主线程结束了,那么所有的后台线程就会随之死亡。

(3)客户端发送数据的线程,不要在主线程中,因为它没隔10s发送一次数据,有Thread.sleep()函数的调用,在Main线程中会阻塞主线程,要单独的开一个线程发送数据。

(4)在出现异常或者最后退出时,要关闭Socket的功能和关闭Socket的流。释放占用的计算机资源。

[C#参考]利用Socket连续发送数据的更多相关文章

  1. QTcpSocket的连续发送数据和连续接收数据

    关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...

  2. 利用Socket远程发送文件

    思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件

  3. Python3爬虫(2)_利用urllib.urlopen发送数据获得反馈信息

    一.urlopen的url参数 Agent url不仅可以是一个字符串,例如:https://baike.baidu.com/.url也可以是一个Request对象,这就需要我们先定义一个Reques ...

  4. 利用AXI-DMA批量发送数据到DMA

    1.1 主函数 int main(void) { XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); XGpio_SetDataDirection(&G ...

  5. Socket异步发送的同步控制

    在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...

  6. 2、 Spark Streaming方式从socket中获取数据进行简单单词统计

    Spark 1.5.2 Spark Streaming 学习笔记和编程练习 Overview 概述 Spark Streaming is an extension of the core Spark ...

  7. python socket 连续send,出现粘包问题

    使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...

  8. php 利用socket发送GET,POST请求

    作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...

  9. socket 异步 发送 接收 数据

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

随机推荐

  1. html教程系列--form frameset

    <font> 标签: 规定文本的字体.字体尺寸.字体颜色.不建议直接使用,可以使用样式表替代. <footer> 标签:定义公用的底部信息.通常包含文档的作者.版权信息.使用条 ...

  2. CRM odata方法 js容易出现的错误,大小写区分 Value Id

    Id Value  注意大小写,I大写,V大写,typeResults.result[0].yt_category.Value; 否则会报 错,Result.yt_businessunit_terri ...

  3. JS 精粹(一)

    先说说JS是容易被误解的语言的观点.从名字上来看,"Java"这似乎暗示着这门语言与Java的关系:好像这门语言是Java的子集,或比Java弱.但实际与Java并无关系,如果说非 ...

  4. poj1700--贪心算法

    题意:一群人坐船过河,船只有一辆,且一次最多坐两人,时间按慢的算.求最短过河时间? 总共有两种做法可使用: 1.先让最快和次快的过去,让最快的把船开回,再让最慢和次慢的过去,让次快的把船开回.需两个来 ...

  5. 《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information

    1. 一段查看地址内容的代码 代码: #include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byt ...

  6. Java 初始化字段方式和顺序

    Java 初始化字段方式和顺序: 类加载时直接初始化静态字段; 类加载时调用静态方法初始化静态字段; 实例化对象时,在调用构造函数之前代码块中初始化字段; 实例化对象时,在调用构造函数之时初始化字段; ...

  7. Flink资料(7) -- 背压监控

    背压(backpressure)监控 本文翻译自Back Pressure Monitoring --------------------------------------------------- ...

  8. python日志记录-logging模块

    1.logging模块日志级别 使用logging模块简单示例: >>>import logging >>>logging.debug("this's a ...

  9. OpenCV学习 2:播放AVI视频

    原创文章,欢迎转载,转载请注明出处 第二个程序,播放视频.用opencv做起来是如此的简单..哈哈.           学Opencv,只是为了在它的基础上实现工程应用,而它里面高深的理论我等屌丝只 ...

  10. OpenCV学习 1:OpenCV安装与第一个图像显示程序

    原创作品,转载请注明出处 为了提升逼格,决定学下OpenCV,想想如果可以做人脸识别,定点降落,让飞机跟着自己飞..想想都有点小激动.这只是想的,能不能学会还不知道..哈..      1:先下载:h ...