socket 异步接收连接和接收数据
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using Newtonsoft.Json;
namespace WindowsSocket
{
public class Msg
{
public int Flag { get; set; }
public string Message { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//如果一次接收不了,会多次进入OnMessage方法解析
byte[] buffer = new byte[1024];
public void OnMessage(IAsyncResult result)
{
//result.AsyncState 为调用BeginReceive 传递过来的参数
Socket ts = (Socket)result.AsyncState;
//获取接收到信息的长度
//int count = ts.EndReceive(result);
//result.AsyncWaitHandle.Close();
this.textBox1.Invoke(new EventHandler(delegate
{
var msg = Encoding.ASCII.GetString(buffer);
MessageBox.Show(msg);
//var objects = JsonConvert.DeserializeObject<Msg>(msg);
//MessageBox.Show(objects.Flag.ToString());
//MessageBox.Show(objects.Message.ToString());
//textBox1.Text += ts.RemoteEndPoint.ToString() + "客户端信息" + Encoding.ASCII.GetString(buffer) + "\r\n";
}));
ts.Send(Encoding.ASCII.GetBytes("How are you? I got a message"));
//清空数据,重新开始异步接收
//buffer = new byte[buffer.Length];
ts.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnMessage), ts);
}
/// 异步连接客户端
/// </summary>
/// <param name="tcpServer"></param>
private void AsynAccept(Socket tcpServer)
{
tcpServer.BeginAccept(asyncResult =>
{
//取得终端Socket
Socket socketAccept = tcpServer.EndAccept(asyncResult);
//获取客户端地址信息
if (socketAccept.RemoteEndPoint is IPEndPoint)
{
//var ss = tcpClient.Receive(buffer);
//异步获取数据
socketAccept.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnMessage), socketAccept);
//byte[] msg = new byte[tcpServer.ReceiveBufferSize];
//tcpServer.Receive(msg);
//textBox1.Invoke(new EventHandler(delegate
//{
// textBox1.Text += "客户端信息" + tcpClient.RemoteEndPoint.ToString() + "\r\n";
//}));
}
//持续监听终端连接
AsynAccept(tcpServer);
}, null);
}
//开启socket服务端
private void button1_Click(object sender, EventArgs e)
{
Task task = new Task(() =>
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8877));
socket.Listen(1111);
AsynAccept(socket);
});
task.Start();
}
}
}
socket 异步接收连接和接收数据的更多相关文章
- vlc-android对于通过Live555接收到音视频数据包后的处理分析
通过ndk-gdb跟踪调试vlc-android来分析从连接到RTSP服务器并接收到音视频数据包后的处理过程. 首先,从前面的文章有分析过vlc-android的处理过程通过线程函数Run()(Src ...
- 接收连接basic_socket_acceptor
概述 TCP有一处和UDP不同的地方是TCP是面向连接的,TCP有建立连接.通信.关闭连接的操作,Boost.Asio提供了ip::tcp::acceptor用来接收新的TCP连接,底层由socket ...
- boost的asio接收单路大数据量udp包的方法
开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个 ...
- c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据
本文基于networkcomms2.3.1开源版本 gplv3协议 在networkcomms通信系统中,服务器端收到某连接上的数据后,数据会暂时存放在"数据包创建器"(Pack ...
- Request.Form接收不到post数据.
Request.Form接收不到post数据. https://q.cnblogs.com/q/62635/ Content-Type 有没有设置为 application/x-www-form-ur ...
- jQuery提交Json数据到Webservice,并接收返回的Json数据
jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...
- SpringBoot后台接收前台的字符串数据
需求 将前台传入的字符串数据转为int类型. 操作 在pom.xml中添加引用. <dependency> <groupId>org.apache.commons</gr ...
- Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)
一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十九):推送avro格式数据到topic,并使用spark structured streaming接收topic解析avro数据
推送avro格式数据到topic 源代码:https://github.com/Neuw84/structured-streaming-avro-demo/blob/master/src/main/j ...
随机推荐
- MySQL 表之间的关系
表之间的关系 # 定义一张部门员工表 emp id name gander dep_name dep_desc 1 ming male 教学部 教书 2 lilei male 教学部 教书 3 ham ...
- [Dart] Capture and Handle Data Sequences with Streams in Dart
Streams represent a sequence of asynchronous events. Each event is either a data event, also called ...
- win32通用控件
1.标准控件 可以在win32窗口程序中添加资源脚本来给程序添加标准控件: 具体操作为:新建资源脚本 ->在.rc文件中添加控件 ->给控件绑定事件: 常用的标准控件: ...
- List集合类
1.1: List.add方法——向集合列表中添加对象 public static void main(String[] args) { List<String> list=new Ar ...
- CF1174F Ehab and the Big Finale(交互+剖分)
做法 \(x\)为隐藏节点,\(dep_x=d(1,x)\) \((1)\):\(u=1\) \((2)\):重链剖分,比如\(v\)为\(u\)的重链底部,查询\(dis(x,v)\)的长度,\(y ...
- BZOJ4237稻草人——单调栈+CDQ分治
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- Facebook开源时间序列内存数据库Beringei,追求极致压缩率——如果是int根据大多数时间序列中的值与相邻数据点相比并没有显著的变化,只要使用XOR将当前值与先前值进行比较,然后存储发生变化的比特。最终,该算法将整个数据集至少压缩了90%
转自:http://www.infoq.com/cn/news/2017/02/Facebook-Beringei 2017年2月3日,Facebook宣布将开源他们的高性能时序数据存储引擎Berin ...
- Lucene4.2源码解析之fdt和fdx文件的读写——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压
前言 通常在搜索打分完毕后,IndexSearcher会返回一个docID序列,但是仅仅有docID我们是无法看到存储在索引中的document,这时候就需要通过docID来得到完整Document信 ...
- Apache Flink - 内存管理
JVM: JAVA本身提供了垃圾回收机制来实现内存管理 现今的GC(如Java和.NET)使用分代收集(generation collection),依照对象存活时间的长短使用不同的垃圾收集算法,以达 ...
- 使用python3安装frida-tools出错
执行安装命令 pip3.6 install frida-tools 得到错误信息 error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] c ...