九、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 = ;
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(, SeekOrigin.Begin); bytesLength = BitConverter.GetBytes((int)ms.Length);
bytesContent = new byte[ms.Length];
ms.Read(bytesContent, , (int)ms.Length);
ms.Close();
}
catch (SerializationException se)
{
throw se;
}
} bytesResult = new byte[bytesContent.Length + ];
bytesResult[] = (byte)EnumDataMark.Start;//开始
bytesResult[] = byteType;
Array.Copy(bytesLength, , bytesResult, , bytesLength.Length);
Array.Copy(bytesContent, , bytesResult, , bytesContent.Length);
bytesResult[bytesResult.Length - ] = (byte)EnumDataMark.end;//结尾 return bytesResult;
}
}
九、Socket之TCP编程的更多相关文章
- 【Socket编程】通过Socket实现TCP编程
通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器 ...
- JAVA 通过 Socket 实现 TCP 编程
简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- 通过Socket实现TCP编程,用户登录之服务器相应客户端,客户端和服务端之间的通信
服务器端: 1.创建ServerSocket对象,绑定监听端口: 2.通过accept()方法监听客户端请求: 3.建立连接后通过输入流读取客户端发送的请求信息; 4.通过输出流向客户端发送响应信息; ...
- python网络-Socket之TCP编程(26)
一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
- 通过Socket实现TCP编程(十二)
原文链接:https://www.cnblogs.com/hysum/p/7531529.html Socket通信 : TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 基于TCP ...
- Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)
JAVA Socket简介 所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字”向网络发出请求或者应答网络请求. import java.io ...
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
随机推荐
- 【转】IOS的处理touch事件处理(依照手指的移动移动一个圆,开发环境用的ios7,storyboard)-- 不错
原文网址:http://blog.csdn.net/baidu_nod/article/details/32934565 先看下页面的效果图: 首先定义这个ball它有两个属性和两个方法: @prop ...
- window.location.search作用
window.location.search.substr(1).split("&") 这里面的相关属性和时间还有参数能具体说明一下吗?window.location wi ...
- 结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)
先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...
- A Pretty Good Splash Screen in C#
http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C
- HDU5046 Airport dancing links 重复覆盖+二分
这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...
- Mac下安装Mysql出现 Can’t connect to local MySQL server through socket '/tmp/mysql.sock'
在Mac下安装mysql出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock' 错误,解决如下: $ unset ...
- 卡特兰数 BZOJ3907 网格 NOIP2003 栈
卡特兰数 卡特兰数2 卡特兰数:主要是求排列组合问题 1:括号化矩阵连乘,问多少种方案 2:走方格,不能过对角线,问多少种方案 3:凸边型,划分成三角形 4:1到n的序列进栈,有多少种出栈方案 NOI ...
- 对String的一点了解
/** * @param args */ public static void main(String[] args) { String str1 = "welcome"; Str ...
- weiphp3.0(thinkphp)的调整之路
weiphp是在thinkphp的基础上开发的简洁强大开源的微信公众平台开发框架,其宣称微信功能插件化开发,多公众号管理,配置简单. 但是关于weiphp的文档使用一是内容真不多,二是写的也不详细. ...
- Android实例-录音与回放(播放MP3)(XE8+小米2)
结果: 1.增加ActionList中的Action时,需要跳到Master界面,不能在Android4Phonel界面下. 2.如果不打开权限的话,会提示“该设备不支持停止录音操作”(Record ...