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. DotNet 资源大全中文版【转】

    转自:https://github.com/jobbole/awesome-dotnet-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesom ...

  2. zabbix3.0安装之图形界面显示异常【server】

    前面记录过Zabbix3.0的安装过程,遇到一些坑,当时就在博文最后提到过,显示界面只有文字没有样式的问题.今天就解决这个小问题. 首先, 我们的安装是基于nginx作为web服务器的,不是传统的用A ...

  3. [转] Linux下 config/configure/Configure、make 、make test/make check、sudo make install 的作用

    转自:http://blog.csdn.net/secondjanuary/article/details/8985795 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装 ...

  4. 大数据量下,分页的解决办法,bubuko.com分享,快乐人生

    大数据量,比如10万以上的数据,数据库在5G以上,单表5G以上等.大数据分页时需要考虑的问题更多. 比如信息表,单表数据100W以上. 分页如果在1秒以上,在页面上的体验将是很糟糕的. 优化思路: 1 ...

  5. Validate Disk Failover Failed

    Failed to write file data on cluster disk 0 partition 1, failure reason: The disk structure is corru ...

  6. Angular中的jsonp

    1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 module.controller('InTh ...

  7. 【学】AngularJS日记(4)- 过滤器的使用

    过滤器: 过滤器中的 |json,可以使原来的json数据输出时按照换行的样式 过滤器 | limitTo:2可以截取字符串或者数组的前2位 过滤器| orderBy 可以进行排序,加入json里的k ...

  8. flash builder (fb) 与flash professional cs6(fla) 联合调试

    注意加载的swf名字与项目(fla)名字一致,在fb进行构建,如果fla代码做了修改,保持在fb构建最新.

  9. mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

    同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...

  10. android 对sqlite数据库的增删改查等各种操作

    转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...