实验3:计算机网络实验——网络编程1
一、实验目的:
(1)熟悉和掌握网络编程的基本方法和步骤;
(2)进一步理解client/server交互模式;
(3)加深学生对于网络协议概念的理解以及协议的设计和实现方法。
二、实验任务:
使用任意网络编程语言(Java、C、VB、Delphi等)编写网络选课模拟程序,它由client和server两部分组成,client和server之间的通信基于TCP协议。实现数据的收发。
三、网络编程:
大多数网络应用程序都遵从client/server交互模型。该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。服务器程序既可以接收信息也能发送信息,还可以成为客户。
TCP/UDP赋予每个服务一个唯一的协议端口号。服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。
大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层交互。用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接字的一个重要特点是它保留了记录边界。
套节字API主要包括表1所示的接口。
使用面向连接的套接字编程,通过图2来表示其时序。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。
表1 套节字API主要接口
四.程序设计及编程思路
1.打开VB.单击文件——>新建工程。在新建工程的窗口中选择标准EXE.单击确定。
2.在Form1中添加如下控件。
以此作为TCP服务器的界面。
3.双击每个控件来添加其功能代码。
Private temp As Long '定义TCP服务器下标数组
Private listcount(10000) As Byte '定义下拉框数组
Private xb As Long '定义下标
Private Sub Command1_Click() '连接
Winsock1(temp).LocalPort = Val(Text2.Text)
Winsock1(temp).Listen
Command1.Enabled = False
Command2.Enabled = True
End Sub
Private Sub Command2_Click() '退出TCP连接
Winsock1(temp).Close
Command1.Enabled = True
Command2.Enabled = False
End Sub
Private Sub Command3_Click() '发送数据
Dim int1 As Integer
Do While List1.SelCount > 0
Do Until List1.Selected(int1)
m = 1
int1 = int1 + 1
Loop
Winsock1(listcount(int1)).SendData Text3.Text
Exit Do '一定要跳出,否则进入死循环
Loop
End Sub
Private Sub Form_Load()
xb = 0
End Sub
Private Sub Winsock1_ConnectionRequest(vari As Integer, ByVal requestID As Long)
Dim i As Long
'temp = vari '将变量赋值
'遍历数组查找空闲的套接字
For i = 0 To Winsock1.UBound
If Winsock1(i).State = sckClosed Then '找到空闲的套接字
Winsock1(i).Accept requestID '接收连接
List1.AddItem Winsock1(i).RemoteHostIP & ": " & Winsock1(i).RemotePort
temp = i
listcount(xb) = temp
xb = xb + 1
Exit Sub
End If
Next
'如果上面未找到,则增加一个新的套接字
Load Winsock1(i)
temp = i
listcount(xb) = temp
xb = xb + 1
Winsock1(i).Accept requestID '接受连接
List1.AddItem Winsock1(i).RemoteHostIP & ": " & Winsock1(i).RemotePort
End Sub
Private Sub Winsock1_DataArrival(temp As Integer, ByVal bytesTotal As Long)
Dim tmpstr As String
Winsock1(temp).GetData tmpstr
Text1.Text = tmpstr
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
4. 再次单击文件——>新建工程。在新建工程的窗口中选择标准EXE.单击确定。
5.在Form中添加如下控件。
以此来作为TCP客户端。
6.双击控件来添加其功能代码。
Private Sub Command1_Click() '连接
Winsock1.RemotePort = Val(Text2.Text) '目的端口位
Winsock1.RemoteHost = Trim(Text4.Text) '目的IP
'Winsock1.LocalPort = Val(Text5.Text)
Winsock1.Connect
Command1.Enabled = False
Command2.Enabled = True
End Sub
Private Sub Command2_Click() '退出TCP连接
Winsock1.Close
Command1.Enabled = True
Command2.Enabled = False
End Sub
Private Sub Command3_Click() '发送数据
Winsock1.SendData Text3.Text
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsock1.GetData tmpstr
Text1.Text = tmpstr
End Sub
Private Sub Text4_Change()
End Sub
7.建立好客户端与服务器后,将目的端口位设置为同一个端口号,来保证客户端与服务器相连。
在客户端的TCP参数设置栏中设置目的IP(本实验是在同一台PC上,所以IP地址为本机IP地址)
8.设置好本地端口位和目的IP后,先单击服务器上的连接按钮,再单击客户端的连接按钮。此时服务器的客户端信息将会出现如下画面,表示连接成功。
9.在客户端的发送区输入想要发送的内容,如:这是客户端。点击发送。
此时服务器将会收到客户端发送的内容。
10.在服务器的发送区输入内容。如:这是服务器。
点击发送。此时客户端将会接收到服务器的内容。
实验心得
【陆劲锛】:这次软件开发让我学到了很多的知识。知识只有转变有实际而有用的东西才能显现出它的价值。学习不只是学习理论知识,更重要的是自己动手操作的能力。在现今的社会上,要想立足,就要有过硬的本领,要有扎实的功底。 这个软件工程的项目实战让我真真切切感受到软件开发的全过程,这让我明白软件的开发是一门艺术,而不是代码的简单叠加。这是一个团体的凝聚力的体现。通过这次开发,我第一次深入的去思考一个软件的构成与实现,以前上网聊QQ的时候从来没有想过如何实现它的功能,等到让自己来做的时候才发现其中的任何一环都是非常重要的。在实践中,我也学到了很多编程方面的知识。由于是在这学期才开始使用Java编程,加上时间问题,我们的程序还有很多不尽如人意的地方。例如:很多功能没有实现(语音视频,文件传输,个人空间等等),并且界面粗糙生硬。这些都是以后需要努力的地方。从这个过程中,我还体会到一点,那就是交流的重要性,自己知道的东西要怎么样表达出来让别人听懂,听明白,交流也是一门艺术。
第二篇:基于WinSock的简单TCP网络编程实验报告
实验报告
实验课程名称: 通信软件基础实验课
学 院: 软件工程学院
专 业: 软件工程
指导教师:
报告人姓名:
学 号:
班 级:
学 期: