(一)OIS和TCP/IP各层的结构、功能、协议

之前学过计算机网络相关的知识,最近好像忘得差不多了,再重新拿起课本,进行学习。

参考模型

各层的功能:

  1. 物理层:定义了为建立、维护和拆除物理链路所需的机械的、电气的、功能的和规程的特性,其作用是使原始的数据比特流能在物理媒体上传输。具体涉及接插件的规格、“0”,“1”信号的电平表示、首发双方的协调等内容。
  2. 数据链路层:比特流被组织成数据链路协议数据单元(通常称为帧),并以其为单位进行传输,帧中包含地址、控制、数据及校验码等信息。数据链路层的主要作用是通过校验、确认和反馈重发等手段,将不可靠的物理链路改造成对网络层来说无差错的数据链路。数据链路层还要协调收发双方的数据传输速率,即进行流量控制,以防止接收方因来不及处理发送方来的高速数据而导致缓冲器溢出即线路阻塞。
  3. 网络层:数据以网络协议数据单元(分组)为单位进行传输。网络层关心的是通信子网的运行控制,主要解决如何使数据分组跨越通信子网从源传送到目的地的问题。这就需要在通信子网中进行路由选择。另外,为避免通信子网中出现过多的分组而造成网络阻塞。需要对流入的分组数量进行控制。当分组要跨越多个通信子网才能达到目的地时,还要解决网际互连的问题。
  4. 传输层:是第一个端-端,即主机-主机的层次。传输层提供的端到端的透明数据运输服务,使高层用户不必关心通信子网的存在,由此用统一的运输原语书写的高层软件便可运行于任何通信子网上。传输层还要处理端到端的差错控制流量控制问题。
  5. 会话层:是进程-进程的层次,其主要功能是组织和同步不同的主机上各种通信间的通信(也称为对话)。会话层负责在两个会话层实体之间进行对话连接的建立和拆除。在半双工情况下,会话层提供一种数据权标来控制某一方何时有权发送数据。会话层还提供在数据流中插入同步点的机制,使得数据传输因网络故障而中断后,可以不必从头开始而仅传输最近一个同步点以后的数据。
  6. 表示层:为上层用户提供共同的数据或信息的语法表示变换。为了让采用不同编码方法的计算机在通信中能相互理解数据的内容,可以采用抽象的数据结构,并将计算机内部的表示形式转换成网络通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的表示变换功能。
  7. 应用层:是开放系统互联环境的最高层。不同的应用层为特定类型的网络应用提供访问OSI环境的手段。网络环境下不同主机间的文件传送访问和管理(FTAM)、传送标准电子邮件的文电处理系统(MHS)、使不同类型的终端和主机通过网络交互访问的虚拟终端(VT)协议等都属于应用层的范畴。

物理层:RJ45、CLOCK、IEEE802.3

数据链路:PPP、FR、HDLC、VLAN、MAC

网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGMP

传输层:TCP、UDP、SPX

会话层:RPC、SQL、NETBIOS、NFS

表示层:JPEG、MPEG、ASCII、MIDI

应用层:RIP、BGP、FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个简单的Java贪吃蛇小游戏示例,具有存档和难度调整功能。在游戏中,玩家通过控制蛇的移动来吃食物并获得分数,蛇的长度会随着吃下的食物增加而增加,如果蛇头碰到了墙壁或者自己的身体,则游戏结束。 ```java import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; public class SnakeGame extends JPanel implements ActionListener, KeyListener { private static final long serialVersionUID = 1L; // 游戏界面的大小 private static final int WIDTH = 600; private static final int HEIGHT = 600; // 蛇的初始长度 private static final int INITIAL_SNAKE_LENGTH = 5; // 蛇头的位置 private Point head; // 蛇的身体 private ArrayList<Point> body; // 食物的位置 private Point food; // 游戏的分数 private int score; // 游戏的速度 private int speed; // 游戏的难度 private int difficulty; // 游戏是否结束 private boolean gameOver; // 游戏是否在运行 private boolean running; // 游戏的计时器 private Timer timer; public SnakeGame() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setBackground(Color.BLACK); setFocusable(true); addKeyListener(this); // 初始化游戏 initGame(); } // 初始化游戏 private void initGame() { head = new Point(WIDTH / 2, HEIGHT / 2); body = new ArrayList<Point>(); for (int i = 0; i < INITIAL_SNAKE_LENGTH; i++) { body.add(new Point(head.x - i * 20, head.y)); } food = new Point(); generateFood(); score = 0; speed = 150; difficulty = 1; gameOver = false; running = false; timer = new Timer(speed, this); timer.stop(); } // 生成食物的位置 private void generateFood() { Random random = new Random(); int x = random.nextInt(WIDTH / 20) * 20; int y = random.nextInt(HEIGHT / 20) * 20; food.setLocation(x, y); } // 保存游戏 private void saveGame() { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("snake.sav")))) { oos.writeObject(head); oos.writeObject(body); oos.writeObject(food); oos.writeInt(score); oos.writeInt(speed); oos.writeInt(difficulty); oos.flush(); System.out.println("Game saved."); } catch (IOException e) { e.printStackTrace(); } } // 加载游戏 private void loadGame() { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("snake.sav")))) { head = (Point) ois.readObject(); body = (ArrayList<Point>) ois.readObject(); food = (Point) ois.readObject(); score = ois.readInt(); speed = ois.readInt(); difficulty = ois.readInt(); System.out.println("Game loaded."); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } // 开始游戏 public void startGame() { running = true; timer.start(); } // 结束游戏 private void endGame() { running = false; gameOver = true; timer.stop(); JOptionPane.showMessageDialog(this, "Game Over! Your score is " + score + ".", "Game Over", JOptionPane.INFORMATION_MESSAGE); initGame(); } @Override public void actionPerformed(ActionEvent e) { if (!gameOver) { // 移动蛇的身体 for (int i = body.size() - 1; i > 0; i--) { body.get(i).setLocation(body.get(i - 1)); } // 移动蛇的头 if (head.x == food.x && head.y == food.y) { body.add(new Point(head)); generateFood(); score += 10 * difficulty; } if (head.x < 0 || head.x >= WIDTH || head.y < 0 || head.y >= HEIGHT) { endGame(); } else { for (int i = 1; i < body.size(); i++) { if (head.x == body.get(i).x && head.y == body.get(i).y) { endGame(); } } } if (!gameOver) { switch (difficulty) { case 1: speed = 150; break; case 2: speed = 100; break; case 3: speed = 50; break; } timer.setDelay(speed); switch (direction) { case KeyEvent.VK_LEFT: head.translate(-20, 0); break; case KeyEvent.VK_RIGHT: head.translate(20, 0); break; case KeyEvent.VK_UP: head.translate(0, -20); break; case KeyEvent.VK_DOWN: head.translate(0, 20); break; } } repaint(); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.BOLD, 20)); g.drawString("Score: " + score, 10, 30); g.drawString("Difficulty: " + difficulty, 400, 30); g.setColor(Color.GREEN); g.fillRect(food.x, food.y, 20, 20); g.setColor(Color.WHITE); for (Point p : body) { g.fillRect(p.x, p.y, 20, 20); } if (gameOver) { g.setFont(new Font("Arial", Font.BOLD, 40)); g.drawString("Game Over", WIDTH / 2 - 100, HEIGHT / 2 - 20); } } private int direction; @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) { if (direction == 0 || direction != keyCode - 2 && direction != keyCode + 2) { direction = keyCode; } } else if (keyCode == KeyEvent.VK_SPACE) { if (running) { timer.stop(); running = false; } else { timer.start(); running = true; } } else if (keyCode == KeyEvent.VK_S) { saveGame(); } else if (keyCode == KeyEvent.VK_L) { loadGame(); } else if (keyCode == KeyEvent.VK_1) { difficulty = 1; } else if (keyCode == KeyEvent.VK_2) { difficulty = 2; } else if (keyCode == KeyEvent.VK_3) { difficulty = 3; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } public static void main(String[] args) { JFrame frame = new JFrame("Snake Game"); SnakeGame game = new SnakeGame(); frame.getContentPane().add(game); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); game.startGame(); } } ``` 该游戏具有以下功能: - 初始化游戏:在游戏开始前,创建蛇的初始状态、食物的位置、分数、速度、难度等状态。 - 生成食物:随机生成食物的位置。 - 保存游戏:在游戏进行中,可以按下“S”键保存游戏状态。 - 加载游戏:在游戏开始前,可以按下“L”键加载游戏状态。 - 开始游戏:在游戏开始前,可以调用startGame()方法开始游戏。 - 结束游戏:在游戏结束时,弹出对话框显示分数,并初始化游戏状态。 - 移动蛇的身体:在每一次计时器事件中,更新蛇的身体位置。 - 移动蛇的头:在每一次计时器事件中,根据方向更新蛇头位置。 - 判断游戏是否结束:在每一次计时器事件中,判断蛇是否碰到墙壁或者自己的身体。 - 保存游戏:在游戏进行中,可以按下“S”键保存游戏状态。 - 加载游戏:在游戏开始前,可以按下“L”键加载游戏状态。 - 调整难度:在游戏进行中,可以按下“1”、“2”、“3”键调整游戏难度。 在这个示例中,我们使用了Java的面向对象特性,将游戏界面封装为一个JPanel,通过添加KeyListener来监听用户的输入,使用Timer来控制游戏的运行。同时,我们还使用了Java的序列化机制来保存和加载游戏状态,实现了游戏的存档功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值