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();
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_33591873/article/details/107988879
今日推荐