前言
本章文章是使用C#设计一个简单的Tcp客户端,TCP客户端是指通过TCP(传输控制协议)进行通信的一方。在TCP通信中,通常有两个主要组件:客户端和服务器。TCP客户端是发起通信的一端,它通过与服务器建立连接来发送和接收数据。
Tcp客户端的主要功能
建立连接:TCP客户端需要与TCP服务器建立连接才能进行数据传输。这个连接过程是通过三次握手来完成的,确保连接的可靠性和安全性。
发送数据:一旦连接建立成功,TCP客户端就可以向服务器发送数据。TCP协议保证数据的可靠传输,通过确认和重传机制确保数据不会丢失或损坏。
接收数据:TCP客户端也可以接收来自服务器的数据。当服务器发送数据时,客户端会按照数据的发送顺序进行接收,并通过确认机制告知服务器数据已成功接收。
关闭数据:当数据传输完成后,TCP客户端会发送一个关闭连接的请求给服务器,服务器收到请求后会回复一个确认消息,然后双方都会关闭连接。这个过程称为四次挥手。
TCP客户端的主要特点包括:
面向连接:TCP客户端在发送数据之前需要与服务器建立连接。这个连接过程通常涉及三次握手,确保双方都准备好进行通信。
可靠传输:TCP客户端使用确认和重传机制来确保数据的完整性和顺序。即使在网络条件不稳定的情况下,TCP也能保证数据的可靠传输。
字节流传输:TCP将数据视为一个连续的字节流,而不是单独的数据包。这使得TCP能够处理数据的碎片化和重排序。
端口标识:TCP客户端通过源端口和目的端口号来标识数据的来源和目的地。这使得多个应用程序能够在同一台设备上同时进行网络通信。
一、创建项目
使用C#创建一个窗体应用。
对项目进行命名
二、设计窗体
在工具箱找到textBox和button布置内容。
三、程序代码
1、连接服务器
代码中(10.92.206.225)是Tcp服务器地址。
private void buttonConnect_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse("10.92.206.225"), 3400);
stream = tcpClient.GetStream();
new Task(() => MyReceiveData(tcpClient)).Start();
}
2、发送数据
代码如下:
private void buttonSend_Click(object sender, EventArgs e)
{
String str = this.textBoxSend .Text;
byte[] data = Encoding.Default.GetBytes(str);
stream.Write(data, 0, data.Length);
}
3、为Tcp网络服务器提供连接
private void MyReceiveData(TcpClient tcpClient)
{
byte[] data = new byte[1024];
while (true)
{
int count = stream.Read(data, 0, 1024);
String str = Encoding.Default.GetString(data, 0, count);
this.Invoke(new Action(() =>
{
this.textBoxReceive .Text += str + "\r\n";
}));
}
}
4、整体代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tcp客户端
{
public partial class Form1 : Form
{
private TcpClient tcpClient;
private NetworkStream stream;
public Form1()
{
InitializeComponent();
}
private void buttonConnect_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse("10.92.206.225"), 3400);
stream = tcpClient.GetStream();
new Task(() => MyReceiveData(tcpClient)).Start();
}
private void MyReceiveData(TcpClient tcpClient)
{
byte[] data = new byte[1024];
while (true)
{
int count = stream.Read(data, 0, 1024);
String str = Encoding.Default.GetString(data, 0, count);
this.Invoke(new Action(() =>
{
this.textBoxReceive .Text += str + "\r\n";
}));
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
String str = this.textBoxSend .Text;
byte[] data = Encoding.Default.GetBytes(str);
stream.Write(data, 0, data.Length);
}
}
}
四、工程架构
五、总结
1、服务器首先调用系统API创建一个套接字,指定使用IPv4或IPv6,以及TCP协议。
2、当有客户端连接请求到来时,服务器从监听队列中取出一个连接请求,并为该请求创建一个新的套接字(通常称为“已连接套接字”或“客户端套接字”),与客户端进行通信。原始套接字(即监听套接字)则继续监听其他连接请求。
3、客户端使用套接字尝试连接到服务器的IP地址和端口号。TCP协议会进行三次握手来建立连接。
4、数据传输完成后,客户端调用系统API关闭与服务器的连接,释放相关资源。
5、注意事项:
三次握手:TCP协议使用三次握手来建立连接,确保双方都已准备好进行数据传输。
四次握手:TCP协议使用四次挥手来关闭连接,确保双方都已收到对方的关闭请求,并释放相关资源。
阻塞与非阻塞:套接字可以设置为阻塞模式或非阻塞模式。在阻塞模式下,如果当前操作不能立即完成(如没有数据可读或缓冲区已满),则调用线程会被挂起,直到操作完成。而在非阻塞模式下,即使当前操作不能立即完成,调用线程也会立即返回。
错误处理:在TCP通信过程中,可能会遇到各种错误情况,如连接失败、数据丢失等。因此,在编写TCP客户端和服务器程序时,需要妥善处理这些错误情况,确保程序的稳定性和可靠性。