[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的流。释放占用的计算机资源。
[C#参考]利用Socket连续发送数据的更多相关文章
- QTcpSocket的连续发送数据和连续接收数据
关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...
- 利用Socket远程发送文件
思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件
- Python3爬虫(2)_利用urllib.urlopen发送数据获得反馈信息
一.urlopen的url参数 Agent url不仅可以是一个字符串,例如:https://baike.baidu.com/.url也可以是一个Request对象,这就需要我们先定义一个Reques ...
- 利用AXI-DMA批量发送数据到DMA
1.1 主函数 int main(void) { XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); XGpio_SetDataDirection(&G ...
- Socket异步发送的同步控制
在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...
- 2、 Spark Streaming方式从socket中获取数据进行简单单词统计
Spark 1.5.2 Spark Streaming 学习笔记和编程练习 Overview 概述 Spark Streaming is an extension of the core Spark ...
- python socket 连续send,出现粘包问题
使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...
- php 利用socket发送GET,POST请求
作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...
- socket 异步 发送 接收 数据
Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / ...
随机推荐
- Haffman编码(haffman树)
Haffman编码 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...
- DIV以及图片水平垂直居中兼容多种浏览器
纯css完美地解决图片以及div垂直水平居中,兼容IE7.0.IE6.0.IE5.5.IE5.0.FF.Opera.Safari具体实现css 如下,感兴趣的朋友可以参考下哈 第一种:全CSS控制 ...
- bootstrap注意事项(八)一些辅助信息
1.三角符号 通过使用三角符号可以指示某个元素具有下拉菜单的功能.注意,向上弹出式菜单中的三角符号是反方向的. <!DOCTYPE HTML><html><head> ...
- C#根据汉字生成拼音首字母全称
static void Main(string[] args) { string s = GetChineseSpell("周杰伦"); Console.WriteLine(s.T ...
- 第9课_3_db库安装
四 安装listener监听 使用oracle用户,在rac1和rac2上都可以起netca 1.打开网络配置界面,选择"Cluster configuration"集群配置方案, ...
- VMware vSphere Client为虚拟机制定物理网卡(图文并茂)
1.首先,查看我的服务器有几张网卡,如下图共3张,接下来我将为虚拟主机制定一张网卡,以及为当中的两台虚拟的CentOS7各制定一张网卡. 2.打开“硬件”---->“网络”,如图,已经启用一张网 ...
- 在EL表达式或者Struts标签库中格式化日期对象,即将Date转换为yyyy-MM-dd格式
一.EL表达式 首先,在jsp页面引入<fmt> tags,<%@ taglib prefix="fmt" uri="http://java.sun.c ...
- getDeclaredFields()和getFields()
getFields()获得某个类额的所有的公共(public)的字段,包括父类. getDeclaredFields()获得某个类的所有申明的字段,即包括public.private和proteced ...
- BOOST_PP_INC_I(x)实现
这个比较有意思,# define BOOST_PP_INC_I(x) BOOST_PP_INC_ ## x 连接在一起以后,然后定义为x+1 实现了inc功能,不过最多也就到255 # /* Copy ...
- perl正则表达式第一周笔记
正则表达式基础 ^ 行首标志 $ 行末标志 如^cat即一整行只有cat这个单词,^则是一个空行 [ ] 字符组,用来匹配若干字符之一 如gr[ae]y,即grey或者gray - 在字符组内部,字 ...