C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼
异步
相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:
服务器:
1、 开启侦听接口
private TcpListener listener; //监听类
listener = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));
listener.Start();//开启侦听,对连接的客户端的数目没有限制
或者
listener.Start(int i);// 开启侦听,最多只能连接i个客户端数目
2、 接收客户端
listener.BeginAcceptSocket(clientConnect, listener);//异步接受客户端的连接请求 clientConnect为连接的回调函数
///
/// 接收回调函数
///
///
private void clientConnect(IAsyncResult ar)
{
try
{
TcpListener listener = (TcpListener)ar.AsyncState;
//接受客户的连接,得到连接的Socket
Socket client = listener.EndAcceptSocket(ar);
}
catch { }
}
3、 接收客户端发送的数据
///
/// 异步接收数据
///
private void receiveData(Socket client)
{
// 调用异步方法 BeginReceive 来告知 socket 如何接收数据
IAsyncResult iar = client.BeginReceive(buffer, 0, BagSize, SocketFlags.None, out errorCode, receiveCallback, buffer);
}
}
///
/// 接收数据回调函数
///
///
private void receiveCallback(IAsyncResult ar)
{
//接收到的数据长度.
int receLen = 0;
try
{
receLen = client.EndReceive(ar, out errorCode);
if (receLen > 0)
{
OnReceiveData(client);//接收到数据之后的处理函数
}
}
catch { }
}
else { }
}
4、接收成功之后,回发数据给客户端
///
/// 异步发送报文
///
///
private void OnReceiveData (Socket socket)
{
string strLogin = “succeed recived”;
byte[] data = Encoding.ASCII.GetBytes(strLogin);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, sendCallBack, socket);//异步发送数据
}
else
{ }
}
///
/// 异步发送回调事件
///
///
private void sendCallBack(IAsyncResult ar)
{
socket.EndSend(ar, out errorCode);
}
客户端
1、连接服务器
private TcpClient tcpcz = null
tcpcz = new TcpClient()
tcpcz.BeginConnect(ipaddress, Convert.ToInt32(port), new AsyncCallback(ConnectCallback), tcpcz);//根据服务器的IP地址和端口号 异步连接服务器
///
/// 异步连接的回调函数
///
///
private void ConnectCallback(IAsyncResult ar)
{
TcpClient t = (TcpClient)ar.AsyncState;
try
{
if (t.Connected)
{
t.EndConnect(ar);//函数运行到这里就说明连接成功
}
else
{
}
}
catch () { }
}
2、发送和接收字符串
NetworkStream stream = tcp.GetStream();//创建于服务器连接的数据流
//发送字符串
string strLogin = “this is socket example”;
byte[] data = Encoding.ASCII.GetBytes(strLogin);
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback),stream);//异步发送数据
//接收字符串
byte[] result = new byte[tcp.Available]; // tcp.Available为接受的字符串大小
try
{
stream.BeginRead(result, 0, result.Length, new AsyncCallback(ReadCallback), stream);//异步接受服务器回报的字符串
}
catch { }
string strResponse = Encoding.ASCII.GetString(result).Trim();//从服务器接受到的字符串
}
}
catch ()
{
}
}
C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼的更多相关文章
- C# Socket的TCP通讯
Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...
- [C#]手把手教你打造Socket的TCP通讯连接(一)
本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ...
- python socket 模拟tcp通讯
对于tcp server 端的创建而言, 分为如下步骤: 1,创建socket对象(socket):其中俩个参数分别为 Address Family(如AF_INET为ipv4),AF_I ...
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
- 【socket】TCP 和 UDP 在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
- boost asio 异步实现tcp通讯
---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简 ...
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
- socket(TCP)通讯之Python实现
1.Service address = ('localhost', 9102) # AF_INET = ipv4; SOCK_STREAM:TCP s = socket.socket(socket.A ...
- 使用SOCKET实现TCP/IP协议的通讯
一.原理: 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈 ...
随机推荐
- Codeforces Round #256 (Div. 2) B Suffix Structures
Description Bizon the Champion isn't just a bison. He also is a favorite of the "Bizons" t ...
- 飞雪桌面日历软件 V8.6 免费绿色版
软件名称: 飞雪桌面日历软件软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP / Win2008软件大小: 4MB图片预览: 软件简介: ...
- F - 娜娜梦游仙境系列——多民族王国
F - 娜娜梦游仙境系列——多民族王国 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- 对方网络ping不通
后台接口往往部署在其他服务器上如果ping不同 很大可能是因为对方开防火墙的原因 解决方法:控制面板-windows防火墙-打开或关闭windows防火墙
- 进入BIOS SHELL DUMP 命令
LINUX系统 进入SHELL 输入命令 fs1: or fs0: 就进入了U盘目录 然后输入 ACPIRW.efi -d -s dsdt.bat 就会产生结果到U盘 ——————————————— ...
- 利用NSURLSession完成的断点续传功能
首先是业务中的.h文件 #import <UIKit/UIKit.h> #import "DenglSingleton.h" @protocol DownLoadVCd ...
- do-while循环判断成绩的有效输入
#include "stdio.h" void main() { int score; do { printf("请输入你的成绩(0-100):"); scan ...
- Ip 讲解
IP地址分类以及C类IP地址的子网划分 国际规定:把所有的IP地址划分为 A,B,C,D,E A类地址:范围从0-127,0是保留的并且表示所有IP地址,而127也是保留的地址,并且是用于测试环回用的 ...
- zencart低版本由php5.2.17升级PHP5.3环境下错误及解决方案
方法:有错误或者空白先打开错误提示,ftp看cache错误日志 或者 面板查看错误日志,再对比数据库是否正确,可拿脚本看是否能连接 \cp -r backipmysql/nlbarb_007li/ ...
- 第十九节,基本数据类型,集合set
集合set,无序,是不允许重复内容的,也就是不允许重复元素,如果有重复,会自动忽略,可接收可迭代类型 (一般用于需要判断和处理交集时候用到) 集合与字典的区别是,集合没有键只有值,字典是有键的字典是一 ...