long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

扫雷项目相关笔记

Posted at 2019-05-13 笔记 java 

vector 是线程安全的

在发送数据到服务器的时候,发送数据线程,从共享变量senddatas中取出要发送的数值并发送到服务器,但是这时候可能有新的数据加入,这时候需要保证数据的线程安全,而arrarylist不是线程安全的。

开启发送线程的原因

数据突发太大,会将还没发送出去的信息覆盖。设置发送数据时间间隔大于30ms才不至于被覆盖。

客户端与服务器数据请求格式json

1、type 数据类型
2、value 数据的值
从客户端请求的数据类型如下
1、登入请求

1
2
3
4
5
{
"type" : "Login",
"account" : "1234556",
"password" : "21fefefefesdfs"
}

2、登出请求

1
2
3
{
"type" : "Logout"
}

3、转发数据请求(更新雷区)

1
2
3
4
5
6
{
"type" : "Transmit",
"x":"1",
"y":"2",
"value":"1 | 2| -1"
}

4、游戏结束请求

1
2
3
4
5
6
{
"type": "GameOver",
"status": "win|defeat",
"costTime": "34323 | -1",
"description":"关于游戏结束的描述"
}

5、匹配游戏请求

1
2
3
{
"type": "Math"
}

服务器返回数据类型

1、登陆成功

1
2
3
4
{
"type":"LoginSuccess",
"value": "account"
}

2、登陆失败

1
2
3
4
{
"type":"LoginFailure",
"value":"failure-type"
}

责任链产生请求和处理请求说明

1、EvenType.SENDDATA 发送数据的请求
2、EvenType.UPDATE 更新雷区的请求
3、EvenType.LOGIN 登陆游戏请求
4、EvenType.CLICK 鼠标点击雷区请求


MyMouseListener.java 鼠标监听类

产生: 点击雷区之后,产生鼠标点击请求(EvenType.CLICK)
处理: 无

Conection.java 连接服务器类

产生:
1、更新数据请求(EvenType.UPDATE) 这个更新信息是从服务器传送过来的
处理:
1、发送的数据请求(EvenType.SENDDATA)将数据发送到服务器
2、登陆请求(EvenType.LOGIN) 将登陆信息发送到服务器?两者是否能合并?

Core.java 游戏核心类

产生:
1、更新雷区请求(EvenType.UPDATE)经过计算之后需要更新雷区数据
2、游戏结束请求()
处理:
1、鼠标的点击请求(EvenType.CLICK) 调用函数计算该请求导致的结果

MineFile.java 雷区显示类

产生: 发送数据请求(EvenType.SENDDATA),主要是将雷区更新的数据发送到服务器,
处理: 更新雷区的请求(EvenType.UPDATE),根据传过来的数据更新雷区的显示

LoginPanel.java 登陆面板

产生: 登陆游戏请求(EvenType.LOGIN),传递的数据是账号和hash取值后的密码
处理: 无

OperatePanel.java 操作面板

产生: 开始匹配游戏请求
处理: 待定

责任链中数据传输格式

旧版
MineFile.java

###java引用调用和按值调用
对象引用调用,类似于C中的指针。这样可以在B类对象中引入A类对象,这样便可以调用A类对象中的函数,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.test;

// 引用调用
class A {
private int a = 99;
A(){
}
public void add(int i){
this.a += i;
}
public void print(){
System.out.println(a);
}
}

class B {
B(){}
public void addA(A a){
a.add(1); // 引用a
}
public void addInt(int i2, int j){
i2 = i2 + j;
}
}
public class testReference {
public static void main(String[] argv){
A a = new A();
B b = new B();
b.addA(a);
a.print(); // 输出100
A a1 = a; //
b.addA(a1);
a1.print(); // 预计是101

int i=1;
b.addInt(i,19);
System.out.println(i); // 结果为1
}
}

在b中操作a的函数。这样可以在core类中调用Login中的关闭函数

使用implement runable 和继承线程extend Thread 的一些区别

使用实现接口的话,对象调用run函数之后。该对象之后的语句并不会执行,直到run执行完毕。而使用继承的话,线程对象调用,start函数之后。该对象之后的语句可以执行。

Share 

 Previous post: Payload爬虫 Next post: git常用操作 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo