书籍介绍

本节书摘来自异步社区《Android 游戏案例开发大全(第4版)》一书中的第5章,第5.4节的一个Android程序——双人联网操控飞机案例,作者 吴亚峰 , 于复兴 , 苏亚光,更多章节内容可以访问云栖社区“异步社区”公众号查看

android中案例 安卓案例_局域网

双人联网操控飞机案例

项目介绍

这个项目是在Android平台下基于socket套接字的网络游戏开发,两个玩家分别点击各自手机上的按钮连接同一局域网,当网络连接成功后,两个手机的屏幕上同时呈现两架飞机,每个玩家控制一架飞机。当任一玩家移动遥杆操控自己的飞机时,手机屏幕都会同步更新飞机的位置。

问题1

运行程序后,屏幕上会出现“等待连接。。。”的字样。如图所示

android中案例 安卓案例_socket_02

问题原因

问题的原因就是他所说的,没有连接到服务器,所以解决问题的方法是连接到服务器。

解决办法

1.在自己的电脑上运行服务器端程序。我是在eclipse上运行服务器端程序serverthread。运行结果如下

android中案例 安卓案例_局域网_03


服务器正在等待客户端的连接。

2.在AndroidManifest.xml中添加网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

3.使自己的手机连接与自己的电脑处于同一局域网。方法是电脑开启移动热点,手机连接到电脑的热点。

android中案例 安卓案例_IP_04


4.修改IP,在项目中的networkthread.java中的run()方法里,代码中的IP不是自己电脑的IP,所以无法通过IP连接到服务器。

sc=new Socket("192.168.137.1", 9999);//连接服务器

故需要修改IP,方法如下

(1)打开命令提示符(cmd)

android中案例 安卓案例_IP_05


(2)通过ipconfig命令,获取本地连接2的IPv4地址。注意这里获取的是本地连接2的IPv4地址,不要弄错了。

android中案例 安卓案例_android_06


(3)用它替换掉书中代码的IP,IP问题就解决了。

5.启动networkthread线程。

书中说王佳点击手机上的菜单键连接同一局域网,然而并没有什么菜单键。通过查资料得知,菜单键只有在早期的安卓手机才有,在Android 4时就没有了。现在已经是Android 10了。所以我在界面上添加按钮,通过单击按钮来启动networkthread线程。

package com.example.client;


import com.example.client.thread.KeyThread;
import com.example.client.thread.NetworkThread;
import com.example.clinet.view.GameView;
import com.example.util.GameData;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {
    public int KeyDispX=0;//方向x
    public int KeyDispY=0;//方向y
    public Bitmap planer;
    public Bitmap planeg;
    public GameData gd=new GameData();
    public KeyThread kt=new KeyThread(this);
    public 	NetworkThread nt;
    GameView gv;
    Button button1;//按钮的引用
    public Handler handler=null;//声明Handler对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);//得到布局中的按钮引用 button1.setOnClickListener(this);//添加监听
        button1.setOnClickListener(this);//添加监听
        this.handler=new Handler();//创建属于主线程的handler
        planer=BitmapFactory.decodeResource(getResources(), R.drawable.red);//红飞机
        planeg=BitmapFactory.decodeResource(getResources(), R.drawable.yellow);//黄飞机
        gv=(GameView)this.findViewById(R.id.mf1);
    }

    public void onClick(View v) {//点击按钮后执行的代码
        if(v == button1){
            if(this.nt==null)
            {//若没有启动networkthread线程,则启动networkthread线程
                this.nt=new NetworkThread(MainActivity.this);
                this.nt.start();
            }
        }
    }
}

运行结果

客户端

android中案例 安卓案例_IP_07


服务器端

android中案例 安卓案例_IP_08