111,130
社区成员
发帖
与我相关
我的任务
分享
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥代理类型
public delegate void StreamReceiveHandler(string newId, Socket socket, byte[] data);
public delegate void StringReceiveHandler(string newId, Socket socket, string str);
public delegate void SocketSendedHandler(string sendId, string message);
public delegate void SocketAcceptHandler(AsyncSocket newSocket);
public delegate void SocketClosedHandler(string socketId, string message);
public delegate void SocketListenedHandler(AsyncSocket socket, string message);
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥
public class AsyncSocket
{
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥事件变量
private StreamReceiveHandler onStreamData = null;
private StringReceiveHandler onStringData = null;
private SocketSendedHandler onSended = null;
private SocketSendedHandler onCasted = null;
private SocketAcceptHandler onAccept = null;
private SocketClosedHandler onClosed = null;
private SocketListenedHandler onListened = null;
private SocketListenedHandler onListenFailed = null;
private IPEndPoint m_obEndPoint;
private string m_stId = "";
private Socket m_socket = null;
#region 构造函数
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥构造函数
public AsyncSocket (AddressFamily af, SocketType st , ProtocolType pt){
m_socket = new Socket(af, st, pt);
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥重构函数
public AsyncSocket(Socket socket)
{
m_socket = socket;
m_stId = Guid.NewGuid().ToString();
}
#endregion
#region 回调函数
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥数据接收回调
private void ReceiveCallback(IAsyncResult ar)
{
try
{
//
SocketStateObject state = ar.AsyncState as SocketStateObject;
//读取数据
int bytesRead = m_socket.EndReceive(ar);
if (bytesRead > 0)
{
state.tempString.Append(UTF8Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
string str = state.tempString.ToString();
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥
if (str.Substring(str.Length - 1, 1) == "\0")
{
//接收完成
//激发事件
if (onStreamData != null)
onStreamData(m_stId, m_socket,UTF8Encoding.UTF8.GetBytes(str));
if (onStringData != null)
onStringData(m_stId, m_socket,str);
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥一轮接收完毕必须重设状态
state = new SocketStateObject(m_socket);
}
// Get the rest of the data.
m_socket.BeginReceive(state.buffer, 0,
SocketStateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(ID, se.Message);
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
}
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥连接接受回调
private void AcceptCallBack(IAsyncResult ar)
{
Socket handler = m_socket.EndAccept(ar);
AsyncSocket newSocket = new AsyncSocket(handler);
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥激发事件
if (null != onAccept)
{
onAccept(newSocket);
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥重新监听
m_socket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
}
#endregion
private const int Blength32 = 4;
private int m_intPos = 0;
private byte[] m_obTarget;
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥构造函数
public ByteArray(byte[] target)
{
m_obTarget = target;
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥
public int ReadInt()
{
byte[] bta = new byte[Blength32] { 0, 0, 0, 0 };
for (uint i = 0; i < 4; i++)
{
bta[i] = m_obTarget[m_intPos + i];
}
m_intPos += Blength32;
return BitConverter.ToInt32(bta,0);
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥
public string ReadUtf()
{
int length = this.ReadInt();
string str = Encoding.UTF8.GetString(m_obTarget, m_intPos, length);
m_intPos += length;
return str;
}
public partial class Form1 : Form
{
private int m_backLogLength = 10 ;
private AsyncSocket m_obSocket;
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥startOk
void m_obSocket_OnListened(AsyncSocket socket, string message)
{
Console.writeLine( "startOk" );
m_obSocket.OnAccept += new SocketAcceptHandler(m_obSocket_OnAccept);
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥accept
void m_obSocket_OnAccept(AsyncSocket newSocket)
{
newSocket.OnStreamReceived += new StreamReceiveHandler(newSocket_OnStreamReceived);
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥dataReceive
void newSocket_OnStreamReceived(string newId, Socket socket, byte[] data)
{
ByteArray bta = new ByteArray(data);//ByteArray类代码见下面
Console.writeLine(data.readInt().toString());//就这一句读出来的值不对
Console.writeLine(data.readUTF());
}
//∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥∥formLoad
private void Form1_Load(object sender, EventArgs e)
{
m_obSocket = new AsyncSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//
m_obSocket.OnListened += new SocketListenedHandler(m_obSocket_OnListened);
m_obSocket.OnListenFailed += new SocketListenedHandler(m_obSocket_OnListenFailed);
//
m_obSocket.Start("127.0.0.1", 1109, m_backLogLength);
}
byte[] bta1 = BitConverter.GetBytes(1001);
byte[] bta2 = BitConverter.GetBytes(0);
byte[] bta = Encoding.UTF8.GetBytes("dfdfdfdf\0");
Console.WriteLine(BitConverter.ToInt32(bta1, 0));
Console.WriteLine(BitConverter.ToInt32(bta2, 0));
Console.WriteLine(Encoding.UTF8.GetString(bta));