socket 异步 发送 接收 数据
Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //侦听socket
//socketClints.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socketClints.Bind(new IPEndPoint(IPAddress.Any, portSocketInt)); socketClints.Listen();
socketClints.BeginAccept(new AsyncCallback(ClientAccepted), socketClints); //开始接收来自浏览器的http请求(其实是socket连接请求)
#region 客户端连接成功
byte[] buffer = new byte[];
/// <summary>
/// 客户端连接成功
/// </summary>
/// <param name="ar"></param>
public void ClientAccepted(IAsyncResult ar)
{
#region
var socket = ar.AsyncState as Socket;
//这就是客户端的Socket实例,我们后续可以将其保存起来
var client = socket.EndAccept(ar);
//接收客户端的消息(这个和在客户端实现的方式是一样的)异步
client.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//准备接受下一个客户端请求(异步)
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
#endregion
}
#endregion
#region 接收客户端的信息
/// <summary>
/// 接收某一个客户端的消息
/// </summary>
/// <param name="ar"></param>
public void ReceiveMessage(IAsyncResult ar)
{
int length = ;
var socket = ar.AsyncState as Socket;
//客户端IP地址和端口信息
try
{
#region
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
length = socket.EndReceive(ar);
//读取出来消息内容
string recv_request = Encoding.UTF8.GetString(buffer, , length);
//输出接收信息
//WriteLine(clientipe + " :" + message, ConsoleColor.White);
//消息处理
socketResolve(recv_request, socket);
//服务器发送消息
//socket.Send(Encoding.UTF8.GetBytes("server received data")); //默认Unicode
//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息)异步
socket.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
#endregion
}
catch
{
//设置计数器
}
}
//发送方法 需要修改数据
public void sendData()
{
byte[] data=System.Text.Encoding.UTF8.GetBytes(Encrypt(txt,sKey));
byte[] byLen = BitConverter.GetBytes(data.Length);
socket.Send(byLen);
//socket.Send();
socket.Send(data);
}
#endregion
客户端:
ThStartBool=true;
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
while (ThStartBool)
{
try
{
newSocket.Connect(ip, int.Parse(port)); socketSend("url/" + obj.ToString() + "_OK/");
Invoke(updateLableText, "连接成功"); //ReceiveObject state = new ReceiveObject() { Client = newSocket };
//newSocket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), state);
newSocket.BeginReceive(m_byLen, 0, m_byLen.Length, SocketFlags.None, new AsyncCallback(RecvLen), newSocket); ThStartBool = false;
}
catch (Exception)
{ Thread.Sleep();//3秒后重新连接
}
}
int m_nIndex = 0, m_nRecvLen = 0;
byte[] m_byLen = new byte[4];
byte[] m_byData = null; private void RecvLen(IAsyncResult ar)
{
try
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar); m_nRecvLen += nLen;
if (m_nRecvLen != m_byLen.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
m_byData = new byte[BitConverter.ToUInt32(m_byLen, 0)];
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock); }
} catch (Exception ex)
{
Invoke(updateLableText, "与服务器失去联系,正在尝试重连");
ThStartBool = true;
th = new Thread(new ParameterizedThreadStart(ThStartData));
th.Start(signID);
}
} private void RecvData(IAsyncResult ar)
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar);
m_nRecvLen += nLen;
if (m_nRecvLen != m_byData.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
//MessageBox.Show(Encoding.UTF8.GetString(m_byData));
string sKey = signID.Substring(2, 3) + signID.Substring(5, 3) + signID.Substring(10, 2);
//读取出来消息内容
var message = Encoding.UTF8.GetString(m_byData);
dataParsing(Decrypt(message.ToString(), sKey));
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
}
socket 异步 发送 接收 数据的更多相关文章
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程? 详细代码介 ...
- Socket异步发送的同步控制
在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...
- 网络编程--使用UDP发送接收数据
package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...
- 网络编程--使用TCP协议发送接收数据
package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...
- C# Socket模拟发送接收
Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...
- Http批量异步发送和数据保存
先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...
- linux系统中使用socket直接发送ARP数据
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...
随机推荐
- DES、AES和RSA加密算法
DES加密算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一(它是分组密码). 强加密使用的基本操作 -> 混淆与扩散 混淆:是一种使密钥与密文之间 ...
- PHP中的接口
对象接口 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容. 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方 ...
- .Net Core 中使用NLog作为日志中间件
⒈安装相关依赖 NLog NLog.Web.AspNetCore ⒉在项目的根目录中创建NLog配置文件 <?xml version="1.0" encoding=" ...
- MateBook 换内存条
欢迎关注微信公众号:猫的尾巴有墨水 为啥要拆MateBook D笔记本? 最近这个Windows 10更新后,内存暴增,每次禁用windows update和同步服务模块后,依然不能彻底解决内存爆炸的 ...
- linux centos 安装mongoDB
1.下载mongoDB 例如下载3.2.19 64位版本 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.19.tgz ...
- luogu P3620 [APIO/CTSC 2007]数据备份
luogu 首先如果一条线不是了连接的相邻两个位置一定不优,把它拆成若干连接相邻位置的线.所以现在问题是有\(n\)个物品,选\(k\)个,要求选的位置不能相邻,求最小总和 如果没有选的位置不能相邻这 ...
- css之盒模型(box,box-shadow,overflow,BFC)
一.盒模型的概念 CSS中每一个元素都是一个盒模型(Box Model),包括HTML和body标签元素.一般称之为box model.它的本质就是一个盒子,它的属性有margin,border,pa ...
- 帝国cms 重置用户名和密码
5.1至7.0版本:用phpmyadmin修改phome_enewsuser表里的记录:把password字段的值设为:“322d3fef02fc39251436cb4522d29a71”:把salt ...
- 基于nginx与Tomcat实现负载均衡
server1:192.168.200.113(nginx服务端) server2:192.168.200.111(Tomcat服务端) server1中nginx的配置文件 nginx.conf h ...
- deep_learning_Function_tf.control_dependencies([])
tf.control_dependencies([])函数含义及使用 2019.02.23 14:01:14字数 60阅读 420 tf.control_dependencies([controls_ ...