62,254
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
namespace client
{
class Client
{
private int port;
private Socket sock;
private const int BUFFERSIZE = 65535;
private byte[] buf;
private EndPoint server;
private EndPoint client;
private EndPoint EPTemp;
public delegate void DataCaptureHandler(string str);
public event DataCaptureHandler DataCaptrued, ClientCaptrued;
public Client(string serverip, int port)
{
server = (EndPoint)(new IPEndPoint(IPAddress.Parse(serverip), port));
buf = new byte[BUFFERSIZE];
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
int tempport = 5000;
while (true)
{
try
{
IPEndPoint MyServer = new IPEndPoint(IPAddress.Any, tempport);
sock.Bind(MyServer);
break;
}
catch
{
tempport++;
}
}
EPTemp = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
sock.BeginReceiveFrom(buf, 0, BUFFERSIZE, SocketFlags.None, ref EPTemp, new AsyncCallback(ReadCallback), null);
}
public void Send(string str)
{
if (client != null)
{
byte[] data = Encoding.ASCII.GetBytes(str);
sock.SendTo(data, data.Length, SocketFlags.None, client);
}
}
public void Send(byte[] data)
{
sock.SendTo(data, data.Length, SocketFlags.None, server);
}
private void ReadCallback(IAsyncResult ar)
{
try
{
int bytesRead = sock.EndReceiveFrom(ar, ref EPTemp);
if (bytesRead > 0)
{
this.Push(buf, 0, bytesRead);
sock.BeginReceiveFrom(buf, 0, BUFFERSIZE, SocketFlags.None, ref EPTemp, new AsyncCallback(ReadCallback), null);
}
else
{
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}
catch
{
throw new Exception("连接断开");
}
}
private void Push(byte[] buf, int p, int bytesRead)
{
if (EPTemp.Equals(server))
{
string str = Encoding.ASCII.GetString(buf, p, bytesRead);
if (ClientCaptrued != null)
{
ClientCaptrued("客户端IP:"+str);
}
string[] temp = Regex.Split(str.ToString(), ":");
client = (EndPoint)(new IPEndPoint(IPAddress.Parse(temp[0]), Convert.ToInt32(temp[1])));
return;
}
string str1 = Encoding.ASCII.GetString(buf, p, bytesRead);
if (DataCaptrued != null)
{
DataCaptrued(str1);
}
}
}
}