Java联网3D坦克大战(网络编程)

一、游戏效果

Java网络编程联机3D坦克大战

在这里插入图片描述
在这里插入图片描述

二、游戏涉及知识

服务器端运用了 IO、线程、网络、面向对象、异常 的内容,
客户端使用 unity3d引擎进行开发
、
在这里插入图片描述

三、服务器设计思路

1.实例化Socket服务器,并指定端口号
2.主线程循环监听多个客户端的连接,并将每个客户端连接保存在集合中
3.启动接收数据子线程对象,每建立一个连接,则启动一个子线程来处理数据的广播

四、服务器核心代码

package test0813.tank.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

/**
 * 3D坦克大战服务器
 */
public class TankServer {

    //创建一个存储客户端连接socket的集合
    static Vector<Socket> sockets = new Vector<>();

    public static void main(String[] args) {

        TankServer tankServer = new TankServer();
        tankServer.init();
    }

    //初始化服务器
    private void init() {

        try {
            //1.实例化Socket服务器,并指定端口号
            ServerSocket server = new ServerSocket(7777);
            System.out.println("服务器已启动,等待客户端连接中...");

            //2.主线程循环监听多个客户端的连接,并将每个客户端连接保存在集合中
            while(true){
                //接收客户端连接
                Socket socket = server.accept();
                //将此连接保存在集合中
                sockets.add(socket);
                System.out.println("当前socket:" + socket);
                System.out.println("客户端连接数据:" + sockets.size());

                //3.启动接收数据子线程对象,每建立一个连接,则启动一个子线程来处理数据的广播
                new RecvTankServerThread(socket).start();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //向所有客户端广播发送数据
    public void broadCast(byte[] data,Socket self,int length){

        //遍历sockets集合,并从每一个集合中获取输出流,将数据广播给其他客户端
        for (Socket tempSocket : sockets) {
            if(tempSocket != self){
                try {
                    OutputStream os = tempSocket.getOutputStream();
                    os.write(data,0,length);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //接收数据子线程
    class RecvTankServerThread extends Thread {

        private Socket socket;

        public RecvTankServerThread(Socket socket){
            this.socket = socket;
        }

        public void run(){
            try {
                //从socket中获取流
                InputStream is = socket.getInputStream();
                //定义字节数组,作为装字节数据的容器
                byte[] data = new byte[1024];
                //循环读取
                while(true){
                    //定义有效长度
                    int length = is.read(data);
                    //收到数据,广播给其他客户端
                    broadCast(data,socket,length);
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
========================================================== 局域网坦克大战V1.0使用说明 版权所有 (c)2011, 卓跃计算机职业培训学校。 作者 :余松鹰 ---------------------------------------------------------- 1.请确保游戏客户端(TankGame_Client.jar)的同级目录下存在img图片资源文件夹和sounds声音文件夹。 2.请确保游戏服务器端(TankGame_Server.jar)的同级目录下存在map文件夹且文件夹内至少存在一个以上的 XX.MAP文件,并且还存在游戏服务器配置文件ServerData.xml文件和用户信息文件Data.xml。 3.使用游戏地图编辑器(TankGame_MapEditer.jar)必须存在img地图编辑器图片资源文件 4.游戏开始顺序 1).打开游戏服务器端(TankGame_Server.jar)服务器端显示“服务器启动成功”。 2).打开客户端(TankGame_Client.jar)输入用户名和密码,若为新用户可注册后登录。(系统管理 员用户名admin,密码admin)。 3).点击连接服务器,控制玩家P1的用户可以选择地图,选择地图完后点击准备按钮,准备开始游 戏。 4).第二位用户登录完服务器,并按下了准备就开始游戏。 5.地图编辑器的编辑地图 1).打开地图编辑器,按照帮助菜单内的说明完成地图编辑后,保存地图将在地图编辑器的同级 目录产生一个.MAP文件,该文件既为用户编辑产生的地图。 2).将该地图放到服务器端(TankGame_Server.jar)的map文件内重启服务器端即可使用地图进行 游戏。 6.服务器端在关闭时,将在服务器端的同级目录下生产服务器日志(ServerLog.txt),该日志记录服务器 启动和关闭的时间,以及用户的登录和退出。 7.用户可在服务器配置文件(ServerData.xml)中修改服务器端口号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值