网络公司开发网站/重庆网站建设公司

一、游戏效果
知乎视频www.zhihu.com老刘的视频
· 2769 播放
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();}}}
}
五、项目下载
百度云链接: https://pan.baidu.com/s/16-Yjo26blPXLaNsfYznZbw
提取码: v3a6

作者:Bei-Zhen
链接:https://blog.csdn.net/qq_33591873/article/details/107988879
来源:CSDN博客