首先你要忘掉网上发表的繁琐的架设教程,那都是有意无意的骗子,按本方法保证能很方便地架起自己的真征服务器。
一,机器需求。
内存必须大,建议4G,cpu要求不高,只要是64位的就行,比用amd
4200+,这套机器下来,价格在2000元元以下。
二,安装RHEL
50,可以电驴上搜索,DVD版的,下载后打人刻在一张DVD盘上。
Red
Hat
Enterprise
Linux
(Server
including
virtualization)系列号:2515dd4e215225dd
安装时,选则上mysql
web
等服务,其它可以不选,玩不转linux的人请关闭防火墙。
三,安装成功后,进入图形界面,界面很容易上手,在这里把网卡IP设好,这里假设为
1921680200
然后
服务
中把
mysqld
>
UE官方多用户编辑,其实现是一个C/S架构的方案,官方文档: Multi-User Editing 。
UE官方推出了一个多人协作机制,可以使多人共同地编辑同一份地图,并不会造成冲突,并且可以同步其他变动的资源并能够实时生效,能够比较完美地解决协同协作的痛点,本篇文章记录一下启用流程和使用规范以及如何绕过内网的端口限制等问题。
本质上是创建一个Server进程,用于管理多用户编辑的Session,并向各个Client之间传递相互变动的数据。每个Session代表着协同编辑的一个“房间”,只有加入到这个“房间”的人,才能够实时地预览和同步其他人的提交,每个Server上可以创建多个Session,可以由不同的用户创建、加入。
注意 :UE并不是直接把变动的资源拷贝到各个Client,而是通过传递变动的数据到各个Client实现相同的表现,在传输效率上更好,但会带来一个问题,对于相同 *** 作的资源,对于uasset来说,并不完全相同,即A用户修改了Weaponuasset,将会把变动的数据同步到B用户,如果A和B用户都提交了Weapon这个资源,他们的二进制并不完全相同,在合并提交时会有冲突,提交规范还是需要注意的。
多用户编辑支持,依赖UE的 Multi-User Editing 插件:
启用之后可以在 Project Settings - Plugins 中看到 Multi-User Editing 和 Multi-User Transactions 选项:
能够配置多用户协作的参数。
在开启插件之后,可以在编辑器 Windows - Developer Tools 中看到 Multi-User Browser 选项(也可以在 Project Settings - Plugins - Multi-User Editing 中开启 Enable Multi-User Toolbar Button ):
启动之后会自动搜索网络内可见的 UnrealMultiUserServer 服务器
也可以通过 Launch a Server 拉起一个 UnrealMultiUserServer 进程,在本地创建一个Server。通常情况下,会有一个独立的机器作为Server,供其他用户连接。
Mulit-User Browser 作为Client连接Server时,使用的是UDP协议,默认连接端口号为 6666 ( Launch a Server 启动默认是6666),也可以自己修改想要指定的端口号,Client会自动检测网络内可达的Server列表,创建Session时可以选择在哪个Server上创建。
注意 : Mulit-User Browser 依赖 UDP Messaging 插件作为网络传输的方式,所以,如果我们想要修改默认连接的端口号,就需要修改 UDP Messaging 中的默认端口号。
可以在 Project Settings - Plugins - Networking 中修改(将 230001:6666 修改为 230001:XXXXX 即可):
注意 :230001是RFC 5771(IPV4)和RFC 4291(IPV6)定义的多播地址,不能改成其他的地址。
修改完毕后,启动UnrealMultiUserServer即可使用变动后的端口:
前面介绍是从UE编辑器中通过 Multi-User Browser 中Launch a Server,但是对于Server而言,其实并不需要启动编辑器,UE也是通过拉起一个新的进程传递命令行参数来启动Server的,所以,我们可以自己使用命令行来启动 Multi-User Server :
注意,因为Multi-User Editing使用的是UDP协议,所以指定的端口必须被防火墙放行才能够检测到Server。
Windows可以使用以下批处理进行添加防火墙规则,保存为 bat 使用管理员权限执行即可:
Mac和Linux可以使用ufw进行防火墙配置:
Java多人聊天可以使用Java的Socket编程实现,主要的思路是:使用服务器来维护所有客户端的连接,并将客户端之间的聊天信息进行转发。
具体的实现步骤如下:
创建服务器端:使用ServerSocket类创建一个服务器端,并监听指定的端口,等待客户端的连接。
创建客户端:使用Socket类创建一个客户端,并连接到服务器端。
实现聊天功能:客户端和服务器端之间可以通过输入和输出流进行通信,客户端将聊天信息发送给服务器,服务器再将其转发给其他客户端。
处理异常:在实现聊天功能时,需要注意处理可能出现的异常,例如连接异常、输入输出异常等等。
一个简单的Java多人聊天程序的代码框架如下:
服务器端:
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
import javautilArrayList;
public class ChatServer {
private ServerSocket serverSocket;
private ArrayList<ClientHandler> clients;
public ChatServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
clients = new ArrayList<ClientHandler>();
Systemoutprintln("服务器已启动,等待客户端连接");
}
public void start() throws IOException {
while (true) {
Socket socket = serverSocketaccept();
ClientHandler client = new ClientHandler(socket, this);
clientsadd(client);
clientstart();
}
}
public void broadcast(String message) {
for (ClientHandler client : clients) {
clientsendMessage(message);
}
}
public void removeClient(ClientHandler client) {
clientsremove(client);
}
public static void main(String[] args) throws IOException {
ChatServer server = new ChatServer(12345);
serverstart();
}
}
客户端:
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintWriter;
import javanetSocket;
public class ChatClient {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
private String name;
public ChatClient(String serverAddress, int port, String name) throws IOException {
socket = new Socket(serverAddress, port);
reader = new BufferedReader(new InputStreamReader(socketgetInputStream()));
writer = new PrintWriter(socketgetOutputStream(), true);
thisname = name;
}
public void start() throws IOException {
Systemoutprintln("欢迎来到聊天室!");
new Thread(new IncomingMessageHandler())start();
new Thread(new OutgoingMessageHandler())start();
}
private class IncomingMessageHandler implements Runnable {
@Override
public void run() {
try {
while (true) {
String message = readerreadLine();
if (message == null) {
break;
}
Systemoutprintln(message);
}
} catch (IOException e) {
eprintStackTrace();
} finally {
close();
}
}
}
private class OutgoingMessageHandler implements Runnable {
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(Systemin));
try {
while (true) {
String message = readerreadLine();
if (messageequals("quit")) {
break;
}
writerprintln(name + ": " + message);
}
} catch (IOException e) {
eprintStackTrace;
} finally {
close();
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)