C#基于TCP协议的服务器端和客户端通信编程的基础教程
作者:剑萧舞蝶 发布时间:2023-08-20 13:09:55
运行在TCP之上常见的网络应用协议有比如HTTP、FTP、SMTP、POP3、IMAP。
TCP是TCP/IP体系中最重要的传输协议,它提供全双工和可靠交付的服务,是大多数应用协议工作的基础。
TCP是一种面向连接(连接导向)的,可靠的,基于字节流的传输层通信协议。
TCP的工作过程
建立连接
传输数据
连接的终止
TCP的主要特点
1.TCP是面向连接的协议
2.是端到端的通信。每个TCP连接只能有两个端点,而且只能一对一通信,不能点对多的
的直接通信
3.高可靠性
4.全双工方式传输
5.数据以字节流的方式传输
6.传输的数据无消息边界
关于线程
利用TCP开发应用程序时,.net框架提供两种工作方式,一种是同步工作方式,另一种是异步工作方式。
同步工作方式是指利用TCP编写的程序执行到监听或者接收语句,在未完成当前工作前不再。
继续往下执行,线程处于阻塞状态,直到该语句完成后才能继续执行下一条语句。
异步工作方式是指程序执行到监听或者接收语句时,无论当前工作是否完成,都会继续往下执行。
TcpListener与TcpClient类常用方法与属性
TCPListener类用于监听客户端连接请求,TCPClient类用于提供本地主机和远程主机的连接信息。
两个类都位于 System.Net.Socckets命名空间下。
1.TCPListener类常用的方法:
(1)AcceptSocket:从端口处接收一个连接并赋予它Socket对象
(2)AcceptTcpClient:从端口处接收一个连接并赋予它TCPClient对象
(3)Equals:判断两个TcpListener对象是否相等
(4)GetType:获取当前实例的类型
(5)Pending :确定是否有挂起的连接请求
(6)Start:开始接听传入的连接请求
(7)Stop:关闭 *
(8)ToString:创建TcpListener对象的字符串表示
2.TcpClient常用的属性与方法
属性:
(1)Client:获取或设置基础套接字
(2)LingerState:获取或设置套接字保持连接的时间
(3)NoDelay:获取或设置一个值,该值在发送或接收缓存冲未满时禁止延迟、
(4)ReceiveBufferSize:获取或设置TCP接收缓存区的大小
(5)ReceiveTimetut:获取或设置套接字接收数据的超时时间
(6)SendBufferSize:获取或设置TCP发送缓存区的大小
(7)SendTimeout:获取或设置套接字发送数据超时时间
方法:
(1)Close:释放TcpClient实例,而不关闭基础连接
(2)Connect:用指定的主机名和端口号将客户端连接到TCP主机
(3)BeginConnect:开始一个远程主机连接的异步请求
(4)GetStream:获取能够发送和接收数据的NetworkStream对象
TCP编程的一般步骤
1.网络通信的最基本的前提就是客户端要先和服务器建立TCP连接
2.服务端要不断的监听客户端是否有连接请求、并且服务端能要识别特定的客户端
3.连接并创建对应的套接字
4.发送数据和接收数据
编写服务器端程序的一般步骤
1.创建一个TcpListener对象,然后调用该对象的Start方法在指定的端口进行监听
2.在单独的线程中,首先循环调用AcceptTcpClient方法接收客户端的连接请求
,从该方法中的返回结果中得到与该客户端对应的TcpClient对象,并利用该对象
的GetStream方法得到NetworkStream。然后再利用该对象得到其他使用更方便的
对象,比如BinaryReader对象、BinaryWrite对象,为进一步与对方通信做准备。
3.每得到一个新的TcpClient对象,就创建一个与客户对应的线程,在线程与对应的
客户进行通信。
4.根据传送信息的情况确定是否关闭与客户连接。
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.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace TCP
{
public partial class TcpListenerTest : Form
{
public TcpListenerTest()
{
InitializeComponent();
}
//声明
private IPAddress localAddress;// IP地址 IPAddress类 在命名空间 using System.Net下
private const int port = 58080;//端口
private TcpListener tcpListener;//监听套接字 TcpLestener与TcpClient类 在命名空间 using System.Net.Sockets下
private TcpClient tcpClient;//服务端与客户端建立连接
private NetworkStream newworkStream;//利用NetworkStream对象与远程主机发送数据或接收数据\
private BinaryReader binaryReader;//读取 BinaryReader与BinaryWriter类在命名空间using System.IO下
private BinaryWriter binaryWrite;//写入
private void Form1_Load(object sender, EventArgs e)
{
IPAddress[] listenerIp = Dns.GetHostAddresses("www.baidu.com");//返回主机指定的IP地址
localAddress = listenerIp[0]; //初始化IP地址为本地地址
tcpListener = new TcpListener(localAddress,port);//创建TcpListener对象
tcpListener.Start();//开始监听
Thread thread = new Thread(AcceptClientConnect);//启动一个线程接收请求
thread.Start();//启动线程
}
//发起请求
private void AcceptClientConnect()
{
while(true)
{
try
{
tcpClient = tcpListener.AcceptTcpClient();//从端口接收一个连接,并赋予它TcpClient对象
if (tcpClient != null)
{
newworkStream = tcpClient.GetStream();
binaryReader = new BinaryReader(newworkStream);
binaryWrite = new BinaryWriter(newworkStream);
}
}
catch
{
break;
}
}
}
}
}
TCP编程 客户端程序一般步骤
1.利用TcpClient的构造函数创建一个TcpClient对象
2.使用Connect方法与服务器建立连接
3.利用TcpClient对象的GetStream对象得到网络流,然后利用该网络流与服务器进行数据传输
4.创建一个线程监听指定的端口,循环接收并处理服务器发送过来的信息。
5.完成工作之后,想服务器发送关闭信息,并关闭与服务器的连接。
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.Sockets;
using System.Net;
using System.IO;
namespace TCP
{
public partial class TcpClientTest : Form
{
public TcpClientTest()
{
InitializeComponent();
}
private TcpClient tcpClient;//声明
private IPAddress iAdress;//IP地址
private const int port=58080; //端口
private NetworkStream networkStream;//网络流
private BinaryReader binayRead;//读取
private BinaryWriter binayWrite;//写入
private void TcpClient_Load(object sender, EventArgs e)
{
IPAddress[] ipAddress = Dns.GetHostAddresses("www.baidu.com");//返回主机指定的IP地址
iAdress = ipAddress[0]; //初始化IP地址为本地地址
IPEndPoint ipoint = new IPEndPoint(iAdress,port);//将网络端点表示为IP和端口号
tcpClient = new TcpClient(ipoint);//实例化TcpClient类
//最方便 TcpClient tcpClient=new TcpClient("www.baidu.com",port);
if (tcpClient != null)
{
networkStream = tcpClient.GetStream();//得到网络流
binayRead = new BinaryReader(networkStream);
binayWrite = new BinaryWriter(networkStream);
}
}
private void ReMessage()
{
while (true)
{
try
{
string rcMsg = binayRead.ReadString();//从网络流中读取数据
if (rcMsg != null)
{
MessageBox.Show(rcMsg);
}
else
{
break;
}
}
catch
{
}
}
}
}
}


猜你喜欢
- SessionSession对象用于获取与数据库的物理连接。 Session对象是重量轻,设计了一个互动是需要与数据库每次被实例化。持久化对
- 在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。java.awt中定义了多种布局类,每种布局类对应
- 首先来说一说该指南针的实现思路:程序先准备一张指南针图片,该图片上方向指针指向北方。接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴
- 前言在之前的项目中,有做过一个需求,需要实现一个颜色渐变的折线图。当时项目中使用的图表库是MPAndroidChart,但是该库没有提供合适
- 我就废话不多说了,大家还是直接看代码吧~<!-- 查询物品的id --><select id="checkIte
- 什么是OKHttp一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进
- 1.MyBatis中map的应用1.1.应用场景假设,实体类,或者数据库中的表,字段或者参数过多,应当考虑使用Map!!!1.2.具体实现/
- 将自然语言编写的测试用例转换为可执行的测试,可以大大降低需求与开发之间的沟通成本,这是BDD(行为驱动开发)希望达到的效果。SpecFlow
- 在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接。2)打车过去。3)机
- 问题描述平常用的是java8,最近在学习java的新特性。这就需要从java8往更高的java版本切换。由于还在使用java8,测试完新特性
- NoHttp是专门做Android网络请求与下载的框架,NoHttp基本使用方法如下本文demo源码下载地址: http://xiazai.
- java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是常用的线程集合,在线程池中也常常
- 此问题的产生,主要是数据库的字段名一样导致三张表 DOCTOR JOB OBJECT有问题的查询语句和查询结果是:SELECT d.*,j.
- 定义弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型。在发生GC时,只要发现弱引
- 上篇文章中介绍了聊天功能,这里介绍通讯录是如何实现的。首先要加载公司的所有部门,树形结构,然后点击进入部门的人员列表,点击人员能查看详细信息
- 本文实例为大家分享了Android实现扫描和生成二维码的具体代码,供大家参考,具体内容如下目标效果:该例子可以扫描二维码和条形码,扫描后会将
- 一、项目简述(+需求文档+PPT)功能: 主页显示热销商品;所有商品展示,可进行商品搜索;点 击商品进入商品详情页,显示库存,具有立即购买和
- 概述中国特色社会主义乱码问题是我们经常会碰到的问题,解决的办法有很多,本文分别介绍了GET方式和POST方式中文乱码解决方案中一劳永逸的办法
- 关于《JavaCV的摄像头实战》系列《JavaCV的摄像头实战》顾名思义,是使用JavaCV框架对摄像头进行各种处理的实战集合,这是欣宸作为
- 前言J.U.C是java包java.util.concurrent的简写,中文简称并发包,是jdk1.5新增用来编写并发相关的基础api。j