[C#参考]利用Socket连续发送数据



这个例子只是一个简单的连续发送数据,接收数据的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的流。释放占用的计算机资源。

时间: 2024-11-05 19:25:20

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

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

关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为只要发送方write一次,接收方就会响应readyRead信号.其实根本就不是这样的,readyRead不会知道发送方调用了几个write,它只负责在有数据到达时触发,等你真正接收时,或许已经能够收到所有的数据了.这要看你发送的信息量了,如果很少的话,比如发送几个字节的数据当然没有问题,一次read

使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.连接服务器 2.发送和接收数据 3.关闭网络连接 一.连

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.         连接服务器 2.         发送

php 利用socket发送GET,POST请求

作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http基础的开发者阅读. 今天给大家带来的是如何利用socket发送GET,POST请求.我借用燕十八老师封装好的一个Http类给进行说明. 在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的.了解过HTT

ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据

ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ————————————————————————————————————— ZeroMQ 官方地址:http://api.zeromq.org/4-1:zmq-send-const zmq_send_const(3)           ØMQ Manual - ØMQ/4.1.0 Name zmq_send_const – 从一个socket上发送一个固定内存数据

利用fiddler模拟发送json数据的post请求

fiddler是调试利器,有许多好用的功能,这里简单的介绍一下利用fiddler模拟发送post请求的例子 先简单介绍一下失败的例子,最后给出正确的方法 在fiddler里边按照图上所示的设置好之后,点击右上角的execute,会报错 看下原因说的是后端不支持你提交数据的格式,也就是你发送的数据格式不对,可以添加请求头即可 如图设置 这样就ok了 利用fiddler的模拟post请求的时候,自己可以根据报错,修改就ok

Java 通过Socket编程 发送和接收数据

Socket client = null; try{     client = new Socket(Ip,Port);     String msg="发送的数据内容!";     //得到socket读写流,向服务端程序发送数据       client.getOutputStream().write(msg.getBytes());     byte[] datas = new byte[2048];     //从服务端程序接收数据     client.getInputStr

ActionScript接收socket服务器发送来的数据

原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可以接收数据,但是两者实现方法有些不同,让我们先看看Socket类是如何做的. 正如前面所讲到的,Flash提供的socket通信方式是异步通信,也就是说仅仅创建socket连接并试图读取数据这是不可能的,read方法读取数据时并不会等待数据传输过来而立即返回,如果数据还没准备好而去读取数据会导致异常

Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果

一.urlopen的url参数 Agent url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我们先定义一个Request对象,然后将这个Request对象作为urlopen的参数使用,方法如下: # -*- coding: UTF-8 -*- from urllib import request if __name__ == "__main__": req = request.Request("http