服务器端
public partial class ServerFrm :Form, CRM.IPlugin.IVote
{
public ServerFrm()
{
InitializeComponent();
}
private void ServerFrm_Load(object sender, EventArgs e)
{
this.Text = "服务器端";
chatContent.ScrollToCaret();
}
#region 插件接口
public string GetPluginName()
{
return "服务器端";
}
public void SetUp()
{
FormCollection formCollection = Application.OpenForms;
if (formCollection[this.Name] != null)
{
(formCollection[this.Name] as Form).WindowState = FormWindowState.Normal;
(formCollection[this.Name] as Form).Focus();
(formCollection[this.Name] as Form).IsMdiContainer = false;
this.Dispose();
}
else
{
this.Show();
}
}
#endregion
/// <summary>
/// 负责监听客户端的线程
/// </summary>
Thread threadWatch = null;
/// <summary>
/// 负责监听客户端的套接字
/// </summary>
Socket socketWatch = null;
/// <summary>
/// 负责和客户端通信的套接字
/// </summary>
Socket clientConnection = null;
public delegate void delegateShow();
public delegate void DelegateShow(string msg);
/// <summary>
/// 开始监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("监听IP地址不能为空");
return;
}
if (string.IsNullOrEmpty(textBox2.Text.Trim()))
{
MessageBox.Show("监听端口不能为空");
return;
}
// 一个套接字用于监听客户端发来的消息,包含三个参数(ipv4寻址协议,流式连接,tcp协议)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 服务端发送消息需要一个ip地址和端口号
IPAddress ip = IPAddress.Parse(textBox1.Text);
// 把ip地址和端口号绑定在网路节点endport上
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(textBox2.Text));
// 监听绑定的网路节点
socketWatch.Bind(endPoint);
// 将套接字的监听队列长度设置限制为0,0表示无限
socketWatch.Listen(0);
// 创建一个监听线程
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
//threadWatch.Name = "监听线程";
threadWatch.Start();
chatContent.AppendText("成功启动监听!"+ "\r\n");
}
/// <summary>
/// 接收客户端发来的请求
/// </summary>
private void WatchConnecting()
{
while (true)
{
//持续不断监听客户端发来的请求
clientConnection = socketWatch.Accept();
//这里使用委托,因为在一个线程中使用控件的时候,因为.net的安全机制,会出现问题。因此使用一个委托去使用这个控件。
delegateShow @delegate = new delegateShow(ContextShow);
///Todo .....
///
chatContent.Invoke(@delegate);
//创建一个通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(acceptMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
thr.Start(clientConnection);
}
}
private void ContextShow()
{
chatContent.AppendText("客户端连接成功" +A+ "\r\n");
}
//delegate void Action2<in T>(T t);
private void acceptMsg(object socket)
{
Socket socketServer = socket as Socket;
while (true)
{
//创建一个内存缓冲区 其大小为1024*1024字节 即1M
byte[] recMsg = new byte[1024*1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
int length = socketServer.Receive(recMsg);
string a= socketServer.RemoteEndPoint.ToString();
//将机器接受到的字节数组转换为人可以读懂的字符串
string msg = Encoding.UTF8.GetString(recMsg, 0, length) +"\r\n"+ a;
//chatContent.AppendText("客户端:" + GetCurrentTime() + msg + "\r" + "\r\n");
DelegateShow @delegate = new DelegateShow(chatContentShow);
chatContent.Invoke(@delegate, msg);
}
}
private void chatContentShow(string msg)
{
chatContent.AppendText("客户端:" + GetCurrentTime()+"\r" + msg + "\r\n");
}
/// <summary>
/// 获取系统当前时间
/// </summary>
/// <returns></returns>
private DateTime GetCurrentTime()
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
/// <summary>
/// 向客户端发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
byte[] sendMsg = Encoding.UTF8.GetBytes(richTextBox2.Text);
string msg = Encoding.UTF8.GetString(sendMsg);
clientConnection.Send(sendMsg);
chatContent.AppendText("服务器:" + GetCurrentTime() + "\r" + msg+"\r\n");
}
}
-
客户端
public partial class ClientFrm : Form,CRM.IPlugin.IVote
{
public ClientFrm()
{
InitializeComponent();
}
#region 插件接口
public string GetPluginName()
{
return “客户端”;
}
public void SetUp()
{
FormCollection formCollection = Application.OpenForms;
if (formCollection[this.Name] != null)
{
(formCollection[this.Name] as Form).WindowState = FormWindowState.Normal;
(formCollection[this.Name] as Form).Focus();
(formCollection[this.Name] as Form).IsMdiContainer = false;
this.Dispose();
}
else
{
this.Show();
}
}
#endregionprivate void ClientFrm_Load(object sender, EventArgs e) { this.Text = "客户端"; chatContent.ScrollToCaret(); } /// <summary> /// 客户端套接字 /// </summary> Socket clientSocket = null; /// <summary> /// 监听服务端的进程 /// </summary> Thread threadServer = null; /// <summary> /// 由于.net的安全机制,需要在线程中使用插件,需要使用委托去调用插件。 /// </summary> /// <param name="Msg"></param> public delegate void DelegateShow(string Msg); private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("IP地址不能为空"); return; } if (string.IsNullOrEmpty(textBox2.Text)) { MessageBox.Show("端口号不能为空"); return; } clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress iP = IPAddress.Parse(textBox1.Text.Trim()); IPEndPoint endPoint = new IPEndPoint(iP,int.Parse(textBox2.Text.Trim())); try { //这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind clientSocket.Connect(endPoint); chatContent.AppendText("连接成功!"+GetCurrentTime()+"\r\n"); } catch (Exception ex) { chatContent.AppendText("连接失败!"); MessageBox.Show(ex.Message); return; } // 创建一个线程监听服务端发来的消息 threadServer = new Thread(recMsg); threadServer.IsBackground = true; threadServer.Start(); } /// <summary> /// 接收服务端发来的消息 /// </summary> private void recMsg() { while (true) { //定义一个1M的内存缓冲区 用于临时性存储接收到的信息 byte[] arrRecMsg = new byte[1024 * 1024]; int length = 0; try { //将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度 length= clientSocket.Receive(arrRecMsg); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } //将套接字获取到的字节数组转换为人可以看懂的字符串 string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length); DelegateShow @delegate = new DelegateShow(delegateShow); chatContent.Invoke(@delegate, strRecMsg); } } private void delegateShow(string Msg) { chatContent.AppendText("服务器端:" + GetCurrentTime()+"\r" + Msg + "\r\n"); } /// <summary> /// 获取系统当前时间 /// </summary> /// <returns></returns> private DateTime GetCurrentTime() { DateTime currentTime = new DateTime(); currentTime = DateTime.Now; return currentTime; } /// <summary> /// 发送消息到客户端 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { byte[] sendMsg = Encoding.UTF8.GetBytes(richTextBox2.Text.Trim()); string msg = Encoding.UTF8.GetString(sendMsg); clientSocket.Send(sendMsg); chatContent.AppendText("客户端:" + GetCurrentTime() +"\r"+ msg + "\r\n"); }