九、Socket之TCP编程

TCP简介


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

  TCP最主要的特点:

  (1)是面向连接的传输层协议;

  (2)每个TCP连接只能有两个端点,而且只能一对一通信,不能一点对多点直接通信。

  (3)通过TCP连接传送的数据,能保证数据无差错、不丢失、不重复地准确到达接收方,并且保证各数据到达的顺序与数据发出的顺序相同。

  (4)数据以字节流的方式传输。

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

  利用TCP开发应用程序时,.NET框架提供两种工作方式.

  (1)同步工作方式 指利用TCP编写的程序执行到发送、接收或监听语句时,在未完成工作前不再继续往下执行,

    即处于阻塞状态,直到该语句完成相应的工作后才继续执行下一条语句;

  (2)异步工作方式 异步工作方式是指程序执行到发送、接收或监听语句时,不论工作是否完成,都会继续往下执行。

    例如:同步接收数据时,接收方执行到接收语句后将处于阻塞方式,只有接收到对方发来的数据后才继续执行下一条语句;

    而如果采用异步工作方式,则接收方在执行到接收语句后,无论是否接收到对方发来的数据,程序都继续往下执行。

TcpListener类与TcpClient类

  TcpListener类与TcpClient类两个类均封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了TCP应用编程的难度。

  TcpListener类用于侦听和接受传入的连接请求。

  TcpClient类用于提供本地主机和远程主机的连接信息。

  注意,TcpListener和TcpClient只支持标准协议编程。如果希望编写非标准协议的程序,只能使用套接字来实现。

  编写服务器端程序的一般步骤为:

  使用对套接字封装后的类,编写基于TCP的服务器端程序的 一般步骤为:

  (1)创建一个TcpListener对象,然后调用该对象的Start方法在指定的端口进行监听。

  (2)在单独的线程中,循环调用AcceptTcpClient方法接受客户端的连接请求,并根据该方法的返回的结果得到与该客户端对应的TcpClient对象。

  (3)每得到一个新的TcpClient对象,就创建一个与该客户对应的线程,在线程中与对应的客户进行通信。

  (4)根据传送信息的情况确定是否关闭与客户的连接。

  编写客户端程序的一般步骤为:

  使用对套接字封装后的类,编写基于TCP的客户端程序的一 般步骤如下:

  (1)利用TcpClient的构造函数创建一个TcpClient对象。

  (2)使用Connect方法与服务器建立连接。

  (3)利用TcpClient对象的GetStream方法得到网络流,然后利用该网络流与服务器进行数据传输。

  (4)创建一个线程监听指定的端口,循环接收并处理服务器发送过来的信息。

  (5)完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。

  在网络传输中,可能会出现发送方一次发送的消息与接收方一次接收的消息不一致的现象。

  这主要是因为TCP协议是字节流形式的、无消息边界的协议,由于受网络传输中的不确定因素的影响,因此不能保证单个Send方法发送的数据被单个Receive方法读取。

  实际应用中,解决TCP协议消息边界问题的方法有三种

  1、发送固定长度的消息,该方法适用于消息长度固定的场合。

  2、将消息长度与消息一起发送,这种方法适用于任何场合。

  3、使用特殊标记分隔消息,这种方法主要用于消息中不包含特殊标记的场合。

  第一种通过网络流来解决消息边界问题:


 //客户端
private BinaryReader br;
private BinaryWriter bw;
//客户端获取网络流
NetworkStream networkStream = client.GetStream();

/// <summary>向服务器端发送信息</summary>
private void SendMessage(string message)
{
try
{
//将字符串写入网络流,此方法会自动附加字符串长度前缀
bw.Write(message);
bw.Flush();
}
catch
{
throw new Exception("发送失败!");
}
}

//服务器端
//读取网络流
string receiveString = br.ReadString();

  第二种定义消息开始和结尾,字节流的形式传输


/// <summary>
/// 受保护将要传送数据转成二进制数组方法
/// </summary>
/// <param name="obj">要转换的对象</param>
/// <returns>被转换成二进制数</returns>
internal virtual byte[] FromObjectToBytes(object obj)
{
lock (this)
{
byte byteType = 0;
byte[] bytesContent = null;
byte[] bytesResult = null;
byte[] bytesLength = null;

if (obj is string)
{
byteType = (byte)EnumDataMark.Text;
bytesContent = Encoding.UTF8.GetBytes(obj.ToString());
bytesLength = BitConverter.GetBytes(bytesContent.Length);
}
else if (obj is object)
{
byteType = (byte)EnumDataMark.Obj;

try
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);

bytesLength = BitConverter.GetBytes((int)ms.Length);
bytesContent = new byte[ms.Length];
ms.Read(bytesContent, 0, (int)ms.Length);
ms.Close();
}
catch (SerializationException se)
{
throw se;
}
}

bytesResult = new byte[bytesContent.Length + 7];
bytesResult[0] = (byte)EnumDataMark.Start;//开始
bytesResult[1] = byteType;
Array.Copy(bytesLength, 0, bytesResult, 2, bytesLength.Length);
Array.Copy(bytesContent, 0, bytesResult, 6, bytesContent.Length);
bytesResult[bytesResult.Length - 1] = (byte)EnumDataMark.end;//结尾

return bytesResult;
}
}

九、Socket之TCP编程

时间: 2024-10-01 06:13:02

九、Socket之TCP编程的相关文章

【Socket编程】通过Socket实现TCP编程

通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器端----ServerSocket类 一.通信过程(Socket通信模型) Socket通信模型用下图所示: 1.在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接. 2.当客户端创建连接Socket并且向服务端发送请求. 3.服务器收到请求,并且接

JAVA 通过 Socket 实现 TCP 编程

简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP,下一篇博客会实现)是同一层内 另一个重要的传输协议.在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层.不同主机的应用层之间经常需要可靠的.像管道一样的连接,但是I

通过 Socket 实现 TCP 编程

Socket通信: TCP协议是面向连接的.可靠的.有序的,以字节流的方式发送数据 基于TCP协议实现网络通信的类 客户端的Socket类 服务器端的ServerSocket类 Socket通信实现步骤 1.创建ServerSocket和Socket 2.打开连接到Socket的输入.输出流 3.按照协议对Socket进行读/写操作 4.关闭输入输出流.关闭Socket 服务器端: 创建ServerSocket对象,绑定监听端口 通过accept()方法监听客户端请求 连接建立后,通过输入流读取

网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信. 使用TCP还是UDP,那要看你的程序注重哪一个方面,可靠(tcp)还是快速(udp). TCP/IP 建立连接的过程 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.   

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

基于Socket的UDP和TCP编程介绍

一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手)         1.客户端发

TCP编程,Socket通讯

网络编程分两种,一种是TCP编程,还有一种是UDP编程(点击打开链接).而本文先讲述简单的TCP编程,Socket套接字连接通讯,实现简单的client与server之间的信息传输. 以下是client与server之间简单的传输数据(单对单): 注意:服务端先启动.然后再启动client. client: public class C { public static void main(String[] args) { try { Socket s = new Socket("172.18.1

关于Socket、TCP/IP、HTTP、FTP及网络编程

来源:陶邦仁 链接:http://blog.jobbole.com/99694/ 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,再者如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP/IP协议组 TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成. IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机. TCP层负责面向应用的可靠的或非可靠的数据传输机制