异步Socket通信总结[转]
服务端(异步):
using System.Net ;
using System.Net.Sockets ;
using System.IO ;
using System.Text ;
using System.Threading ;
public static ManualResetEvent allDone = new ManualResetEvent(false);
private Thread th;
private bool listenerRun = true ;
Socket listener;
private const int MAX_SOCKET=10;
protected override void Dispose( bool disposing )
{
try
{
listenerRun = false ;
th.Abort ( ) ;
th = null ;
listener.Close();
}
catch { }
}
//得到本机IP地址
//得到本机IP地址
public static IPAddress GetServerIP()
{
IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());
return ieh.AddressList[0];
}
//侦听方法
private void Listen()
{
try
{
int nPort=int.Parse(this.txtLocalPort.Text);
IPAddress ServerIp=GetServerIP();
IPEndPoint iep=new IPEndPoint(ServerIp,nPort);
listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
listener.Bind(iep);
listener.Listen(10);
statusBar1.Panels[0].Text ="端口:"+this.txtLocalPort.Text+"正在监听......";
while(listenerRun)
{
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
allDone.WaitOne();
}
}
catch (System.Security.SecurityException )
{
MessageBox.Show ("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
}
//异步回调函数
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client=listener.EndAccept(ar) ;
allDone.Set();
StateObject state = new StateObject();
state.workSocket = client;
//远端信息
EndPoint tempRemoteEP = client.RemoteEndPoint;
IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;
string rempip=tempRemoteIP.Address.ToString();
string remoport=tempRemoteIP.Port.ToString();
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;
string HostName = host.HostName;
statusBar1.Panels[1].Text ="接受["+HostName+"] "+rempip+":"+remoport+"远程计算机正确连接!" ;
this.listboxRemohost.Items.Add("["+HostName+"] "+rempip+":"+remoport);
client.BeginReceive( state.buffer,0, StateObject.BufferSize, 0,
new AsyncCallback(readCallback), state);
}
//异步接收回调函数
public void readCallback(IAsyncResult ar)
{
StateObject state = (StateObject) ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
string strmsg=Encoding.ASCII.GetString(state.buffer,0,bytesRead);
state.sb.Append(strmsg);
string content = state.sb.ToString();
//远端信息
EndPoint tempRemoteEP = handler.RemoteEndPoint;
IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;
string rempip=tempRemoteIP.Address.ToString();
string remoport=tempRemoteIP.Port.ToString();
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;
string HostName = host.HostName;
statusBar1.Panels[1].Text ="正在接收["+HostName+"] "+rempip+":"+remoport+"的信息..." ;
string time = DateTime.Now.ToString ();
listboxRecv.Items.Add("("+time+") "+HostName+":");
listboxRecv.Items.Add(strmsg) ;
if(content.IndexOf("\x99\x99")> -1)
{
statusBar1.Panels[1].Text ="信息接收完毕!" ;
//
//接收到完整的信息
// MessageBox.Show("接收到:"+content);
string msg=poweryd.CodeParse(content);
Send(handler,msg);//异步发送
// Send(content);//用单独的socket发送
}
else
{
handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,
new AsyncCallback(readCallback), state);
}
}
}
//异步发送
private void Send(Socket handler, String data)
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);
// handler.Send(byteData);
}
#region //用单独的socket发送
private void Send(string data)
{
// string ip=this.txtRemoIP.Text;
// string port=this.txtRemoport.Text;
// IPAddress serverIp=IPAddress.Parse(ip);
// int serverPort=Convert.ToInt32(port);
// IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
// Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// socket.Connect(iep);
// byte[] byteMessage=Encoding.ASCII.GetBytes(data);
// socket.Send(byteMessage);
// socket.Shutdown(SocketShutdown.Both);
// socket.Close();
}
#endregion
//异步发送回调函数
//异步发送回调函数
private static void SendCallback(IAsyncResult ar)
{
try
{
Socket handler = (Socket) ar.AsyncState;
int bytesSent = handler.EndSend(ar);
MessageBox.Show("发送成功!");
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnListen_Click(object sender, System.EventArgs e)
{
th = new Thread (new ThreadStart(Listen));//以Listen过程来初始化线程实例
th.Start();//启动此线程
this.btnListen.Enabled=false;
}
private void btnClosenet_Click(object sender, System.EventArgs e)
{
try
{
listenerRun = false ;
th.Abort ( ) ;
th = null ;
listener.Close();
statusBar1.Panels[0].Text= "与客户端断开连接!";
statusBar1.Panels[1].Text= "";
}
catch
{
MessageBox.Show("连接尚未建立,断开无效!","警告");
}
}
private void btnExit_Click(object sender, System.EventArgs e)
{
try
{
listenerRun = false ;
th.Abort ( ) ;
th = null ;
listener.Close();
statusBar1.Panels[0].Text= "与客户端断开连接!";
statusBar1.Panels[1].Text= "";
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
Application.Exit();
}
}
//异步传递的状态对象
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 1024;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
客户端(同步发送并接收):
using System.Net ;
using System.Net.Sockets ;
using System.IO ;
using System.Text ;
using System.Threading ;
Socket socket;
int numbyte=1024;//一次接收到的字节数
private void btnConnect_Click(object sender, System.EventArgs e)
{
try
{
string ip=this.txtRemoIP.Text;
string port=this.txtRemoport.Text;
IPAddress serverIp=IPAddress.Parse(ip);
int serverPort=Convert.ToInt32(port);
IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
IPHostEntry host = Dns.GetHostByAddress(iep.Address ) ;
string HostName = host.HostName;
socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Connect(iep);
IPEndPoint tempRemoteIP=( IPEndPoint )socket.LocalEndPoint;
statusBar1.Panels[0].Text ="端口:"+tempRemoteIP.Port.ToString()+"正在监听......";
statusBar1.Panels[1].Text ="与远程计算机["+HostName+"] "+ip+":"+port+"建立连接!" ;
}
catch
{
statusBar1.Panels[0].Text = "无法连接到目标计算机!";
}
#region
// byteMessage=Encoding.ASCII.GetBytes(textBox1.Text+"99");
// socket.Send(byteMessage);
// byte[] bytes = new byte[1024];
// socket.Receive(bytes);
// string str=Encoding.Default.GetString(bytes);
// MessageBox.Show("接收到:"+str);
// socket.Shutdown(SocketShutdown.Both);
// socket.Close();
#endregion
}
private void btnSend_Click(object sender, System.EventArgs e)
{
try
{
statusBar1.Panels[1].Text ="正在发送信息!" ;
string message=this.txtsend.Text;
SendInfo(message);
}
catch //异常处理
{
statusBar1.Panels[0].Text = "无法发送信息到目标计算机!";
}
}
private void SendInfo(string message)
{
#region
// string ip=this.txtip.Text;
// string port=this.txtport.Text;
//
// IPAddress serverIp=IPAddress.Parse(ip);
// int serverPort=Convert.ToInt32(port);
// IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
// byte[] byteMessage;
//
// socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// socket.Connect(iep);
#endregion
byte[] byteMessage=Encoding.ASCII.GetBytes(message+"\x99\x99");
socket.Send(byteMessage);
//远端信息
EndPoint tempRemoteEP = socket.RemoteEndPoint;
IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;
string rempip=tempRemoteIP.Address.ToString();
string remoport=tempRemoteIP.Port.ToString();
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;
string HostName = host.HostName;
//发送信息
string time1 = DateTime.Now.ToString();
listboxsend.Items.Add ("("+ time1 +") "+ HostName +":");
listboxsend.Items.Add (message ) ;
//发送完了,直接接收
StringBuilder sb = new StringBuilder();
while(true)
{
statusBar1.Panels[1].Text ="正在等待接收信息..." ;
byte[] bytes = new byte[numbyte];
int recvbytes=socket.Receive(bytes);
string strmsg=Encoding.Default.GetString(bytes);
string time2 = DateTime.Now.ToString();
listboxRecv.Items.Add("("+time2+") "+HostName+":");
listboxRecv.Items.Add (strmsg) ;
sb.Append(strmsg);
if(sb.ToString().IndexOf("\x99\x99")>-1)
{
break;
}
}
statusBar1.Panels[1].Text ="接收信息完毕!" ;
//
//代码解码
CodeParse(sb.ToString());
//
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
http://www.cnblogs.com/saptechnique/archive/2011/12/21/2295862.html
异步Socket通信总结[转]相关推荐
- JAVA基础知识之网络编程——-基于AIO的异步Socket通信
异步IO 下面摘子李刚的<疯狂JAVA讲义> 按照POSIX标准来划分IO,分为同步IO和异步IO.对于IO操作分为两步,1)程序发出IO请求. 2)完成实际的IO操作. 阻塞IO和非阻塞 ...
- java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信
AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO 核心类有AsynchronousSocketChannel .Asynchron ...
- python异步socket接收_Python简易聊天工具-基于异步Socket通信
#-*- coding: UTF-8 -*- from asyncore import dispatcher from asynchat import async_chat import asynco ...
- C#和Python的Socket通信
目录 1.项目说明 2.Socket通信 2.1C#实现socket通信 2.2python实现socket通信 3.结果 3.1C#socket通信结果 3.2python和C# socket通信结 ...
- C# Socket系列三 socket通信的封包和拆包
通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Mai ...
- .net平台下C#socket通信(上)
.net平台下C#socket通信(上) 完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈. 在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,当然有基础的可以跳 ...
- Socket通信总结(附C++实现)
Socket通信总结(附C++实现) 2012年08月16日 ⁄ C++⁄ 共 5870字 ⁄ 评论数 1 ⁄ 被围观 10,061+ 分享到: 文章目录 [隐藏] 一.Socket是什么 二.一些基 ...
- android的NDK和java进行本地socket通信
关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过<android使用socket使底层和framework通信>这篇文章,美中不足的是作者只贴 ...
- connect: 网络不可达_Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
本文转自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
最新文章
- 谷歌人为干预搜索结果被曝光:增加大公司曝光,主动营造岁月静好
- Linux网络环境配置
- JUnit 测试含有控制台输入的方法
- jQuery.validate.js API
- (Head First 设计模式)学习笔记(1)
- C++实现另一个猜数字游戏
- 「leetcode」257. 二叉树的所有路径(详解)
- 【Python-numpy】输出array时array中间是省略号而没有输出全部内容
- 拓端tecdat|R语言中绘制箱形图的替代品:蜂群图和小提琴图
- 京东助手+淘宝试用助手+苏宁试用助手软件
- 虚拟偶像养成记:人工智能人格化与IP化打造出完美“爱豆”
- com.android.packageinstaller,Android PackageInstaller 安装和卸载
- ERROR: HHH000388: Unsuccessful: create table
- windows许可证即将过期 win10的解决办法
- WIN11添加我的电脑图标等的方法
- 李宏毅机器学习之RNN
- VS code 安装Source Code Pro字体
- nancy中的身份验证
- CKEditor和CKFinder及CKEditor配置属性说明
- html图片合成视频,将视频和图片合成到一个页面
热门文章
- android 导入离线地图,Android, 离线地图-2
- java 采集rtsp_通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口步骤概览
- 神策用户画像 2 大功能:千人千面,一人千面,一次给你
- 周四话分析:数据驱动,如何塑造下一个“教育领头羊”?
- zookeeper(一):功能和原理
- 微软发布 Microsoft SoftGrid 4.1 SP1 及 4.2 累计更新补丁
- C语言实现小时候经常做的智力测试题
- oracle时间用法
- SQL Server中利用存储过程来高性能地进行分页
- it is important to delete your email mailbox in a frequent manner!