C#网络编程TCP通信实例程序简单设计
来源:互联网 发布:ees热力学计算软件 编辑:程序博客网 时间:2024/04/24 04:06
C#网络编程TCP通信实例程序简单设计
采用自带 TcpClient和TcpListener设计一个Tcp通信的例子
只实现了TCP通信
通信程序截图:
压力测试服务端截图:
俩个客户端链接服务端测试截图:
服务端:
客户端
运行动态图
C#程序设计代码
BenXHSocket.dll主要代码设计
SocketObject类
/***************************************************** * ProjectName: BenXHSocket * Description: * ClassName: SocketObject * CLRVersion: 4.0.30319.18408 * Author: JiYF * NameSpace: BenXHSocket * MachineName: JIYONGFEI * CreateTime: 2017/3/31 12:13:06 * UpdatedTime: 2017/3/31 12:13:06*****************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;namespace BenXHSocket{ /// <summary> /// Socket基础类 /// </summary> public abstract class SocketObject { /// <summary> /// 初始化Socket方法 /// </summary> /// <param name="ipAddress"></param> /// <param name="port"></param> public abstract void InitSocket(IPAddress ipAddress,int port); public abstract void InitSocket(string ipAddress,int port); /// <summary> /// Socket启动方法 /// </summary> public abstract void Start(); /// <summary> /// Sockdet停止方法 /// </summary> public abstract void Stop(); }}
sockets类
/***************************************************** * ProjectName: BenXHSocket * Description: * ClassName: Sockets * CLRVersion: 4.0.30319.18408 * Author: JiYF * NameSpace: BenXHSocket * MachineName: JIYONGFEI * CreateTime: 2017/3/31 12:16:10 * UpdatedTime: 2017/3/31 12:16:10*****************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace BenXHSocket{ public class Sockets { /// <summary> /// 接收缓冲区大小8k /// </summary> public byte[] RecBuffer = new byte[8 * 1024]; /// <summary> /// 发送缓冲区大小8k /// </summary> public byte[] SendBuffer = new byte[8 * 1024]; /// <summary> /// 异步接收后包的大小 /// </summary> public int Offset { get;set;} /// <summary> /// 当前IP地址,端口号 /// </summary> public IPEndPoint Ip { get; set; } /// <summary> /// 客户端主通信程序 /// </summary> public TcpClient Client { get; set; } /// <summary> /// 承载客户端Socket的网络流 /// </summary> public NetworkStream nStream { get; set; } /// <summary> /// 发生异常时不为null. /// </summary> public Exception ex { get; set; } /// <summary> /// 新客户端标识.如果推送器发现此标识为true,那么认为是客户端上线 /// 仅服务端有效 /// </summary> public bool NewClientFlag { get; set; } /// <summary> /// 客户端退出标识.如果服务端发现此标识为true,那么认为客户端下线 /// 客户端接收此标识时,认为客户端异常. /// </summary> public bool ClientDispose { get; set; } /// <summary> /// 空参构造 /// </summary> public Sockets() { } /// <summary> /// 构造函数 /// </summary> /// <param name="ip">ip节点</param> /// <param name="client">TCPClient客户端</param> /// <param name="ns">NetworkStream </param> public Sockets(IPEndPoint ip,TcpClient client,NetworkStream ns) { this.Ip = ip; this.Client = client; this.nStream = ns; } }}SocketsHandler类
/***************************************************** * ProjectName: BenXHSocket * Description: * ClassName: SocketsHandler * CLRVersion: 4.0.30319.18408 * Author: JiYF * NameSpace: BenXHSocket * MachineName: JIYONGFEI * CreateTime: 2017/3/31 13:42:48 * UpdatedTime: 2017/3/31 13:42:48*****************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace BenXHSocket{ /// <summary> /// 推送器 /// </summary> /// <param name="sockets"></param> public delegate void PushSockets(Sockets sockets); }
BXHTcpServer类 tcp服务端监听类
/***************************************************** * ProjectName: BenXHSocket * Description: * ClassName: TcpServer * CLRVersion: 4.0.30319.18408 * Author: JiYF * NameSpace: BenXHSocket * MachineName: JIYONGFEI * CreateTime: 2017/3/31 12:24:08 * UpdatedTime: 2017/3/31 12:24:08*****************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Net;using System.Net.Sockets;namespace BenXHSocket{ /// <summary> /// TCPServer类 服务端程序 /// </summary> public class BXHTcpServer:SocketObject { private bool IsStop = false; object obj = new object(); public static PushSockets pushSockets; /// <summary> /// 信号量 /// </summary> private Semaphore semap = new Semaphore(5,5000); /// <summary> /// 客户端列表集合 /// </summary> public List<Sockets> ClientList = new List<Sockets>(); /// <summary> /// 服务端实例对象 /// </summary> public TcpListener Listener; /// <summary> /// 当前的ip地址 /// </summary> private IPAddress IpAddress; /// <summary> /// 初始化消息 /// </summary> private string InitMsg = "JiYF笨小孩TCP服务端"; /// <summary> /// 监听的端口 /// </summary> private int Port; /// <summary> /// 当前ip和端口节点对象 /// </summary> private IPEndPoint Ip; /// <summary> /// 初始化服务器对象 /// </summary> /// <param name="ipAddress">IP地址</param> /// <param name="port">端口号</param> public override void InitSocket(IPAddress ipAddress, int port) { this.IpAddress = ipAddress; this.Port = port; this.Listener = new TcpListener(IpAddress,Port); } /// <summary> /// 初始化服务器对象 /// </summary> /// <param name="ipAddress"></param> /// <param name="port"></param> public override void InitSocket(string ipAddress, int port) { this.IpAddress = IPAddress.Parse(ipAddress); this.Port = port; this.Ip = new IPEndPoint(IpAddress,Port); this.Listener = new TcpListener(IpAddress,Port); } /// <summary> /// 服务端启动监听,处理链接 /// </summary> public override void Start() { try { Listener.Start(); Thread Accth = new Thread(new ThreadStart( delegate { while(true) { if(IsStop != false) { break; } this.GetAcceptTcpClient(); Thread.Sleep(1); } } )); Accth.Start(); } catch(SocketException skex) { Sockets sks = new Sockets(); sks.ex = skex; pushSockets.Invoke(sks); } } /// <summary> /// 获取处理新的链接请求 /// </summary> private void GetAcceptTcpClient() { try { if(Listener.Pending()) { semap.WaitOne(); //接收到挂起的客户端请求链接 TcpClient tcpClient = Listener.AcceptTcpClient(); //维护处理客户端队列 Socket socket = tcpClient.Client; NetworkStream stream = new NetworkStream(socket,true); Sockets sks = new Sockets(tcpClient.Client.RemoteEndPoint as IPEndPoint,tcpClient,stream); sks.NewClientFlag = true; //推送新的客户端连接信息 pushSockets.Invoke(sks); //客户端异步接收数据 sks.nStream.BeginRead(sks.RecBuffer,0,sks.RecBuffer.Length,new AsyncCallback(EndReader),sks); //加入客户端队列 this.AddClientList(sks); //链接成功后主动向客户端发送一条消息 if(stream.CanWrite) { byte[] buffer = Encoding.UTF8.GetBytes(this.InitMsg); stream.Write(buffer, 0, buffer.Length); } semap.Release(); } } catch { return; } } /// <summary> /// 异步接收发送的的信息 /// </summary> /// <param name="ir"></param> private void EndReader(IAsyncResult ir) { Sockets sks = ir.AsyncState as Sockets; if (sks != null && Listener != null) { try { if (sks.NewClientFlag || sks.Offset != 0) { sks.NewClientFlag = false; sks.Offset = sks.nStream.EndRead(ir); //推送到UI pushSockets.Invoke(sks); sks.nStream.BeginRead(sks.RecBuffer,0,sks.RecBuffer.Length,new AsyncCallback(EndReader),sks); } } catch(Exception skex) { lock (obj) { ClientList.Remove(sks); Sockets sk = sks; //标记客户端退出程序 sk.ClientDispose = true; sk.ex = skex; //推送至UI pushSockets.Invoke(sks); } } } } /// <summary> /// 客户端加入队列 /// </summary> /// <param name="sk"></param> private void AddClientList(Sockets sk) { lock (obj) { Sockets sockets = ClientList.Find(o => { return o.Ip == sk.Ip; }); if (sockets == null) { ClientList.Add(sk); } else { ClientList.Remove(sockets); ClientList.Add(sk); } } } /// <summary> /// 服务端停止监听 /// </summary> public override void Stop() { if (Listener != null) { Listener.Stop(); Listener = null; IsStop = true; pushSockets = null; } } /// <summary> /// 向所有在线客户端发送消息 /// </summary> /// <param name="SendData">消息内容</param> public void SendToAll(string SendData) { for (int i = 0; i < ClientList.Count; i++) { SendToClient(ClientList[i].Ip, SendData); } } /// <summary> /// 向单独的一个客户端发送消息 /// </summary> /// <param name="ip"></param> /// <param name="SendData"></param> public void SendToClient(IPEndPoint ip,string SendData) { try { Sockets sks = ClientList.Find(o => { return o.Ip == ip; }); if(sks == null || !sks.Client.Connected) { Sockets ks = new Sockets(); //标识客户端下线 sks.ClientDispose = true; sks.ex = new Exception("客户端没有连接"); pushSockets.Invoke(sks); } if(sks.Client.Connected) { //获取当前流进行写入. NetworkStream nStream = sks.nStream; if (nStream.CanWrite) { byte[] buffer = Encoding.UTF8.GetBytes(SendData); nStream.Write(buffer, 0, buffer.Length); } else { //避免流被关闭,重新从对象中获取流 nStream = sks.Client.GetStream(); if (nStream.CanWrite) { byte[] buffer = Encoding.UTF8.GetBytes(SendData); nStream.Write(buffer, 0, buffer.Length); } else { //如果还是无法写入,那么认为客户端中断连接. ClientList.Remove(sks); Sockets ks = new Sockets(); sks.ClientDispose = true;//如果出现异常,标识客户端下线 sks.ex = new Exception("客户端无连接"); pushSockets.Invoke(sks);//推送至UI } } } } catch(Exception skex) { Sockets sks = new Sockets(); sks.ClientDispose = true;//如果出现异常,标识客户端退出 sks.ex = skex; pushSockets.Invoke(sks);//推送至UI } } }}
BXHTcpClient 类 Tcp客户端类
/***************************************************** * ProjectName: BenXHSocket * Description: * ClassName: BxhTcpClient * CLRVersion: 4.0.30319.42000 * Author: JiYF * NameSpace: BenXHSocket * MachineName: JIYF_PC * CreateTime: 2017/3/31 20:31:48 * UpdatedTime: 2017/3/31 20:31:48*****************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace BenXHSocket{ public class BXHTcpClient : SocketObject { bool IsClose = false; /// <summary> /// 当前管理对象 /// </summary> Sockets sk; /// <summary> /// 客户端 /// </summary> public TcpClient client; /// <summary> /// 当前连接服务端地址 /// </summary> IPAddress Ipaddress; /// <summary> /// 当前连接服务端端口号 /// </summary> int Port; /// <summary> /// 服务端IP+端口 /// </summary> IPEndPoint ip; /// <summary> /// 发送与接收使用的流 /// </summary> NetworkStream nStream; /// <summary> /// 初始化Socket /// </summary> /// <param name="ipaddress"></param> /// <param name="port"></param> public override void InitSocket(string ipaddress, int port) { Ipaddress = IPAddress.Parse(ipaddress); Port = port; ip = new IPEndPoint(Ipaddress, Port); client = new TcpClient(); } public static PushSockets pushSockets; public void SendData(string SendData) { try { if (client == null || !client.Connected) { Sockets sks = new Sockets(); sks.ex = new Exception("客户端无连接.."); sks.ClientDispose = true; pushSockets.Invoke(sks);//推送至UI } if (client.Connected) //如果连接则发送 { if (nStream == null) { nStream = client.GetStream(); } byte[] buffer = Encoding.UTF8.GetBytes(SendData); nStream.Write(buffer, 0, buffer.Length); } } catch (Exception skex) { Sockets sks = new Sockets(); sks.ex = skex; sks.ClientDispose = true; pushSockets.Invoke(sks);//推送至UI } } /// <summary> /// 初始化Socket /// </summary> /// <param name="ipaddress"></param> /// <param name="port"></param> public override void InitSocket(IPAddress ipaddress, int port) { Ipaddress = ipaddress; Port = port; ip = new IPEndPoint(Ipaddress, Port); client = new TcpClient(); } private void Connect() { client.Connect(ip); nStream = new NetworkStream(client.Client, true); sk = new Sockets(ip, client, nStream); sk.nStream.BeginRead(sk.RecBuffer, 0, sk.RecBuffer.Length, new AsyncCallback(EndReader), sk); } private void EndReader(IAsyncResult ir) { Sockets s = ir.AsyncState as Sockets; try { if (s != null) { if (IsClose && client == null) { sk.nStream.Close(); sk.nStream.Dispose(); return; } s.Offset = s.nStream.EndRead(ir); pushSockets.Invoke(s);//推送至UI sk.nStream.BeginRead(sk.RecBuffer, 0, sk.RecBuffer.Length, new AsyncCallback(EndReader), sk); } } catch (Exception skex) { Sockets sks = s; sks.ex = skex; sks.ClientDispose = true; pushSockets.Invoke(sks);//推送至UI } } /// <summary> /// 重写Start方法,其实就是连接服务端 /// </summary> public override void Start() { Connect(); } public override void Stop() { Sockets sks = new Sockets(); if (client != null) { client.Client.Shutdown(SocketShutdown.Both); Thread.Sleep(10); client.Close(); IsClose = true; client = null; } else { sks.ex = new Exception("客户端没有初始化.!"); } pushSockets.Invoke(sks);//推送至UI } }}
服务端和客户端窗体应用程序主要方法设计实现
服务端窗体应用程序主要方法代码:
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.Configuration;using System.Net;using BenXHSocket;using System.Threading;namespace BenXHSocketTcpServer{ public partial class FrmTCPServer : Form { private static string serverIP; private static int port; object obj = new object(); private int sendInt = 0; private static Dictionary<TreeNode, IPEndPoint> DicTreeIPEndPoint = new Dictionary<TreeNode, IPEndPoint>(); public FrmTCPServer() { InitializeComponent(); serverIP = ConfigurationManager.AppSettings["ServerIP"]; port = int.Parse(ConfigurationManager.AppSettings["ServerPort"]); Control.CheckForIllegalCrossThreadCalls = false; init(); } private void init() { treeViewClientList.Nodes.Clear(); TreeNode tn = new TreeNode(); tn.Name = "ClientList"; tn.Text = "客户端列表"; tn.ImageIndex = 0; tn.ContextMenuStrip = contextMenuStripClientAll; treeViewClientList.Nodes.Add(tn); DicTreeIPEndPoint.Clear(); //自已绘制 this.treeViewClientList.DrawMode = TreeViewDrawMode.OwnerDrawText; this.treeViewClientList.DrawNode += new DrawTreeNodeEventHandler(treeViewClientList_DrawNode); } private BenXHSocket.BXHTcpServer tcpServer; /// <summary> /// 绘制颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeViewClientList_DrawNode(object sender, DrawTreeNodeEventArgs e) { e.DrawDefault = true; //我这里用默认颜色即可,只需要在TreeView失去焦点时选中节点仍然突显 return; //or 自定义颜色 if ((e.State & TreeNodeStates.Selected) != 0) { //演示为绿底白字 e.Graphics.FillRectangle(Brushes.DarkBlue, e.Node.Bounds); Font nodeFont = e.Node.NodeFont; if (nodeFont == null) nodeFont = ((TreeView)sender).Font; e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, Rectangle.Inflate(e.Bounds, 2, 0)); } else { e.DrawDefault = true; } if ((e.State & TreeNodeStates.Focused) != 0) { using (Pen focusPen = new Pen(Color.Black)) { focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; Rectangle focusBounds = e.Node.Bounds; focusBounds.Size = new Size(focusBounds.Width - 1, focusBounds.Height - 1); e.Graphics.DrawRectangle(focusPen, focusBounds); } } } /// <summary> /// 开启服务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void StartServerToolStripMenuItem_Click(object sender, EventArgs e) { try { if (serverIP != null && serverIP != "" && port != null && port >= 0) { tcpServer.InitSocket(IPAddress.Parse(serverIP), port); tcpServer.Start(); listBoxServerInfo.Items.Add(string.Format("{0}服务端程序监听启动成功!监听:{1}:{2}",DateTime.Now.ToString(), serverIP, port.ToString())); StartServerToolStripMenuItem.Enabled = false; } } catch(Exception ex) { listBoxServerInfo.Items.Add(string.Format("服务器启动失败!原因:{0}",ex.Message)); StartServerToolStripMenuItem.Enabled = true; } } /// <summary> /// 停止服务监听 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void StopServerToolStripMenuItem_Click(object sender, EventArgs e) { tcpServer.Stop(); listBoxServerInfo.Items.Add("服务器程序停止成功!"); StartServerToolStripMenuItem.Enabled = true; } private void FrmTCPServer_Load(object sender, EventArgs e) { if(tcpServer ==null) listBoxServerInfo.Items.Add(string.Format("服务端监听程序尚未开启!{0}:{1}",serverIP,port)); treeViewClientList.ExpandAll(); BXHTcpServer.pushSockets = new PushSockets(Rev); tcpServer = new BXHTcpServer(); } /// <summary> /// 处理接收到客户端的请求和数据 /// </summary> /// <param name="sks"></param> private void Rev(BenXHSocket.Sockets sks) { this.Invoke(new ThreadStart( delegate { if (treeViewClientList.Nodes[0] != null) { } if (sks.ex != null) { if (sks.ClientDispose) { listBoxServerInfo.Items.Add(string.Format("{0}客户端:{1}下线!",DateTime.Now.ToString(), sks.Ip)); if (treeViewClientList.Nodes[0].Nodes.ContainsKey(sks.Ip.ToString())) { if (DicTreeIPEndPoint.Count != 0) { removTreeIPEndPoint(sks.Ip); treeViewClientList.Nodes[0].Nodes.RemoveByKey(sks.Ip.ToString()); toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text) - 1).ToString();//treeViewClientList.Nodes[0].Nodes.Count.ToString(); } } } listBoxServerInfo.Items.Add(sks.ex.Message); } else { if (sks.NewClientFlag) { listBoxServerInfo.Items.Add(string.Format("{0}新的客户端:{0}链接成功",DateTime.Now.ToString(), sks.Ip)); TreeNode tn = new TreeNode(); tn.Name = sks.Ip.ToString(); tn.Text = sks.Ip.ToString(); tn.ContextMenuStrip = contextMenuStripClientSingle; tn.Tag = "客户端"; tn.ImageIndex = 1; treeViewClientList.Nodes[0].Nodes.Add(tn); //treeview节点和IPEndPoint绑定 DicTreeIPEndPoint.Add(tn,sks.Ip); if (treeViewClientList.Nodes[0].Nodes.Count > 0) { treeViewClientList.ExpandAll(); } toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text)+1).ToString(); } else if (sks.Offset == 0) { listBoxServerInfo.Items.Add(string.Format("{0}客户端:{1}下线.!",DateTime.Now.ToString(), sks.Ip)); if (treeViewClientList.Nodes[0].Nodes.ContainsKey(sks.Ip.ToString())) { if (DicTreeIPEndPoint.Count != 0) { removTreeIPEndPoint(sks.Ip); treeViewClientList.Nodes[0].Nodes.RemoveByKey(sks.Ip.ToString()); toolStripStatusLabelClientNum.Text = (int.Parse(toolStripStatusLabelClientNum.Text) - 1).ToString(); } } } else { byte[] buffer = new byte[sks.Offset]; Array.Copy(sks.RecBuffer, buffer, sks.Offset); string str = Encoding.UTF8.GetString(buffer); listBox1.Items.Add(string.Format("{0}客户端{1}发来消息:{2}",DateTime.Now.ToString(), sks.Ip, str)); } } } ) ); } /// <summary> /// 关闭程序钱停止服务器实例 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmTCPServer_FormClosing(object sender, FormClosingEventArgs e) { tcpServer.Stop(); } private void treeViewClientList_AfterSelect(object sender, TreeViewEventArgs e) { // } private void treeViewClientList_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { treeViewClientList.Focus(); treeViewClientList.SelectedNode = treeViewClientList.GetNodeAt(e.X,e.Y); } } private void toolStripMenuSendSingle_Click(object sender, EventArgs e) { if (treeViewClientList.SelectedNode != null) { tcpServer.SendToClient(DicTreeIPEndPoint[treeViewClientList.SelectedNode], string.Format("服务端单个消息...{0}", sendInt.ToString())); sendInt++; } } private void toolStripMenuSendAll_Click(object sender, EventArgs e) { tcpServer.SendToAll("服务端全部发送消息..." + sendInt); sendInt++; } private void removTreeIPEndPoint(IPEndPoint ipendPoint) { if (DicTreeIPEndPoint.Count <= 0) return; //foreach遍历Dictionary时候不能对字典进行Remove TreeNode[] keys = new TreeNode[DicTreeIPEndPoint.Count]; DicTreeIPEndPoint.Keys.CopyTo(keys,0); lock (obj) { foreach (TreeNode item in keys) { if (DicTreeIPEndPoint[item] == ipendPoint) { DicTreeIPEndPoint.Remove(item); } } } } }}
客户端窗体应用程序主要代码
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.Net;using System.Net.Sockets;using BenXHSocket;using System.Threading;namespace BenXHSocketClient{ public partial class FrmTCPClient : Form { BXHTcpClient tcpClient; string ip = string.Empty; string port = string.Empty; private int sendInt = 0; public FrmTCPClient() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void btnConnServer_Click(object sender, EventArgs e) { try { this.ip = txtServerIP.Text.Trim(); this.port = txtServerPort.Text.Trim(); tcpClient.InitSocket(ip, int.Parse(port)); tcpClient.Start(); listBoxStates.Items.Add("连接成功!"); btnConnServer.Enabled = false; } catch (Exception ex) { listBoxStates.Items.Add(string.Format("连接失败!原因:{0}", ex.Message)); btnConnServer.Enabled = true; } } private void FrmTCPClient_Load(object sender, EventArgs e) { //客户端如何处理异常等信息参照服务端 BXHTcpClient.pushSockets = new PushSockets(Rec); tcpClient = new BXHTcpClient(); this.ip = txtServerIP.Text.Trim(); this.port = txtServerPort.Text.Trim(); } /// <summary> /// 处理推送过来的消息 /// </summary> /// <param name="rec"></param> private void Rec(BenXHSocket.Sockets sks) { this.Invoke(new ThreadStart(delegate { if (listBoxText.Items.Count > 1000) { listBoxText.Items.Clear(); } if (sks.ex != null) { if (sks.ClientDispose == true) { //由于未知原因引发异常.导致客户端下线. 比如网络故障.或服务器断开连接. listBoxStates.Items.Add(string.Format("客户端下线.!")); } listBoxStates.Items.Add(string.Format("异常消息:{0}", sks.ex)); } else if (sks.Offset == 0) { //客户端主动下线 listBoxStates.Items.Add(string.Format("客户端下线.!")); } else { byte[] buffer = new byte[sks.Offset]; Array.Copy(sks.RecBuffer, buffer, sks.Offset); string str = Encoding.UTF8.GetString(buffer); listBoxText.Items.Add(string.Format("服务端{0}发来消息:{1}", sks.Ip, str)); } })); } private void btnDisConn_Click(object sender, EventArgs e) { tcpClient.Stop(); btnConnServer.Enabled = true; } private void btnSendData_Click(object sender, EventArgs e) { tcpClient.SendData("客户端消息!" + sendInt); sendInt++; } private void btnConnTest_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(o => { for (int i = 0; i < 100; i++) { BenXHSocket.BXHTcpClient clientx= new BenXHSocket.BXHTcpClient();//初始化类库 clientx.InitSocket(ip, int.Parse(port)); clientx.Start(); } MessageBox.Show("完成.!"); }); } }}
运行程序下载:
BenXHSocket程序下载
源代码工程文件下载
内容:
BenXHSocket.dll 主要程序动态库
BenXHSocketClient.exe 客户端应用程序
BenXHSocketTcpServer.exe 服务端应用程序
BenXHSocketTcpServer.exe.config 服务端应用程序配置文件
其中:BenXHSocketTcpServer.exe.config为配置文件,可以设置监听的ip地址和端口号,默认ip地址:127.0.0.1 默认的端口号:4455
2 0
- C#网络编程TCP通信实例程序简单设计
- C#网络编程TCP通信实例程序简单设计
- C# 网络编程实例 UDP TCP通信
- 简单的网络通信程序 TCP
- 串口通信+TCP网络通信简单综合实例
- Python网络编程-主机-虚拟机之间TCP协议简单通信实例
- Java TCP网络编程 简单实例
- C#网络编程-简单的通信源码
- 网络编程-Tcp通信
- python网络编程之TCP通信实例和socketserver框架
- C# .net2.0 套接字编程实例 UDP TCP通信
- C# 2.0 套接字编程实例 UDP TCP通信
- C# .net2.0 套接字编程实例 UDP TCP通信
- 套接字编程实例 UDP TCP通信 C# .net
- TCP网络编程【实例】
- C#网络通信(2)--TCP编程和多线程
- C#网络编程TCP通信的粘包问题讨论
- linux 网络编程之最简单的tcp通信服务端
- sizeof和strlen的区别比较
- Android Webview加载外部html时选择加载本地的js,css等资源文件
- Opencv 学习笔记
- JVM相关知识整理
- leetcode 447. Number of Boomerangs
- C#网络编程TCP通信实例程序简单设计
- shader博客
- 新手创建Wicket遇到的一些问题
- PageHelper
- Binder 牌胶水
- Android本地数据存储:Shared Preferences安全风险浅析
- 深入浅出nodejs学习笔记--第九章 玩转进程管理
- css3毛玻璃效果
- Redis与Memcached的区别