我正在开发多人游戏,无法找出如何将其他客户端连接到所创建的游戏。我的意思是客户端A创建与服务器的套接字连接,其他客户端(A,B
…)如何连接到客户端A?有人可以帮我吗?
PS我是网络编程的新手,因此,如果您可以举一些例子,我将不胜感激。
另一个客户端由于其防火墙而无法连接到客户端A。
您可以创建两种主要的网络:
服务器客户端
点对点
但是客户端可以将一些数据保存到服务器,服务器可以将它们发送给所有客户端(您不需要点对点网络就可以让客户端B向客户端A发送一些数据)。
示例:客户端B将其地图位置发送到服务器,服务器将数据发送给所有客户端,因此客户端A能够在客户端B的位置绘制字符图块。
要将两台PC连接在一起,您需要将端口从服务器的调制解调器转发到用作服务器的PC,然后从用作服务器的PC的防火墙打开该端口。
您还可以在这里看看如何使用python创建一个多人游戏,我举了一个示例,其中客户端可以将它们与IRC连接在一起,并可以玩井字游戏(因此您不必管理服务器)
)。我在这篇文章的结尾添加了一个Java示例。
一个简单的服务器示例:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class Server
{
public static void main(String[] args) throws Exception
{
ServerSocket listener = new ServerSocket(4000);
String line;
try
{
while (true)
{
Socket socket = listener.accept();
BufferedReader readerChannel = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writerChannel = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
try
{
writerChannel.write(new Date().toString() + "\n\r");
writerChannel.flush();
while ((line = readerChannel.readLine()) != null)
{
System.out.println(line);
}
}
finally
{
socket.close();
}
}
}
finally
{
listener.close();
}
}
}
一个简单的客户端示例:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;
public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 4000);
BufferedWriter writerChannel = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader readerChannel = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
writerChannel.write(new Date().toString() + "\n\r");
writerChannel.flush();
while ((line = readerChannel.readLine()) != null)
{
System.out.println(line);
}
}
}
还可以看看:
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class Client
{
public static void main(String[] args) throws Exception
{
SSLSocketFactory socketBuilder = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) socketBuilder.createSocket("127.0.0.1", 4000);
}
}
一个简单的IRC示例:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class Client
{
public static void main(String[] args) throws Exception
{
SSLSocketFactory socketBuilder = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) socketBuilder.createSocket("irc.freenode.net", 6697);
BufferedWriter writerChannel = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader readerChannel = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line, computerName, nick, login, channel = "#bot", channelPassword = "";
long id = 1;
computerName = java.net.InetAddress.getLocalHost().getHostName();
nick = computerName + "_" + id;
login = computerName + "_" + id;
writerChannel.write("NICK " + nick + "\r\n"); // Join IRC with a specific Nick
writerChannel.write("USER " + login + " 8 * :" + login + " \r\n"); // Join IRC with a specific User
writerChannel.flush();
while ((line = readerChannel.readLine()) != null)
{
if (line.indexOf("004") != -1) // If connected
{
break;
}
else if (line.indexOf("433") != -1) // If Nick already in use
{
id++;
nick = computerName + "_" + id;
login = computerName + "_" + id;
writerChannel.write("NICK " + nick + "\r\n");
writerChannel.write("USER " + login + " 8 * :" + login + " \r\n");
writerChannel.flush();
}
}
writerChannel.write("JOIN " + channel + " " + channelPassword + "\r\n"); // Join a channel
writerChannel.flush();
while ((line = readerChannel.readLine()) != null)
{
try
{
line = line.substring(line.indexOf("#"));
channel = line.substring(0, line.indexOf(" "));
if (line.toLowerCase().startsWith("ping")) // avoid ping time-out
{
writerChannel.write("PONG :" + line.substring(5) + "\r\n");
writerChannel.flush();
}
else if (line.toLowerCase().contains("!ping"))
{
writerChannel.write("PRIVMSG " + channel + " :pong\r\n");
writerChannel.flush();
}
else if (line.toLowerCase().contains("!join"))
{
String newChannel = line.substring(line.indexOf("!join") + 6);
int stringPosition;
if ((stringPosition = newChannel.indexOf(" ")) != -1)
{
String newPassword = newChannel.substring(stringPosition + 1);
newChannel = newChannel.substring(0, stringPosition);
writerChannel.write("JOIN " + newChannel + " " + newPassword + "\r\n");
writerChannel.flush();
}
else
{
writerChannel.write("JOIN " + newChannel + "\r\n");
writerChannel.flush();
}
}
else if (line.toLowerCase().contains("!leave"))
{
writerChannel.write("PART " + channel + "\r\n");
writerChannel.flush();
}
else if (line.toLowerCase().contains("!quit"))
{
writerChannel.write("QUIT\r\n");
writerChannel.flush();
System.exit(0);
}
}
catch (Exception e)
{
}
}
}
}
我无法为您提供对等网络的示例,因为我从未这样做过。这确实很困难,您必须在互联网上进行大量研究。
更多信息:
https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
https://docs.oracle.com/javase/tutorial/networking/sockets/
http://www.oracle.com/technetwork/java/socket-140484.html
您需要一个多线程服务器来处理许多不同的连接。
提示-我已经回答了一些类似的问题。 即使编程语言有时有所不同,我也会为您提供链接,但逻辑总是相同的,因此可以为您提供帮助:
在python中创建多人游戏
Xcode Mass Multiplayer(不是您可能在想的)
MMO如何处理真人游戏的每一刻为成千上万的玩家计算和发送数据包?
实习,捕鱼棋牌类项目 # 一面 7/26 21min ## C++ 栈和堆的区别 const int *p 和 int * cont p 的区别 const 对象能调用全部成员函数吗 继承 public private protected 的区别 class struct 怎么计算大小 内存对齐是什么,为什么要内存对齐,内存对齐的规则 小端大端的区别 ## Unity Awake Enable S
base北京,一面全程20min,面试的有点随意只能说,项目都没问。 1.怎么学习的,看过哪些书。 2.你觉得c和c++有哪些区别。 3.你写c和c++有哪些感受和体会。 4.什么是构造函数,什么是析构函数。构造函数初始化列表有什么用 5.智能指针 6.什么是移动语义,移动语义高效在哪里,什么是万能引用。 6.用到的设计模式,或者讲一下你了解的。 7.单例与static T的区别。 8.网络相关,
#游戏求职进展汇总# 一面 + 二面(技术+hr) 1. 9.5一面20min 自我介绍、简单c++、实习经历、 游戏开发(重点问状态同步) 渲染管线 玩过的游戏,意向工作地 2. 9.12二面1h 自我介绍 手撕一个数组中找最长无重复子串 实习经历:做了什么,用了什么技术,学到了什么 小游戏开发(碰撞检测,状态同步) 渲染:unity渲染管线,render feature了解什么 算法题一个三角
1.这个人物为啥要用到IK呀?哪里设置了 2.为啥要用逻辑帧?处理什么事件了? 3.描述一下你的消息框架 4.既然用单例模式了,为啥还用消息框架?(没啥必要) 5.为啥用C++去写服务端,去处理物理逻辑?(状态同步和帧同步还是不太了解)客户端也有组件可以去计算的 6.这个关卡数据,如果不同关卡各个关卡有很多个自己的特性,你要如何去建立对应的数据库?比方说用数据库去管理老师和学生的信息... 7.描
面试官像是没睡醒。。。 30min 自我介绍 项目:UI框架怎么设计的,没有层级管理会怎么样 状态机和行为树,优缺点 寻路算法有了解过吗,A*,Prim,Dijstra。prim和狄杰斯特拉的区别。 排序算法常用的有哪些?快排,归并,堆排。 快排为什么比归并快一些?归并的时间复杂度为什么是nlogn? update和fix update的区别是什么?固定桢 fixed update在unity中是
写一下AILab游戏客户端的面经吧,也分享一下我第一次面试的经历。时间线,4.14投递,4.22被捞,4.24一面,4.29二面,5.9HR面+云证,5.20offer。 一面(1h) 自我介绍 算法 LRU,在本地ide上写的,写完让写几个用例测试一下。我算法中用了unordered_map<int, list<pair<int, int>>::iterator>,说一下这里使用iterator