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

TCP协议最主要的特点是:

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

2) 保证数据准确到达。

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

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

TCP协议通信流程:

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

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

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

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

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

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

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

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

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

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 命令以说明有新的用户进入聊天室,服务器将返回所有在线用户的昵称,选择不同的人,并选中“悄悄话”复选框,便可以进行私聊。

TCP应用编程的更多相关文章

  1. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  2. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  3. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  4. 一种C# TCP异步编程中遇到的问题

    最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,G ...

  5. 简述TCP网络编程本质

    基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...

  6. tcp 网络编程

    网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型:                                               ...

  7. <转>Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  8. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  9. Android之TCP服务器编程

    推荐一个学java或C++的网站http://www.weixueyuan.net/,本来想自己学了总结出来再写博客,现在没时间,打字太慢!!!!,又想让这好东西让许多人知道. 关于网络通信:每一台电 ...

  10. TCP网络编程

    TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

随机推荐

  1. nginx入门篇----安装、部署、升级

    1.安装前准备工作下载nginx安装包依赖包:gcc pcre pcre-level  zlib zlib-devel openssl openss-level在线依赖包安装命令:yum -y ins ...

  2. 自定义滚动条 - mCustomScrollbar

    项目中需要使用自定义滚动条,但是试用了很多都功能不够全,今天发现一个比较全而且用法很简单的 -- mCustomScrollbar http://manos.malihu.gr/jquery-cust ...

  3. securityCRT mongoDB 命令行删除(backspace/delete)无效问题

    1.MongoDB Shell中退格键使用的问题. 利用SecureCRT工具访问linux的时候,在使用MongoDB的交互式shell的时候,退格键(Backspace)无法使用,导致无法修改输入 ...

  4. WebService异常时,查看请求状态码方法

    /// <summary> /// Test 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri ...

  5. 在工作有时候centos6.5系统使用rpm包安装mysql5.7出现的问题

    首先说明一下,我用的CentOS版本是6.6,64位.打印机驱动程序是两个rpm安装包:cndrvcups-common-2.60-1.x86_64.rpm和cndrvcups-capt-2.60-1 ...

  6. 免费提供UG、ProE二次开发、定制化开发服务

    免费提供UG.ProE二次开发,定制开发服务. 拥有六年UG.ProE二次开发经验,相关项目经验. 从事过智能设计.计算机图形学相关研究. 联系方式: QQ:1787326383 微信号:begtos ...

  7. IT荐书|10个最“牛叉”的代码注释

    下面是 网友针对“你看到过的最好的代码注释是什么样的?”这个问题给出的回答的前10条: 1. // 亲爱的维护者: // 如果你尝试了对这段程序进行‘优化’, // 并认识到这种企图是大错特错,请增加 ...

  8. CentOS7 连网 拨号上网 PPoe网

    CentOS7  连网  拨号上网  PPoe网 在安装之前,请确定是否安装  rp-pppoe-3.5.rmp 如果没有安装,请使用 --replacepkgs  先强制安装它  (CentOS-7 ...

  9. python学习笔记——1

    python1.python处理单/双引号==>处理字符串中包含单引号==>"I'm kunkun"==>处理字符串中包含双引号==>'I am " ...

  10. 教你用plsql建立索引加快查询oracle数据的速度

    http://jingyan.baidu.com/article/3f16e003cb9a0f2591c10324.html?qq-pf-to=pcqq.c2c PL/SQL Developer是一个 ...