网络编程计算机网络报告.docx
《网络编程计算机网络报告.docx》由会员分享,可在线阅读,更多相关《网络编程计算机网络报告.docx(12页珍藏版)》请在冰点文库上搜索。
网络编程计算机网络报告
工业计算机网络实验报告
实验3:
计算机网络实验——网络编程1
一、实验目的:
(1)熟悉和掌握网络编程的基本方法和步骤;
(2)进一步理解client/server交互模式;
(3)加深学生对于网络协议概念的理解以及协议的设计和实现方法。
二、实验任务:
使用任意网络编程语言(Java、C、VB、Delphi等)编写网络选课模拟程序,它由client和server两部分组成,client和server之间的通信基于TCP协议。
实现数据的收发。
三、网络编程:
大多数网络应用程序都遵从client/server交互模型。
该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。
服务器程序既可以接收信息也能发送信息,还可以成为客户。
TCP/UDP赋予每个服务一个唯一的协议端口号。
服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。
客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。
服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。
大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(SocketAPI),应用程序通过套接字接口调用来实现和传输层交互。
用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。
流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复并且无记录边界的数据流服务。
数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。
也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。
数据报套接字的一个重要特点是它保留了记录边界。
套节字API主要包括表1所示的接口。
使用面向连接的套接字编程,通过图2来表示其时序。
套接字工作过程如下:
服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。
客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最后,待数据传送结束后,双方调用close()关闭套接字。
表1套节字API主要接口
接口
解释
SOCKET
BIND
LISTEN
ACCEPT
CONNET
SEND
RECV
CLOSE
创建一个新的套接字
给服务器绑定一个传输层地址
将服务器设为被动模式
接收客户的一个请求
客户向服务器发起连接
向一个连接的套接字发送数据
从一个连接的套接字接收数据
终止一个连接
四.程序设计及编程思路
设计思路
大多数网络应用程序都遵从client/server交互模型。
该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。
服务器程序既可以接收信息也能发送信息,还可以成为客户。
TCP/UDP赋予每个服务一个唯一的协议端口号。
服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。
客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。
服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。
SETCOURSE指令:
当接收到client发送的GETCOURSE协议消息,返回该用户已经选择的所有课程名字;
GETCOURSE指令:
当接收到client发送的SETCOURSE协议消息,记录用户名和课程名,以便client使用GETCOURSE命令查询;
SHUTDOWN指令:
当接收到client发送的SHUTDOWN协议消息,检查用户是否有此权限,如果有则结束server程序
服务器端:
窗体设计:
2文本框,txtServerPort用来输入打开的端口号,txtTCPChat用来实现来自客户端输入的数据;WinSock控件,命名为WinsockTCP;两个按钮,一个命名为cmdOpenPort,用来打开端口号,同时设置WinsockTCP控件为监听状态;另一个按钮用来推出服务器应用程序,命名为cmdClose.具体代码如下:
OptionExplicit
DimHostNameAsString*256
DimHostIPAsString
DimcolHostNameAsCollection'存储用户
DimcolHostcourseAsCollection'存储用户所选择的课程名
PrivateSubForm_Load()
'获取本地计算机的名称和IP
HostName=WinsockTCP.LocalHostName
HostIP=WinsockTCP.LocalIP
'初始化端口号为1024
txtServerPort.Text=1024
EndSub
PrivateSubcmdOpenPort_Click()
IfTrim$(txtServerPort.Text)=vbNullStringThen
MsgBox"请指定端口号!
"
ExitSub
EndIf
'设置服务器的端口号
WinsockTCP.LocalPort=CLng(Trim$(txtServerPort.Text))
'服务器端WinSockTCP空间执行监听功能
WinsockTCP.Listen
EndSub
PrivateSubcmdClose_Click()
UnloadMe
EndSub
PrivateSubWinsockTCP_ConnectionRequest(ByValrequestIDAsLong)
OnErrorGoToerr
'检查控件的State属性是否为关闭的
'如果不是,在接受新的连接之前先关闭此连接
IfWinsockTCP.State<>sckClosedThen
WinsockTCP.Close
EndIf
'利用WinSock控件响应请求
'同时相集合中加入该客户端的地址
colHostName.AddWinsockTCP.RemoteHostIP
WinsockTCP.AcceptrequestID
err:
MsgBoxerr.Description
EndSub
PrivateSubWinsockTCP_DataArrival(ByValbytesTotalAsLong)
DimsDataAsString
DimscourseAsString
DimjAsLong
scourse="请选择序号:
1、单片机;2、传感器;3、电力电子技术;4、PLC;5、PLD;"
OnErrorGoToerr
WinsockTCP.GetDatasData
txtTCPChat.Text=Trim$(txtTCPChat.Text)&_
Trim$(sData)&vbCrLf
IfsData="getcourse"Then
WinsockTCP.SendDatascourse
'ElseIfsData="sendcourse"
‘不会了
EndIf
err:
MsgBoxerr.Description
EndSub
PrivateSubWinsockTCP_Close()
UnloadWinsockTCP
EndSub
代码:
客户端:
窗体设计:
txtClientChat用来显示客户端程序传送的文本、txtRemotePort用来输入远程服务器的端口、txtTCPHost用来设置远程服务器的名称、txtClientInput用来输入文本;
1个WinSock控件TcpClient,用来连接服务器端,并完成与服务器端交互的功能;4个标准按钮控件,cmdTCPCnn用来与服务器端建立连接、cmdTCPClose用来关闭所建立的连接、cmdClientClear用来清空聊天窗口、cmdClientSend用来向服务器端发送用户输入的文字。
具体代码如下:
OptionExplicit
‘全局变量声明
DimHostNameAsString*256
DimHostIPAsString
PrivateSubForm_Load()
'获得本地计算机的名称和IP
HostName=TcpClient.LocalHostName
HostIP=TcpClient.LocalIP
txtClientChat.Enabled=False
txtClientInput.Enabled=False
'设置默认连接的服务器名和端口
txtRemotePort.Text=1024
txtTCPHost.Text="sunny"
EndSub
PrivateSubcmdTCPCnn_Click()
IfTrim$(txtTCPHost.Text)=vbNullStringOr_
Trim$(txtRemotePort.Text)=vbNullStringThen
MsgBox"请输入远程主机名和端口!
"
ExitSub
EndIf
TcpClient.RemoteHost=Trim$(txtTCPHost.Text)
TcpClient.RemotePort=CLng(Trim$(txtRemotePort.Text))
TcpClient.Connect
EndSub
PrivateSubcmdTCPClose_Click()
OnErrorGoToerr
'断开与服务器的连接
TcpClient.Close
staTcpCnn.Panels
(1).Text="已退出系统!
"
ExitSub
err:
MsgBoxerr.Description
EndSub
PrivateSubcmdClientClear_Click()
txtClientChat.Text=vbNullString
EndSub
PrivateSubcmdClientSend_Click()
OnErrorGoToerr
DimsSendAsString
'发送输入的文本
sSend=Trim$(txtClientInput.Text)
TcpClient.SendDatasSend
ExitSub
err:
MsgBoxerr.Description
EndSub
PrivateSubTcpClient_Connect()
'如果连接成功,那么文本框可用
txtClientChat.Enabled=True
txtClientInput.Enabled=True
staTcpCnn.Panels
(1).Text="连接成功!
"
EndSub
PrivateSubTcpClient_DataArrival(ByValbytesTotalAsLong)
'该事件用来接收从服务器反回的数据,并显示
OnErrorGoToerr
DimsDataAsString
TcpClient.GetDatasData
txtClientChat.Text=txtClientChat.Text&sData&vbCrLf
ExitSub
err:
MsgBoxerr.Description
EndSub
PrivateSubTcpClient_Close()
TcpClient.Close
staTcpCnn.Panels
(1).Text="服务器关闭……"
EndSub
五:
运行界面
编译环境:
以下为运行环境: