Server:
public partial class MainForm : Form
{
//这里的PonySocket.Helper是我自定义的类,其中类中有Socket类型,string类型的属性,表示客户端连接的项,byte[]类型的属性,表示接收到的消息
Dictionary<string,PonySocket.Helper> dicsoc = new Dictionary<string,PonySocket.Helper>();
//timer判断是否有连接断开
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
int Port = 8000;
//定义一个委托,唤醒线程外控件的状态
delegate void SetSaft(string text);
ArrayList conList = new ArrayList();
//确定编码
Encoding UTF8 = Encoding.UTF8;
Encoding GB2312 = Encoding.GetEncoding("GB2312");
public MainForm()
{
InitializeComponent();
this.timer.Interval = 2000;
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
foreach (string key in dicsoc.Keys)
{
if (dicsoc[key].ChatSocket.Connected == false)
{
DelList(dicsoc[key].Item);
}
}
}
private void AddList(object text)
{
//判断对方控件是否调用了invoke方法
if (this.listBox1.InvokeRequired)
{
SetSaft d = new SetSaft(AddList);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Add(text);
}
}
private void DelList(object text)
{
if (this.listBox1.InvokeRequired)
{
SetSaft d = new SetSaft(DelList);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Remove(text);
}
}
private void 开始服务ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.timer.Start();
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint end = new IPEndPoint(IPAddress.Any, Port);
socket.Bind(end);
socket.Listen(10);//挂起连接队列的最大长度,根据操作系统而定
socket.BeginAccept(new AsyncCallback(Accept), socket);
}
void Accept(IAsyncResult ar)
{
//获取用户定义的对象
Socket socket = ar.AsyncState as Socket;
//存储异步操作的信息,以及用户自定义的数据
Socket worker = socket.EndAccept(ar);
string serverEndpoint = "欢迎登录服务器:" + worker.LocalEndPoint.ToString();
byte[] bgb = GB2312.GetBytes(serverEndpoint);
byte[] buffer = Encoding.Convert(GB2312, UTF8, bgb);
//发送给客户端
worker.Send(buffer);
//将客户端信息加在列表中
string rpoint = worker.RemoteEndPoint.ToString();
AddList(rpoint);
PonySocket.Helper hh = new PonySocket.Helper(worker, buffer);
dicsoc.Add(rpoint, hh);
hh.Item = rpoint;
socket.BeginAccept(new AsyncCallback(Accept), socket);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), hh);
}
void Receive(IAsyncResult ar)
{
PonySocket.Helper h = ar.AsyncState as PonySocket.Helper;
try
{
int c = h.ChatSocket.EndReceive(ar);
h.ChatSocket.BeginReceive(h.MsgByte, 0, h.MsgByte.Length, SocketFlags.None, new AsyncCallback(Receive), h);
string RemoPort= h.ChatSocket.RemoteEndPoint.ToString();
string recivemsg = UTF8.GetString(h.MsgByte, 0, c);
}
catch
{
//nothing to do here!
}
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
foreach (Socket o in conList)
{
o.Shutdown(SocketShutdown.Both);
o.Close();
}
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
Application.Exit();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
foreach (Socket o in conList)
{
o.Shutdown(SocketShutdown.Both);
o.Close();
}
}
catch(SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
}
客户端
public partial class MainForm : Form
{
Socket client = null;
public string IP = null;//表示要连接的服务器IP
private int Port = 8000;
Encoding UF8 = Encoding.UTF8;
Encoding GB2312 = Encoding.GetEncoding("GB2312");
delegate void SetSafe(string text);
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint end = new IPEndPoint(IPAddress.Parse("192.168.253.195"), Port);
try
{
client.Connect(end);
byte[] buffer = new byte[1024];
PonySocket.Helper helper = new PonySocket.Helper(client, buffer);
client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(Receive),helper);
this.btnSend.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void Receive(IAsyncResult ar)
{
PonySocket.Helper h = ar.AsyncState as PonySocket.Helper;
string ufstr = null;
try
{
int c = client.EndReceive(ar);
//递归的接收数据
h.ChatSocket.BeginReceive(h.MsgByte, 0, h.MsgByte.Length, SocketFlags.None, new AsyncCallback(Receive), h);
ufstr = UF8.GetString(h.MsgByte, 0, c);
SetText(ufstr);
}
catch
{
ufstr = "服务器已经关闭或者其他原因导致连接不到服务器……";
SetText(ufstr);
this.btnSend.Enabled = false;
}
}
void SetText(string text)
{
//获取一个值,该值指示调用对控件进行方法调用时,必须调用Invoke方法,因为调用方位于控件线程以外的线程中
if (this.label1.InvokeRequired)
{
SetSafe d = new SetSafe(SetText);
this.label1.Invoke(d, new object[] { text });
}
else
{
this.label1.Text = text;
}
}
private void SendMsg_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(this.textBox1.Text))
{
byte[] buffer = UF8.GetBytes(this.textBox1.Text);
PonySocket.Helper h = new PonySocket.Helper(client, buffer);
client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendMsg), h);
}
else
{
MessageBox.Show("发送的内容不能为空!");
}
}
void SendMsg(IAsyncResult ar)
{
PonySocket.Helper h = ar.AsyncState as PonySocket.Helper;
client.EndSend(ar);
}
}