您的位置:首页 > 理论基础 > 计算机网络

Tcp异步接收发送

2010-03-23 16:12 239 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Xml;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Data.SqlClient;
namespace MiData
{
public partial class Form1 : Form
{
delegate void SetTextCallBack(string msg,string type);
private event SetTextCallBack doSetText;
Thread _acceptWorkThread = null;
Socket _listener = null;
bool _isListener = true;
int OnlineSum = 0;
private void CallBack(string msg,string type)
{
if (doSetText!=null)
{
doSetText(msg,type);
}
}
private void SetText(string msg,string type)
{
if (lbMessage.InvokeRequired)
{
Invoke(new SetTextCallBack(SetText), new object[] { msg,type });
}
else
{
if (type=="sum")
{
this.lbOnLine.Text = msg;
}
else if (type=="msg")
{

this.lbMessage.AppendText(msg+"/r/n");
}
}
}
public Form1()
{
InitializeComponent();
doSetText += SetText;
}
/// <summary>
/// 启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
_isListener = true;
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 8988);
_listener.Bind(localEP);
_listener.Listen(100);
_acceptWorkThread = new Thread(AcceptWorkThread);
_acceptWorkThread.Start();
}
/// <summary>
/// 侦听
/// </summary>
private void AcceptWorkThread()
{
while (_isListener)
{
UserInfo info = new UserInfo();//这个UserInfo是用来保存客户信息的。
Socket socket = _listener.Accept();
info.socket = socket;
CallBack((++OnlineSum).ToString(), "sum");
//这里进行其它处理。
socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ReceiveCallBack, info);//这里向系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数
}
}
/// <summary>
/// 收到连接回调函数
/// </summary>
/// <param name="ar"></param>
private void ReceiveCallBack(IAsyncResult ar)
{
UserInfo info = (UserInfo)ar.AsyncState;
Socket handler = info.socket;
int readCount = 0;
try
{
readCount = handler.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。
}
catch (SocketException)//出现Socket异常就关闭连接
{
CloseSocket(info);//这个函数用来关闭客户端连接
return;
}
catch
{
}
if (readCount > 0)
{
byte[] buffer = new byte[readCount];
Buffer.BlockCopy(info.Buffer, 0, buffer, 0, readCount);
Analyzer(info, buffer);//这个函数用来处理接收到的信息。
try
{
handler.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);//向系统投递下一个接收请求
}
catch (SocketException) //出现Socket异常就关闭连接
{
CloseSocket(info);
}
catch
{
}
}
else //如果接收到0字节的数据说明客户端关闭了Socket,那我们也要关闭Socket
{
CloseSocket(info);
}
}
/// <summary>
/// 断开连接
/// </summary>
/// <param name="info"></param>
private void CloseSocket(UserInfo info)
{
info.socket.Shutdown(SocketShutdown.Both);
info.socket.Close();
CallBack((--OnlineSum).ToString(),"sum");
}
/// <summary>
/// 收到信息后的操作
/// </summary>
/// <param name="info"></param>
/// <param name="buff"></param>
private void Analyzer(UserInfo info, byte[] buff)
{
string sql = Encoding.Default.GetString(buff);
Console.WriteLine(sql);
CallBack(sql,"msg");
DataTable dt = GetDataTableBySql(sql);
Send(info, Encoding.Default.GetBytes(ConvertBetweenDataTableAndXML_AX(dt)));
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="info"></param>
/// <param name="message"></param>
private void Send(UserInfo info, byte[] message)
{
try
{
info.socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), info);//这里向系统投递一个发送数据的请求,并指定一个回调函数。
}
catch (SocketException ex)
{
CloseSocket(info);
}
catch
{
}
}
/// <summary>
/// 发送数据回调函数
/// </summary>
/// <param name="ar"></param>
private void SendCallBack(IAsyncResult ar)
{
UserInfo info = (UserInfo)ar.AsyncState;
try
{
info.socket.EndSend(ar);//调用这个函数来结束本次发送。
}
catch
{
}
}
/// <summary>
/// 查找数据
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable GetDataTableBySql(string sql)
{
return DBHelper.GetDataTable(sql);
}
/// <summary>
/// DataTable转XML
/// </summary>
/// <param name="dtNeedCoveret"></param>
/// <returns></returns>
public static string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedCoveret)
{
System.IO.TextWriter tw = new System.IO.StringWriter();
dtNeedCoveret.TableName = dtNeedCoveret.TableName.Length == 0 ? "Table_AX" : dtNeedCoveret.TableName;
dtNeedCoveret.WriteXml(tw);
dtNeedCoveret.WriteXmlSchema(tw);
return tw.ToString();
}
/// <summary>
/// 停止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
_acceptWorkThread.Abort();
_isListener = false;
try
{
_listener.Shutdown(SocketShutdown.Both);
}
catch { }
try
{
_listener.Close();
}
catch{}
this.btnStart.Enabled = true;
this.btnStop.Enabled = false;
CallBack("0","sum");
}
}
/// <summary>
/// 客户信息
/// </summary>
class UserInfo
{
public Socket socket;
public byte[] Buffer = new byte[2046];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: