C#基于TCP协议的服务器端和客户端通信编程的基础教程
运行在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 { } } } } }
上一篇: vue-cli中安装方法(图文详细步骤)
下一篇: php漏洞之跨网站请求伪造与防止伪造方法
推荐阅读
-
C#基于TCP协议的服务器端和客户端通信编程的基础教程
-
详解Android 基于TCP和UDP协议的Socket通信
-
使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
-
python 之 网络编程(基于TCP协议的套接字通信操作)
-
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
-
linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
-
C#基于Socket的UDP和TCP处理通信报文开发传输
-
服务器端和客户端通过TCP协议进行数据交互的基本应用
-
一个简单的基于TCP通信的服务器端与客户端程序
-
基于TCP的socket编程实现client和server通信