资源描述
JISHOU UNIVERSITY
专业课课程论文
题 目:
基于 TCP/IP协议网络通讯设计
作 者:
学 号:
所属学院:
信息科学与工程学院
专业年级:
总 评 分:
完成时间:
吉首大学信息科学与工程学院
基于Tcp/IP协议网络通讯设计
(吉首大学信息科学与工程学院, 湖南 吉首 41600)
摘要
本论文设计目是基于TCP/IP点对点通讯技术, 以VB为平台设计并实现了一个基于C/S(用户端/服务器)模式五子棋网络游戏总体设计方法。本设计关键是建构服务器端, 采取TCP/IP网络协议, 使用VB提供Winsock控件来实现与用户端网络通信功效。关键功效是使用户端能连接到服务器端, 双方能够经过网络对战, 而且能够自动判定胜败。特点是支持双方网上聊天功效, 还增添了悔棋、 复盘、 保留棋局/聊天统计等功效。
关键词: Winsock; VB; C/S工作模式; 五子棋; TCP/IP
Realization of network communication design based on Tcp/IP protocol (Server)
Abstract
The thesis is aimed to achieve a C/S (Client/Server) mode backgammon online game based on the point to point communication technology by TCP/IP, with the Microsoft Visual Basic software platform. This design main to build a server-side that applied the TCP/IP protocol as the network protocol and used the tool of Visual Basic, Winsock, to realize the network communication. The functions of the design contain Client and Server side can be connected to each other and plays the backgammon games online, then it can auto judge the victory or defeat. The design’s feature is to support chats online, undo, and replay, save games and chat records.
Keywords: Winsock; Microsoft Visual Basic; Client/Server mode; backgammon game; TCP/IP
目录
第一章 绪论 1
1.1 五子棋介绍 1
第二章 开发工具选择 2
2.1 开发背景与现实状况 2
第三章 网络通讯基础原理 3
3.1 Tcp/IP 体系结构 3
3.1.1 Tcp/IP介绍 3
3.1.2 Tcp/IP特点 3
3.1.3 Tcp/IP协议应用 4
3.2 Winsock 5
3.3需求分析与总体设计 7
3.3.1 需求分析 7
3.3.1.1 五子棋功效需求 7
3.3.1.2 五子棋规则 7
3.3.2 总体分析 7
3.4 五子棋游戏设计 9
3.4.1 设计原理 9
3.4.2通讯步骤 9
3.4.3 算法描述 11
3.4.3.1 棋盘绘制算法 11
3.4.3.2 判定输赢算法 12
3.4.3.3 下棋决议算法 14
3.4.3.4 聊天统计管理算法 15
3.4.3.5 下棋统计管理算法 18
第四章 软件测试 20
4.1 登陆界面设计 20
4.2 下棋界面设计 21
第五章 软件测试 22
5.1 问题发觉 22
5.2 问题处理 22
第六章 总结与体会 23
6.1 总结 23
6.2 体会 23
参考文件 25
第一章 绪论
1.1 五子棋介绍
众所周知, 五子棋是中国古代、 传统黑白棋种之一, 大约在南北朝时期随围棋一起前后传入朝鲜、 日本等地。五子棋国际上正式称“连珠”, 五子棋简单易学而又富有趣味, 为大众喜爱。然而, 五子棋又包含深奥哲理和技巧, 尤其是伴随国际职业连珠运动发展和竞赛规则逐步完善, 技法和战术有了很大发展, 所以已不再是简单游戏。五子棋与围棋棋子相同, 围棋像军团作战, 博大精深; 五子棋则短兵相接, 凶险复杂。
五子棋不仅能增强思维能力, 提升智力, 而且富含哲理, 有利于修身养性。五子棋现有现代休闲显著特征“短、 平、 快”, 又有古典哲学高深学问“阴阳易理”; 它现有简单易学特征, 为广大人民群众所喜闻乐见, 又有深奥技巧和高水平国际性比赛; 它棋文化源渊流长, 含有东方神秘和西方直观; 现有“场”概念, 亦有“点”连接。它是中西文化交流点, 是古今哲理结晶。
第二章 开发工具选择
2.1 开发背景与现实状况
在很早以前五子棋软件就已经被开发出来了, 当初五子棋软件仅提供了“人机模式”与“双人模式”。“人机模式”是指, 人与计算机进行对弈, 计算机根据事先编写好算法程序来进行下棋; “双人模式”是指, 两个人经过交替使用同一台计算机来进行下棋。不管是选择哪一个模式, 全部操作都必需在同一台计算机上来往完成, 棋局无法在异地计算机之间来进行, 故而也叫单机版五子棋软件。
伴随计算机网络迅猛发展, 异地计算机之间通信变得十分便捷。这也为异地间用户经过网络来进行下棋提供了可能。
网络五子棋软件利用TCP/IP协议, 在异地玩家之间建立起TCP连接, 并用它来交换棋局多种数据信息。所以, 网络五子棋软件在下棋以前必需要对相关网络参数进行设置, 才能实现玩家双方成功连接。连接成功后, 玩家双方轮番下棋, 并将每一步下棋信息经过网络传送给对方, 使得双方棋盘上棋子保持一致, 而且提供了“互动聊天”“悔棋”、 “复盘”和“保留棋局”等功效。
第三章 网络通讯基础原理
3.1 Tcp/IP 体系结构
3.1.1 Tcp/IP介绍
TCP/IP 作为 Internet关键协议, 经过近二十多年发展已日渐成熟, 并被广泛应用于局域网和广域网中, 现在已成为实际上国际标准。TCP/IP 协议集确立了 Internet 技术基础。
TCP/IP 协议关键作用于 OSI 网络参考模型中网络层(第3层)、 传输层(第4层)和应用层(第7层)。数据链路层(第2层)功效关键应用于其它协议如以太网(Ethernet)、 ATM、 帧中继(Frame Relay), 以及多数供给商特定协议等。TCP/IP 充足支持全部通用第2层协议。TCP/IP 组中应用程序通常直接运行于传输层协议 TCP 或 UDP 上面, 并不需要表示层(第6层)和会话层(第5层)支持。
3.1.2 Tcp/IP特点
TCP/IP协议关键部分是传输层协议(TCP、 UDP), 网络层协议(IP)和物理接口层, 这三层通常是在操作系统内核中设计。所以用户通常不包含。编程时, 编程界面有两种形式: 一、 是由内关键直接提供系统调用; 二、 使用以库函数方法提供多种函数。前者为核内设计, 后者为核外设计。用户服务要经过核外应用程序才能设计, 所以要使用套接字(socket)来设计。
TCP/IP协议并不完全符合OSI七层参考模型。传统开放式系统互连参考模型, 是一个通信协议7层抽象参考模型,其中每一层实施某一特定任务。该模型目是使多种硬件在相同层次上相互通信。这7层是:物理层、 数据链路层、 网络层、 传输层、 会话层、 表示层和应用层。而TCP/IP通讯协议采取了4层层级结构, 每一层都呼叫它下一层所提供网络来完成自己需求。这4层分别为:
图 3-1-2 TCP/IP参考模型
应用层: 在TCP/IP模型最上层是应用层(Application Layer), 它包含全部高层协议。高层协议有: 虚拟终端协议TELNET、 文件传输协议FTP、 电子邮件传输协议SMTP、 域名系统服务DNS、 网络新闻传输协议NNTP和HTTP协议等等。
传输层: 传输层位于互联网层上一层, 传输层协议只存在于主机之中, 它功效是提供主机之间进程与进程有效数据传输。传输层使用端口号向应用层中不一样进程提供与该端口号对应服务。在传输层中有TCP协议(Transmission Control Protocol)即传输控制协议, 和UDP协议(User Datagram Protocol)即用户数据报协议。
互连网络层: 它是整个体系结构关键部分。它功效是负责路由选择适宜通信节点, 使数据分组能从源主机发往目主机。这些分组抵达目主机次序和发送次序可能不一样, 所以假如需要按次序发送和接收时, 高层必需对分组进行排序。
网络接口层(主机-网络层): 接收IP数据报并进行传输, 从网络上接收物理帧, 抽取IP数据报转交给下一层, 对实际网络媒体管理, 定义怎样使用实际网络(如Ethernet、 Serial Line等)来传送数据。
TCP协议是建立在IP协议之上面向连接端到端通信协议。因为IP协议是无连接不可靠协议, IP协议不可能提供任何可靠性确保机制, 所以, TCP协议可靠性完全由本身实现。TCP协议采取了确定、 超时重发、 流量控制等多种确保可靠性技术和方法。TCP和IP两种协议结合在一起, 实现了传输数据可靠方法。它安全和可靠性比UDP要高出很多。
因为网络五子棋对实时性要求较高, 综合考虑结果, 本软件应使用TCP/IP协议。
3.1.3 Tcp/IP协议应用
TCP(Transfer Control Protocol)许可你创建并维护一个与远程计算机连接, 使用该连接, 两台计算机之间就能够交换数据了。
假如你在创建一个用户应用程序, 你必需知道服务器计算机名字T注: 提议用IP地址或IP地址(RemoteHost属性), 以及要监听端口号(RemotePort属性), 然后调用Connect方法。
假如你在创建一个服务器应用程序, 设置要监听端口号(LocalPort属性), 调用Listen方法。当用户建立连接请求时, 产生ConnectionRequest事件。要完成该连接, 在ConnectionRequest事件中调用Accept方法。
一旦建立了连接, 两台计算机之间就能够发送和接收数据了。要发送数据, 调用SendData方法。当接收数据时, 产生DataArrival事件。在DataArrival事件中调用GetData方法来检取数据。
3.2 Winsock
1.TCP协议: TCP(Transfer Control Protocol)是传输控制协议简称, 是基于连接协议, 在数据传输之前必需先建立连接。经过TCP协议建立是用户/服务器通信方法。
2.UDP协议: UDP(User Data Protocol)是用户数据文报协议简称, 两台计算机之间传输类似于传输邮件; 二者之间没有明确连接, 可作为服务器, 也可作为用户机。
使用UDP协议建立对等通信和经过TCP建立用户/服务器通信方法略有不一样, 它不需要建立用户和服务器, 而是建立对等通信。
3. Winsock属性:
LocalPort: 返回或者设置所用到本端口; 假如指定是端口 0, 就使用一个端口。
Protocol: 返回或设置Winsock所用协议是TCP或UDP。
State: 返回控件状态, 用枚举类型来表示。
常数
值
描述
SckClosed
0
缺省值, 关闭
SckOpen
1
打开
SckListening
2
侦听
SckConnectionPending
3
连接挂起
SckResolvingHos
4
识别主机
SckHostResolved
5
已识别主机
SckConnecting
6
正在连接
SckConnected
7
已连接
SckClosing
8
同级人员正在关闭连接
SckError
9
错误
表1 Winsock控件State属性及其描述
4. Winsock方法:
Listen: 用于服务器程序, 等候用户访问。
Connect: 用于向远程主机发出连接请求
Accept: 用于接收一个连接请求
Senddata: 此方法用于发送数据
Getdata: 用来取得接收到数据
格式: Winsock对象.getdata 变量 [,数据类型 [,最大长度]]
Close: 关闭目前连接
格式: Winsock对象.close
5.事件:
DataArrival: 新数据抵达时出现; 获取一个 GetData 调用中全部数据。
ConnectionRequest: 当远程计算机请求连接时接收连接请求。
SendComplete : 在完成一个发送操作时出现 。
SendProgress : 在发送数据期间出现 。
Close : 当远程计算机关闭连接时出现。
3.3需求分析与总体设计
3.3.1 需求分析
软件需求分析是软件生存期中关键一步, 也是决定性一步。只有经过需求分析才能把软件功效和性能总体概念描述为具体软件需求规格说明, 从而奠定软件开发基础。
在此阶段, 了解用户要求本软件必需满足全部功效和限制, 以及用户对软件功效和性能要求, 搞清用户想要软件“做什么”, 正确地表示用户要求。
3.3.1.1 五子棋功效需求
①能经过网络进行下棋
②符合五子棋基础规则
③提供 “复盘”、 “悔棋”等功效
④提供玩家之间聊天功效
⑤有背景音乐
⑥提供保留聊天统计和下棋统计功效
3.3.1.2 五子棋规则
规则没有依据国际要求, 所以在19x19棋盘上, 只要任一方先连成五颗就获胜。当主机人为先手, 下黑子。
3.3.2 总体分析
在需求分析结束后, 已经搞清楚了软件多种需求, 很好地处理了用户要软件“做什么”问题, 接下来就将着手实现软件需求, 即要着手处理“怎么做”问题。
在这个阶段着重实现需求程序模块设计问题, 并将需求转化为软件系统结构, 进行模块划分, 确定每个模块功效、 接口及模块之间调用关系。
依据需求分析制订出整个软件系统结构图, 如图2.2所表示:
图2-2
3.4 五子棋游戏设计
3.4.1 设计原理
使用VB提供Winsock控件来实现网络通信, 采取网络协议是Tcp/IP协议, 包含服务器端和用户端, 游戏双方一方先运行服务器端, 另一方运行用户端, 连接到服务器端, 双方经过网络对战, 能够自动判定胜败, 还支持双方聊天功效。该游戏界面能显示现在对弈状态, 同时能显示对弈双方之间聊天信息。经过它建立起服务器与用户端之间连接, 服务器端负责接收用户端连接和处理用户端数据, 用户端负责连接到服务器并处理游戏时交互。步骤图以下:
图3.1
3.4.2通讯步骤
1.服务器端程序实现过程:
(1)服务器程序必需设置好LocalPort属性, 作为侦听端口, 该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过值即可)。
(2)使用Listen方法进入侦听状态, 等候用户机程序连接请求。
(3)用户机程序发出连接请求, 使服务器程序产生ConnectionRequest事件, 该事件得到一个参数requestID。
(4)服务器程序用Accept方法接收用户机程序requestID请求。这么, 服务器程序就能够用SendData方法发送数据了。Accept方法必需用上一步得到requestID作为其参数。
(5)当服务器程序接收到数据时, 产生DataArrival事件, 参数BytesTotal包含接收到数据字节数。在该事件中, 能够用GetData方法接收数据。
(6)假如接收到Close事件, 则用Close方法关闭TCP/IP连接。
2.用户端程序实现过程是:
(1) 用户程序设置Remotehost属性, 方便指定运行服务器程序主机 名, 该字符串可在“控制面板|网络|标识|计算机名”中查到。
(2) 设置RemotePort属性,方便指定服务器程序侦听端口。
(3)使用Connect方法, 向服务器提出连接请求。
(4)服务器接收用户机程序请求, 用户机程序产生Connect事件, 就能够用SendData方法发送数据了。
(5)当用户机程序接收到数据时, 产生DataArrival事件, 参数BytesTotal包含接收到数据字节数。在该事件中, 能够用GetData方法接收数据。
(6)假如接收到Close事件, 则用Close方法关闭连接。
3.下图为TCP协议通信步骤
3.4.3 算法描述
3.4.3.1 棋盘绘制算法
绘制一个19x19棋盘
Public Sub growQp()
Picture1.Cls
Picture1.Left = 0
Picture1.Top = 0
Picture1.Width = 10000
Picture1.Height = 10000
Picture1.Refresh
x = 200
y = 200
While x < 9200
x = x + 500
Picture1.Line (x, 200)-(x, 9700)
Wend
While y < 9200
y = y + 500
Picture1.Line (200, y)-(9700, y)
Wend
Picture1.Line (100, 100)-(100, 9800)
Picture1.Line (100, 100)-(9800, 100)
Picture1.Line (100, 9800)-(9800, 9800)
Picture1.Line (9800, 100)-(9800, 9800)
Picture1.Line (200, 200)-(9700, 200)
Picture1.Line (200, 200)-(200, 9700)
Picture1.Line (9700, 200)-(9700, 9700)
Picture1.Line (200, 9700)-(9700, 9700)
blackwin = False
whitewin = False
End Sub
3.4.3.2 判定输赢算法
Private Sub judblack() '判定黑是否获胜'
Dim i As Single
Dim j As Single
For i = 0 To 19
For j = 0 To 19
If table(i, j) * table(i, j + 1) * table(i, j + 2) * table(i, j + 3) * table(i, j + 4) = 1 Then
MsgBox "black win.": blackwin = True
ElseIf table(i, j) * table(i + 1, j) * table(i + 2, j) * table(i + 3, j) * table(i + 4, j) = 1 Then
MsgBox "black win.": blackwin = True
ElseIf table(i, j) * table(i + 1, j + 1) * table(i + 2, j + 2) * table(i + 3, j + 3) * table(i + 4, j + 4) = 1 Then
MsgBox "black win.": blackwin = True
ElseIf table(i, j) * table(i - 1, j + 1) * table(i - 2, j + 2) * table(i - 3, j + 3) * table(i - 4, j + 4) = 1 Then
MsgBox "black win.": blackwin = True
End If
Next j
Next i
End Sub
Private Sub judwhite() '判定白是否获胜'
Dim i As Single
Dim j As Single
For i = 0 To 19
For j = 0 To 19
If table(i, j) * table(i, j + 1) * table(i, j + 2) * table(i, j + 3) * table(i, j + 4) = 32 Then
MsgBox "white win.": whitewin = True
ElseIf table(i, j) * table(i + 1, j) * table(i + 2, j) * table(i + 3, j) * table(i + 4, j) = 32 Then
MsgBox "white win..": whitewin = True
ElseIf table(i, j) * table(i + 1, j + 1) * table(i + 2, j + 2) * table(i + 3, j + 3) * table(i + 4, j + 4) = 32 Then
MsgBox "white win..": whitewin = True
ElseIf table(i, j) * table(i - 1, j + 1) * table(i - 2, j + 2) * table(i - 3, j + 3) * table(i - 4, j + 4) = 32 Then
MsgBox "white win.": whitewin = True
End If
Next j
Next i
End Sub
3.4.3.3 下棋决议算法
Private Sub picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) '人走'
Dim a As Single
Dim b As Single
If sckServer.State = 0 Then
MsgBox "还未连接, 不能下棋! "
Else
If blackturn = False Then
If (x - 200) Mod 500 < 250 Then
a = x - (x - 200) Mod 500
ElseIf (x - 200) Mod 500 > 250 Then
a = x + 500 - (x - 200) Mod 500
End If
If (y - 200) Mod 500 < 250 Then
b = y - (y - 200) Mod 500
ElseIf (y - 200) Mod 500 > 250 Then
b = y + 500 - (y - 200) Mod 500
End If
i = (a - 200) / 500
j = (b - 200) / 500
'上面是鼠标在棋盘所点具体位置转换成坐标位置
If (table(i, j) = 0) Then
sendstr = growQdata(i, j, "vbWhite")
sckServer.SendData sendstr
blackturn = True
huiqi.Enabled = True
intstep = intstep + 1
intx(intstep) = i
inty(intstep) = j
color = color + 1
intcolor(color) = "W"
Qcolor = "vbWhite"
Call drawQz(i, j, Qcolor)
table(i, j) = 2
judwhite
If whitewin Then
intanswer = MsgBox("继续下一盘吗?", vbYesNo)
If intanswer = vbYes Then
blackturn = True
restart
growQp
Else
MsgBox "如需保留棋局, 请单击(保留)按钮 "
End If
End If
Else
MsgBox "此处已经有棋子, 请下别处! "
End If
End If
End If
End Sub
3.4.3.4 聊天统计管理算法
If Dir("c:\Server\data\chats\服务次数统计.txt") <> "服务次数统计.txt" Then
Open App.Path & "\" & "data\chats\" & "服务次数统计" & ".txt" For Output As #2
Print #2, 0
Print #2, Date
Close #2
For n = 0 To 2
FileName = App.Path & "\" & "data\chats\(" & n & ")" & Date & "服务聊天统计" & ".txt"
Open FileName For Output As #1
Close #1
Next n
Else
Open App.Path & "\" & "data\chats\" & "服务次数统计" & ".txt" For Input As #3
jlcount = ""
Line Input #3, jlcount
Line Input #3, d
Close #3
r = CInt(jlcount)
If r <= 1 Then
a = Date
If Trim(d) <> a Then
r = r + 1
Open App.Path & "\" & "data\chats\" & "服务次数统计" & ".txt" For Output As #4
Print #4, r
Print #4, Date
Close #4
fn = Dir("c:\Server\data\chats\(" & r & ")" & "*.txt")
oldname = "c:\Server\data\chats\" & fn
newname = "c:\Server\data\chats\(" & r & ")" & Date & "服务聊天统计" & ".txt"
Name oldname As newname
FileName = App.Path & "\" & "data\chats\(" & r & ")" & Date & "服务聊天统计" & ".txt"
Open FileName For Output As #1
Print #1, ""
Close #1
Else
fn = Dir("c:\Server\data\chats\(" & r & ")" & "*.txt")
oldname = "c:\Server\data\chats\" & fn
newname = "c:\Server\data\chats\(" & r & ")" & Trim(d) & "服务聊天统计" & ".txt"
Name oldname As newname
FileName = App.Path & "\" & "data\chats\(" & r & ")" & Trim(d) & "服务聊天统计" & ".txt"
Open FileName For Append As #1
Close #1
End If
ElseIf r = 2 Then
r = r + 1
Open App.Path & "\" & "data\chats\" & "服务次数统计" & ".txt" For Output As #4
Print #4, r
Print #4, Date
Close #4
Else
r = 0
Open App.Path & "\" & "data\chats\" & "服务次数统计" & ".txt" For Output As #4
Print #4, r
Print #4, Date
Close #4
fn = Dir("c:\Server\data\chats\(" & r & ")" & "*.txt")
oldname = "c:\Server\data\chats\" & fn
newname = "c:\Server\data\chats\(" & r & ")" & Date & "服务聊天统计" & ".txt"
Name oldname As newname
FileName = App.Path & "\" & "data\chats\(" & r & ")" & Date & "服务聊天统计" & ".txt"
Open FileName For Output As #1
Print #1, ""
Close #1
End If
3.4.3.5 下棋统计管理算法
Private Sub baocun_Click()
Dim C As String
CommonDialog1.Filter = "Text Files(*.TXT)|*.txt"
CommonDialog1.FilterIndex = 1
CommonDialog1.ShowSave
fname = CommonDialog1.FileName
On Error GoTo nohandle
Open fname For Output As #1
For i = 1 To 400
Print #1, intx(i);
Next i
Print #1,
For i = 1 To 400
Print #1, inty(i);
Next i
Print #1,
For i = 0 To 19
For j = 0 To 19
Print #1, table(i, j);
Next j
Next i
Print #1,
Print #1, blackturn
Print #1, intstep
Print #1, color
For i = 1 To 400
C = intcolor(i)
Print #1, C
Next i
Print #1,
Close #1
nohandle:
Exit Sub
End Sub
第四章 软件测试
4.1 登陆界面设计
登陆窗体Login如图4.1所表示:
图4.1
4.2 下棋界面设计
窗体frmserver如图4.2所表示:
图4.2
第五章 软件测试
为了确保软件质量和可靠性, 在软件编码完成以后, 应该对软件进行测试。测试出程序中存在错误, 然后进行修改。
5.1 问题发觉
1) 用户端和服务器端不能够联机。
2) 运行时直接运行游戏下棋主窗体, 没有运行登陆窗体。
3) 信息窗口显示下棋信息也显示聊天信息。
4) 在做申请悔棋和接收对方悔棋时程序段存在错误。
5) 游戏进行了会出现多种中止或者是程序员没有预想状态。
5.2 问题处理
1) 用户端里tcpClient.RemoteHost应该是服务器端IP地址, 而且用户端和服务器端两个端口应该设置为一样, 此程序LocalPort为1000。
2) 首先在工程中建立一个Module类模块, 使登陆窗体和下棋主窗体衔接起来, 而且修改工程属性, 在“通用”设置里把开启对象设置为“Sub Main”, 这么就处理了窗体运行问题。
3) 用户端和服务器端设置统一信息数据格式, 对通讯信息进行了加工, 属于聊天信息是以“LT”开头, 属于下棋信息是以“XQ”开头, 这么就避免了双方通讯信息错乱。
4) 做一个许可对方悔棋子程序和一个己方申请悔棋子程序, 这么就是编程简单化, 逻辑性强些, 从而处理了程序运行不了问题。
5) 针对这个问题, 增添了
展开阅读全文