C#联合VisionPro实现TCP/IP通信详解
TCP/IP(传输控制协议/互联网协议)是一组用于在网络上进行通信的通信协议。它是互联网和许多局域网的基础,为计算机之间的数据传输提供了可靠性、有序性和错误检测。在软件开发中,TCP/IP 通信通常用于实现网络应用程序之间的数据交换。
基于 TCP/IP 的通信通常涉及以下几个步骤:
1、建立连接: 通信双方通过套接字(socket)建立连接。在 C# 中,你可以使用 TcpClient 类来创建一个 TCP 客户端,并使用 TcpListener 类来创建一个 TCP 服务器端。
2、发送和接收数据: 一旦连接建立,通信双方可以通过套接字发送和接收数据。在 C# 中,你可以使用 NetworkStream 类来发送和接收数据。
3、关闭连接: 在通信完成后,通信双方可以通过关闭套接字来断开连接,释放资源。
代码展示
using System; using System.Net; //引入支持socket的命名空间 using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace TCPIP通信 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //声明socket需要支持的对象 public Socket ServerSocket;//监听 public Socket SocketAccept;//绑定客户端 public Socket socket;//和客户端通信 #region 开启监听 Thread t1;//监听 Thread t2;//接收 //开启监听(监听的是客户端的链接) private void button1_Click(object sender, EventArgs e) { //实例化socket对象 //参1:绑定一个ip地址,参2:数据流的格式,参3:协议 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //准备ip对象绑定ip地址 IPAddress ip = IPAddress.Parse(textBox1.Text); //创建端口号 int port = Convert.ToInt32(textBox2.Text); //把输入的ip和端口传入到连接中,尝试链接 IPEndPoint iPEndPoint = new IPEndPoint(ip, port); try { //开启服务器的时候很容易报错,所有做异常处理 ServerSocket.Bind(iPEndPoint); //开启监听(参数是监听的数量) ServerSocket.Listen(5); //禁用按钮,避免重复监听 button1.Enabled = false; //监听是持续的,所以要在分线程中进行 t1 = new Thread(Listen); //设置成后台线程 t1.IsBackground = true; //分线程中开始对socket监听 t1.Start(ServerSocket); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Listen(object o) { SocketAccept = o as Socket; try { //因为要持续监听,所以用了while循环 while (true) { //阻塞线程,直到有客户端进来的时候才会往下执行 socket = SocketAccept.Accept(); //表示有客户端进来了,需要显示到textBox上面 AddMsg(DateTime.Now.ToString("yyyy-mmddHHMMSS") + ":" + socket.RemoteEndPoint + "链接成功"); //换行操作 AddMsg("\r\n"); //开启第二个线程,用来检测客户端传递过来的消息 t2 = new Thread(Receive); t2.IsBackground = true; t2.Start(socket); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //接收消息的方法 private void Receive(object obj) { socket = obj as Socket; try { while (true) { //定义字节,接收数据 byte[] buffer = new byte[1024 * 1024 * 2]; int r = socket.Receive(buffer); if (r == 0) { break; } string msg = Encoding.Default.GetString(buffer); AddMsg("他说:" + msg); AddMsg("\r\n"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void AddMsg(string msg) { //异步处理,否则没办法刷新ui richText.BeginInvoke(new Action<string>(str => { richText.Text += msg; }), msg); } #endregion //发送消息 private void sendBtn_Click(object sender, EventArgs e) { //首先获取要发送的消息 string str = sendText.Text; byte[] buffer = Encoding.Default.GetBytes(str); try { socket.Send(buffer); AddMsg("我说:" + str); AddMsg("\r\n"); sendText.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //关闭客户端 private void button2_Click(object sender, EventArgs e) { if (socket != null) { //禁掉socket的接收和发送 socket.Shutdown(SocketShutdown.Both); socket.Close(); t2.Abort(); } ServerSocket.Close(); SocketAccept.Close(); t1.Abort(); //打开监听的按钮 button1.Enabled = true; } } }
TCP客户端代码展示
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace _5_TCP客户端 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //描述套字节对象 public Socket clientSoket; public Socket socket;//和客户端通信 //创建一个线程。 Thread t1;//接收消息 //服务器链接 private void conecBtn_Click(object sender, EventArgs e) { //初始化socket对象 clientSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定IP IPAddress ip = IPAddress.Parse(ipTxt.Text); int port = Convert.ToInt32(portTxt.Text); //形成连接点 IPEndPoint iPEndPoint = new IPEndPoint(ip, port); //尝试与远程主机链接 try { clientSoket.Connect(iPEndPoint); AddMsg(DateTime.Now.ToString("HHmmss:") + "链接服务器"); AddMsg("\r\n"); conecBtn.Enabled = false; //开启监听 t1 = new Thread(Receive); t1.IsBackground = true; t1.Start(clientSoket); } catch (Exception ex) { MessageBox.Show("错误消息:" + ex.Message); } } //封装一个显示数据的方法 private void AddMsg(string msg) { textBox4.BeginInvoke(new Action<string>(str => { textBox4.Text += str; }), msg); } //封装一个接收消息的方法 private void Receive(object o) { //当前聊天的对象 Socket clientSocket = o as Socket; while (true) { try { //把字节转成string byte[] buffer = new byte[1024 * 1024 * 2]; int r = clientSocket.Receive(buffer); if (r == 0) { break; } string msg = Encoding.Default.GetString(buffer); AddMsg("接收到的消息:" + msg); AddMsg("\r\n"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } //发送消息 private void sendMsg_Click(object sender, EventArgs e) { byte[] buffer = new byte[1024 * 1024 * 2]; string str = textBox3.Text; //转码 buffer = Encoding.Default.GetBytes(str); //发 try { clientSoket.Send(buffer); AddMsg(str); AddMsg("\r\n"); textBox3.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //断开连接 private void button2_Click(object sender, EventArgs e) { if (clientSoket != null) { //禁掉socket的接收和发送 clientSoket.Shutdown(SocketShutdown.Both); clientSoket.Close(); t1.Abort(); } t1.Abort(); //打开监听的按钮 conecBtn.Enabled = true; } } }
以上就是C#联合VisionPro实现TCP/IP通信详解的详细内容,更多关于C# TCP/IP通信的资料请关注脚本之家其它相关文章!
最新评论