用tcp协议创建服务器,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

{

}

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值