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

   日期:2020-08-20     浏览:88    评论:0    
核心提示:一、游戏效果 Java网络编程联机3D坦克大战 二、游戏涉及知识服务器端运用了 IO、线程、网络、面向对象、异常 的内容,客户端使用 unity3d引擎进行开发三、服务器设计思路1.实例化Socket服务器,并指定端口号2.主线程循环监听多个客户端的连接,并将每个客户端连接保存在集合中3.启动接收数据子线程对象,每建立一个连接,则启动一个子线程来处理数据的广播四、服

一、游戏效果

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;


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

    }
}

五、项目下载

https://download.csdn.net/download/qq_33591873/12710603

有什么不懂的可以加我QQ私聊我

原创:北榛
QQ:1912075649

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服