《计算机网络系统实践》报告详解

编辑:阿文时间:2020-06-13 11:25:06
《计算机网络系统实践》报告详解,建立套接字编程的初步概念,熟悉使用的主要功能,语言是一种适用于分布式计算环境的跨平台面向对象的编程语言,因为它具有很好的跨平台性,设计题目端口扫描工具设计与实现。

2017年09月

基于java的坦克战争游戏设计

1、设计要求

1.1设计目的

(1) 熟悉java的基本操作;

(2) 掌握windows/linux应用程序的编写过程;

(3) 建立套接字编程的初步概念。

1.2设计要求

(1) 熟悉使用socket api的主要功能;

(2) 通过相应的开发工具掌握socket api的封装;

(3) 设计并实现一对一的网络游戏,如tic-tac-toe、gobang等。

我选择了网络坦克战的设计。

2、开发环境与工具

2.1编程语言:java

java语言是一种适用于分布式计算环境的跨平台、面向对象的编程语言。java现在主要用在web开发,手机游戏及一些平台游戏的开发,因为它具有很好的跨平台性,在手机等各种电子产品上应用非常广泛。

2.2运行环境:jdk1.6

2.3开发工具:我的eclipse10

myeclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于java、java ee以及移动应用的开发。myeclipse功能强大,受到广泛支持,特别是对于各种开源产品。

2.4网络建立:socket

网络上的两个程序通过双向通信连接交换数据,其中一端称为套接字。

socket的英文原义是“孔”或“插座”。作为bsd-unix的进程通信机制,取后者的含义。通常也称作"套接字",用于描述ip地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

通常,inter***上的主机运行多个服务软件,同时提供多个服务。每个服务打开一个套接字并绑定到一个端口。不同的端口对应不同的服务。socket正如其英文原意那样,像一个多孔插座。

一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。客户软件可以通过将插头插入带有不同号码的插座来获得不同的服务。

3、设计原理

联机通信机制

网络编程被简单地理解为两台相互通信的计算机。其基本模型就是客户机/服务器模型,也就是通信双方中的一方必须提供一个固定的位置,而另一方只需要知道这个固定的位置,并且建立两者之间的联系,然后完成数据交换。在这里提供固定位置的一方通常称为服务器,建立联接的一方称为客户端。

插座(中文意思是插座)。基于client/server的socket通信方式如图3.1所示:

图3.1:基于客户机/服务器的soctet通信模式

当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象,socket类有几个构造函数。两个常用的构造函数是 socket(i***address addr, int port) 和 socket(string host, int port),两个构造函数都创建了一个基于socket的连接服务器端流套接字的流套接字。两个函数都通过参数port获取服务器的端口号。

假设已经建立连接了,网络api将在客户端基于socket的流套接字中**客户程序的ip地址和任意一个端口号,否则两个函数都会抛出一个ioexception对象。如果创建了一个socket对象,那么它可能通过调用socket的 getinputstream()方法从服务程序获得输入流读传送来的信息,也可能通过调用socket的 getoutputstream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。

4、 系统功能描述及软件模块划分

4.1 系统功能描述

4.1.1单版本人机对抗

a) 玩家通过上、下、左、右按钮控制坦克的八个方向:上、下、左、右、左上、右上、左下、右下;

b) 十辆敌军坦克出现了,它们自由移动并发射炮弹;

c)玩家通过“control”键发射炮弹;

d) 击中敌人或被敌人击中,死亡;

e)碰撞时死亡。

4.1.2网络作战模式

基于人机对抗模式下的人机功能,增加以下功能实现网络作战功能:

a) 增加网络功能,使不同电脑的两个或多个玩家通过一定的网络连接加入游戏;

b)能够自动分组选择阵营,一红一篮双方交替进入游戏,填写自己的游戏信息,各个玩家之间实现网络对战功能,并且同是一方的坦克不能相互攻击;

c) 玩家id是自动分配的,使用增量模式。

4.1.3总体功能设计

坦克战争游戏主要实现玩家参与游戏的全过程。整个网络版坦克战争游戏流程图如图4.1所示:

图4.1坦克战争**游戏流程

4.2 软件模块划分

4.2.1 tankclient类的基本功能分析

tankclient类是整个系统的核心部分,承担着整个系统所有可实现功能的调度。这是整个游戏进行的地方。tankclient类的设计流程图如图4.2所示:

图4.2 tankclient类的设计过程

tankclient类是主类,通过调用其他类中封装的方法来使整个系统运行起来,下面显示tankclient与各个类之间的关系如图4.3所示:

图4.3游戏系统类关联

4.2.2储罐基本功能分析

tank类中,封装了一些变量属性,包括坦克自己的大小(width,hright),运动速度(sprrd_x:在x轴方向的速度;speed_y:在y轴方向的速度)、生命值控制(life)、坦克编号(id)、坦克名(name)、方向控制(dir)、生死控制(live)等。

tank类中没有main函数,不是主类,它当中只封装一些变量属性和静态方法,被tankclient类调用来实现坦克的一系列动作。罐类的主要方法如下:

(1)getrect()方法

public rectangle getrect()

rectangle类是碰撞检测的辅助类,通过得到子弹的x,y坐标和宽高度,检测两个矩形是否碰撞(相交);

(2) draw()方法:负责绘制屏幕上的所有活动;

(3)move()方法:主要负责控制坦克的移动,包括8个方向(左,左上,上,右上,右,右下,下,左下)的控制以及给坦克一个移动的速度;

(4)keypressed()方法:设定使用键盘的键控制坦克移动;

(5)keyreleased()方法:处理按键抬起事件,抬起“ctrl”键时,发射炮弹并加入新炮弹,能够逐一发射每一发炮弹、抬起“a”键可以发射超级炮弹等功能;

(6)locationdirection()方法:定义了炮筒方向,可以向八个方向发射炮弹;

(7)fire()方法:处理发送子弹的方法;

(8) bumpwithwall()方法:主要负责处理油罐碰壁事件;

(9)bumpwithtank()方法:主要到负责处理坦克和坦克相撞事件;

4.2.3任务类基本功能分析

misslile(子弹)类和tank类一样,只封装一些变量属性和静态方法,主要变量包括:子弹自己的大小(width,hright),运动速度(sprrd_x:在x轴方向的速度;speed_y:

在y轴方向的速度)、子弹标示(id)、所属坦克的id号(tankid用于网络版)等。misslie类持有一个tankclient类(大管家)的引用tc,tankclient类要执行发射炮弹操作时调用missile类中的方法。misslie类中的主要方法如下:

(1) draw()方法:负责绘制子弹的所有活动;

(2) move()方法:先判断方向,再移动,给它一定的移动速度;

(3) getrect()方法:负责获取子弹的外接正方形,为碰撞检测做准备;

(4) 方法:检查子弹是否击中坦克。如果击中坦克,返回真,否则返回假;

(5) hittanks()方法:检测是否命中一系列坦克中的一个;

(6) hitwall()方法:检测子弹是否与墙碰撞。

4.2.4**类的基本功能分析

explode(**)类也是一个只封装自己的变量和方法的外部包装类,没有main方法,供tankclient主类需要时调用它的draw()方法,当子弹击中坦克时需要产生**。

4.2.5服务器基本功能分析

tankserver(服务器)类主要负责在网络对战游戏时维护各个**玩家的基本信息,并动态的维护玩家列表。联机模式下的类图如图4.4所示:

4.4**模式类关联图

4.2.6信息传输的基本功能分析

信息传输类用于封装客户机和服务器之间的交互信息。将网络中传递的许多信息封装成可串行化的类将使程序具有良好的可扩展性。

五、设计步骤

5.1坦克战斗游戏单机版(人机对抗)

5.1.1主程序:tankclient

**如下:

public class tankclient extends frame ;

random r = new random();

tank mytank1 = new tank(750, 550, tank.direction.stop, this, 1);

tank mytank2 = new tank(50, 550, tank.direction.stop, this, 2);

《计算机网络系统实践》报告详解(二)

设计题目:端口扫描工具设计与实现

学生姓名:王宇

学号:***

专业班级:计算机科学与技术09—2班

一、设计要求

1. 实现一个功能比较简单的、具有图形界面的端口扫描工具,主线程响应用户界面操作,工作线程完成端口扫描等工作;

2. 能够扫描指定ip地址的主机/服务器开放了哪些端口;

3. 能够扫描指定ip地址范围内的哪些主机/服务器开放了特定端口,如常见的tcp端口ftp(21)、**tp(25),udp端口dns(53)、snmp(161);

二、开发环境与工具

1. 开发环境:pc机及其组成的局域网

2. 开发工具:eclipse sdk

三、设计原理

1.tcp connect 扫描

通过进行端口扫描,根据远程主机开放的端口,可以初步确定对方提供的服务类型。进行端口扫描最常用的方式就是尝试与远程主机的端口建立一次正常的tcp连接。若连接成功则表示目标端口开放。

这种扫描技术称为“tcp connect扫描”,tcp connect扫描是tcp端口扫描的基础,也是最直接的端口扫描方法。它实现起来非常容易,只需要在软件编程中调用socket api的connect()函数去连接目标主机的指定端口,完成一次完整的tcp 3次握手连接建立过程,根据对方的反应,就可以简单地判断出目标端口是否开放。

2.tcp连接建立过程

扫描主机通过tcp/ip协议的3次握手与目标主机的指定端口建立一次完整的连接。连接由系统调用connect()开始。如果端口开放,则连接建立成功;否则,则返回-1,表示端口关闭。

① client端发送syn;

② server端返回syn/ack,表明端口开放;

③ client端返回ack,表明连接已建立;

④ client端主动断开连接。

3.mfc界面以及多线程调用

本次课程设计界面开发采用的是mfc类库编辑,使得用户操作界面更加的美化以及方便,调用了大量的系统函数。同时,为了加快扫描的效率,调用了多线程对多端口并发的进行扫描,节约了大量的时间,提高了软件的工作效率。

4、系统功能描述及软件模块划分

1.软件功能:

(1)对单ip地址和单端口进行扫描;

(2)对单ip地址和多端口进行扫描;

(3)对多ip地址和单端口进行扫描;

(4)对多ip地址和多端口进行扫描;

(5)可以手动指定线程数来进行端口扫描;

2. 软件模块划分

(1)操作界面部分

用户需要根据需求手动输入ip区间和需要扫描的端口范围或端口号,同时指定开启的线程数来并发的完成扫描工作。

(2)创建的线程部分

计算开启线程次数,初始化相关变量,创建子进程来分配端口扫描任务。

五、设计步骤

1.tcp connect扫描程序简单流程

2.核心功能模块的实现代码

package portscan;

import

import java.awt.flowlayout;

import java.awt.label;

import java.awt.event.actionevent;

import java.awt.event.actionlistener;

import java.io.ioexception;

import

import

import

import javax.swing.jbutton;

import javax.swing.jdialog;

import javax.swing.jframe;

import #url#anel;

import javax.swing.jtextarea;

import javax.swing.jtextfield;

class tcpthread extends thread

public void run()

threadscan.result.append(",");

}catch (ioexception e){}

}if (i==max_port)}}

class cancleaction implements actionlistener

}class submitaction implements actionlistener

catch(numberformatexception e)

trycatch(unknownhostexception e)

if(minport<0 || minport>65535 || minport>maxport)

else tcpthread.min_port=minport;

if(maxport<0 || maxport>65535 || maxport

else tcpthread.max_port=maxport;

if(maxthread<1 || maxthread>200)

threadscan.result.settext("");

threadscan.result.append("正在扫描 "+threadscan.

hostname.gettext()+" 线程数 "+threadscan.maxthread.

gettext()+"\n");

threadscan.result.append("开放端口: ");

for(int i=0;i