一、游戏效果
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