热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

同步TCP应用编程“吃棋子”游戏

1.TcpClient类TcpClient类归类在System.Net命名空间下。利用TcpClient类提供的方法,可以通过网络进行连接、发送和接收网络数据流。该类

1. TcpClient

    TcpClient类归类在System.Net命名空间下。利用TcpClient类提供的方法,可以通过网络进行连接发送和接收网络数据流。该类的构造函数有四种重载形式:

    1) TcpClient()

    该构造函数创建一个默认的TcpClient对象,该对象自动选择客户端尚未使用的IP地址和端口号。创建该对象后,即可用Connect方法与服务器端进行连接。例如:

TcpClient tcpClient=new TcpClient();

tcpClient.Connect("www.abcd.com", 51888);

    2) TcpClient(AddressFamily family)

    该构造函数创建的TcpClient对象也能自动选择客户端尚未使用的IP地址和端口号,但是使用AddressFamily枚举指定了使用哪种网络协议。创建该对象后,即可用Connect方法与服务器端进行连接。例如:

TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);

tcpClient.Connect("www.abcd.com", 51888);

    3) TcpClient(IPEndPoint iep)

    iepIPEndPoint类型的对象,iep指定了客户端的IP地址与端口号。当客户端的主机有一个以上的IP地址时,可使用此构造函数选择要使用的客户端主机IP地址。例如:

IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName());

IPEndPoint iep = new IPEndPoint(address[0], 51888);

TcpClient tcpClient = new TcpClient(iep);

tcpClient.Connect("www.abcd.com", 51888);

    4) TcpClient(string hostname,int port)

    这是使用最方便的一种构造函数。该构造函数可直接指定服务器端域名和端口号,而且不需使用connect方法。客户端主机的IP地址和端口号则自动选择。例如:

TcpClient tcpClient=new TcpClient("www.abcd.com", 51888);

    2-1和表2-2分别列出了TcpClient类的常用属性和方法。

2-1 TcpClient类的常用属性

属性

含义

Client

获取或设置基础套接字

LingerState

获取或设置套接字保持连接的时间

NoDelay

获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟

ReceiveBufferSize

获取或设置Tcp接收缓冲区的大小

ReceiveTimeout

获取或设置套接字接收数据的超时时间

SendBufferSize

获取或设置Tcp发送缓冲区的大小

SendTimeout

获取或设置套接字发送数据的超时时间

2-2 TcpClient类的常用方法

方法

含义

Close

释放TcpClient实例,而不关闭基础连接

Connect

用指定的主机名和端口号将客户端连接到TCP主机

BeginConnect

开始一个对远程主机连接的异步请求

EndConnect

异步接受传入的连接尝试

GetStream

获取能够发送和接收数据的NetworkStream对象

2. TcpListener

    TcpListener类用于监听和接收传入的连接请求。该类的构造函数有:

    1) TcpListener(IPEndPoint iep)

    其中iepIPEndPoint类型的对象,iep包含了服务器端的IP地址与端口号。该构造函数通过IPEndPoint类型的对象在指定的IP地址与端口监听客户端连接请求。

    2) TcpListener(IPAddress localAddr, int port)

    建立一个TcpListener对象,在参数中直接指定本机IP地址和端口,并通过指定的本机IP地址和端口号监听传入的连接请求。

    构造了TcpListener对象后,就可以监听客户端的连接请求了。与TcpClient相似,TcpListener也分别提供了同步和异步方法,在同步工作方式下,对应有AcceptTcpClient方法AcceptSocket方法Start方法和Stop方法。

     AcceptSocket方法用于在同步阻塞方式下获取并返回一个用来接收和发送数据的套接字对象。该套接字包含了本地和远程主机的IP地址与端口号,然后通过调用Socket对象的SendReceive方法和远程主机进行通信。

    AcceptTcpClient方法用于在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了SocketTcpClient对象。

    Start方法用于启动监听,构造函数为:

    public void Start(int backlog)

    整型参数backlog为请求队列的最大长度,即最多允许的客户端连接个数。Start方法被调用后,把自己的LocalEndPoint和底层Socket对象绑定起来,并自动调用Socket对象的Listen方法开始监听来自客户端的请求。如果接受了一个客户端请求,Start方法会自动把该请求插入请求队列,然后继续监听下一个请求,直到调用Stop方法停止监听。当TcpListener接受的请求超过请求队列的最大长度或小于0时,等待接受连接请求的远程主机将会抛出异常。

    Stop方法用于停止监听请求,构造函数为:

    public void Stop()

    程序执行Stop方法后,会立即停止监听客户端连接请求,并关闭底层的Socket对象。等待队列中的请求将会丢失,等待接受连接请求的远程主机会抛出套接字异常。

 

今天试着用winform根据《网络高级编程》中的例子 同步TCP,其中里面有很多可以借鉴的东西,包括相关代码注释以及使用面向对象的思维来考虑问题,当然里面的代码也有一些需要优化的,在今后的代码中要适当的进行改正

这个例子主要采用的是换行符作为TCP无消息边界的处理,相对来说是比较简单的,只要理解了相关的原理,相信大家都可以写出来,对于流的处理,以后会写一个文件传输的例子来处理消息边界,当然对于相关的代理技术以及HTTP隧道相关方面的东西我还不是很了解,以后要逐步加深

 

吃棋子”/Files/fujinliang/GameServer.rar游戏

 

转:https://www.cnblogs.com/fujinliang/archive/2012/06/17/2552663.html



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
author-avatar
手机用户2502855763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有