TCP应用编程

时间:2023-03-09 01:48:34
TCP应用编程

TCP是Transmission Control Protocol(传输控制协议)的简称,是TCP/IP体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务。

TCP协议最主要的特点是:

1) 是一种基于连接的协议。

2) 保证数据准确到达。

3) 保证各数据到达的顺序与数据发出的顺序相同。

4) 传输的数据无消息边界。

TCP协议通信流程:

1. 服务器端首先创建服务器套接字

2. 服务器套接字监听一个端口,等待客户端请求

3. 客户端创建客户端套接字

4. 客户端向服务器端发送连接请求

5. 服务器确认与客户端的连接

6. 客户端和服务器端利用建立的连接进行通信

7. 通信完毕后,客户端和服务器关闭各自的连接

服务器和客户端利用 Socket 进行通信的流程(如图 所示)

TCP应用编程

服务器与客户端的通信流程

Socket编程基础:

Socket(网络套接字)是网络通信的基本构件,它是可以被命名和寻址的通信端口,使用中,每个Socket 都有对应的类型和一个与之相关的进程。下面分别介绍如何利用Socket 建立服务器端程序和客户端程序。

利用Socket 建立TCP服务器端程序,一般需要以下几个步骤。

1) 创建服务器套接字,并将其与服务器的IP地址和端口号绑定

int  port = 888;

IPAddress ipAdd=IPAddress.Parse(“192.168.1.100”);

TcpListener listener=new TcpListener(ipAdd, port);

注意,需要引入命名空间:

using System.Net;

using System.Net.Sockets;

2) 监听服务器端口,等待客户端连接请求

listener.Start();

3) 确认与客户端的连接,并创建与该客户端对应的Socket对象

Socket clientSocket= listener.AcceptSocket();

4) 通过建立的Socket对象与连接的客户端进行数据传输

A. 向客户端发送消息

string msg=”大家好”;

byte [] outBytes=Encoding.Default.GetBytes(msg.ToCharArray());

clientSocket.Send(outBytes);

B. 接收从客户端发来的数据

byte [] buff=new byte[1024];

clientSocket.Receive(buff);

string msg = Encoding.Default.GetString(buff);

5) 断开与客户端的连接

clientSocket.Close();

6) 关闭服务器套接字

listener.Close();

利用Socket 建立TCP客户端程序,一般需要以下几个步骤。

1) 创建客户端套接字

TcpClient tcpClient=new TcpClient();

注意,需要引入命名空间:

using System.Net;

using System.Net.Sockets;

2) 向远程服务器发送连接请求

int  port = 888;

IPAddress ipAdd=IPAddress.Parse(“192.168.1.100”);

tcpClient.Connect(ipAdd, port);

3) 获取与服务器通信的流通道

NetworkStream stream = tcpClient.GetStream();

4) 通过流通道与服务器端进行数据传输

A..向服务器端发送数据

string cmd=” CHAT|” + userAlias + “:Hello, everyone|”;

byte [] outBytes=Encoding.Default.GetBytes(cmd.ToCharArray());

Stream.Write(outBytes,0,outBytes.Length);

B.接收从服务器端发来的数据

byte [] buff=new byte[1024];

int len= stream.Read(buff,0,buff.Length);

string msg = Encoding.Default.GetString(buff,0,len);

5) 断开与服务器的连接

tcpClient.Close();

TCP编程应用实例——网络即时通讯程序

功能:

登录、显示在线用户、显示进行聊天的用户信息、群聊(发送的信息所有在线用户都会收到)、私聊(与选定用户聊天,发送信息只有选定的用户可以收到)

设计方案:

1. 服务器端的设计

服务器端管理聊天任务,并维持在线用户列表,转发用户发送来的信息,我们设计的功能如下:

1) 监听本机IP 地址中的指定端口

2) 当有客户端向该端口发出请求时,服务器程序立即建立一个与该客户端的连接并启动一个新的线程来处理该客户端的所有请求

3) 根据客户端发来的不同请求命令,执行相应的操作,并将处理结果返回给该客户端。服务器可以接收识别4种消息命令:CONN(建立新的连接)、CHAT(聊天)、PRIV(私聊)和EXIT(离开),每条消息命令可以包含一个或多个消息参数,用管道符“|”来分隔消息的各部分。表-1列出了所有的消息命令。

命令格式

说明

CONN|发送者的用户名|

该命令在客户端与服务器端建立连接后由客户端自动发送

服务器端收到该命令后,将“用户名”添加到在线用户列表并向所有在线用户发送更新在线用户列表的命令

CHAT|发送者的用户名:发送内容|

该命令是用户在客户端输入聊天内容并单击“发送”按钮后,由客户端程序自动发送

服务器端收到该命令后,将“发送者的用户名:发送内容”转发给所有在线用户

PRIV|发送者的用户名|接收者的用户名|发送内容|

该命令是用户在客户端选择某个在线用户并选中“悄悄话”复选框,输入聊天内容并单击“发送”按钮后,由客户端程序自动发送

服务器端收到该命令后,将“发送者的用户名|接收者的用户名|发送内容|”转发给对应的接收者

EXIT|发送者的用户名|

该命令是用户在客户端单击“离开”按钮后,由客户端程序自动发送

服务器端收到该命令后,将发送者的用户名从在线用户列表中删除,并向所有在线用户发送更新在线用户列表命令

2. 客户端的设计

客户端端包含用户登录窗口和聊天的主窗口,它允许用户登录到服务器,并可以向服务器发送消息,同时还可从服务器接收返回的消息,我们设计的功能如下:

1) 向服务器发送连接请求

2) 得到服务器的确认后,建立与服务器的连接,并获取与服务器进行通信的流通道(NetworkStream)

3) 通过流通道与服务器进行数据通信。向服务器发送服务器能够识别的4种命令请求,同时接收服务器发回的消息命令。客户端能够识别的命令有3种:JOIN(通知有新的用户进入聊天室)、LIST(更新在线用户列表)、QUIT(关闭客户端应用程序),每条消息命令可以包含一个或多个消息参数,用管道符“|”来分隔消息的各部分。表-2列出了所有的消息命令。

命令格式

说明

JOIN|刚登陆的用户名|

该命令是在服务器端收到CONN命令后,由服务器端自动发送给客户端,以通知有新的用户进入聊天室

客户端收到该命令后,在各自窗口中显示此用户已进入聊天室

LIST|用户名1|用户名2|...(所有在线用户名)|

该命令是在服务器端收到客户端发来的CONN命令(有新的用户进入)或EXIT命令(有在线用户退出)后,由服务器端自动发送给客户端,以通知所有的在线用户更新自己的在线用户列表

客户端收到该命令后,在各自的窗口中刷新在线用户列表

QUIT|

该命令是在服务器端收到客户端发来的EXIT命令后,由服务器端程序自动发送给客户端(发送EXIT命令的客户端),以通知该客户端关闭连接并关闭客户段程序

客户端(发送EXIT命令的客户端)收到该命令后,将关闭与服务器的连接并关闭客户段程序

注意:以上命令是自定义的,可以根据需要增加或更改,只要保证客户端与服务器端消息命令格式一致就行。

解决方案:

1、 服务器端的实现

新建一个Windows窗体应用程序,命名为ChatServer,为了使用IPAddress对象、Socket对象和Thread对象,需引入命名空间System.Net、System.Net.Sockets和System.Threading。

在服务器端使用多线程,每个用户使用单独的线程进行连接,当服务器开始运行时,便启动一个线程等待客户端连接(在方法 StartListen() 中实现)。当接收到一个请求时,服务器立即启动一个新线程来处理和该客户端的信息交互(在方法 StartService() 中实现)。在此自定义了一个 Client 类,用于保存每个在线用户的用户名和与服务器连接的 Socket 对象,当 Socket 连接一旦建立,就马上将其保存在一个 Client 对象中,以便让每个用户有自己的 Socket,以后可以对不同用户的 Socket 对象进行操作,实现与客户端的数据交互。

祥见代码ChatServer.cs。

2、 客户端的实现

新建一个Windows窗体应用程序,命名为ChatServer,为了使用IPAddress对象、Socket对象和Thread对象,需引入命名空间System.Net、System.Net.Sockets和System.Threading。

在客户端,首先创建客户端套接字并连接到服务器指定端口,同时获取与服务器通信的流通道,在用户登录后,向服务器发送 CONN 命令以说明有新的用户进入聊天室,服务器将返回所有在线用户的昵称,选择不同的人,并选中“悄悄话”复选框,便可以进行私聊。