我有一个客户端 - 服务器应用程序 - 其中服务器本质上是一个ASP .NET Web应用程序,分布式客户端是桌面应用程序.
当客户端有新数据时,客户端需要从服务器接收一些数据.现在,这样做的方式是 - 客户端每x分钟(比如说2分钟)不断查询Web服务,并不断检查客户端是否有新数据.
理想情况下,它应该工作的方式是桌面应用程序应该在可用时接收更新,它不需要从服务器拉出; 相反,服务器应该能够推送到客户端.
我如何做到这一点 - 考虑到解决方案的架构 - Web应用程序需要将数据推送到同一网络(LAN)中的桌面应用程序(客户端)?
我试图在一个简单的客户端 - 服务器程序中说明Nagle算法.但我无法弄明白,或者让它清楚地印在我身上.
在我的示例中,客户端只生成从1到1024的int并将它们发送到服务器.服务器只是将这些int转换为十六进制字符串并将它们发送回客户端.
几乎所有我改变的结果都是相同的结果.int的发送和重新发送在256个int的块中.我在两边尝试了setTcpNoDelay(true)来查看更改,但这在我的控制台中给出了相同的结果.(但不是在wireshark中,我看到服务器和客户端之间发送的数据包的数量有很大差异)但我的目标是能够在控制台中看到它,我猜测有一些ObjectOutputStream或类似的缓冲区阻止一切?
当我output = new PrintWriter(client.getOutputStream(), true)改为false (The true或false:autoFlush- 布尔值; if true,the println,printf或者format方法将刷新输出缓冲区)时,我的服务器不再向客户端提供任何输出.
基本上我的目标是只提供服务器和/或客户端的真或假作为参数来设置TcpNoDelay,在启动时,清楚地看到控制台中输入/输出的差异.我不确定所使用的一切,所以欢迎任何帮助清除这一点.
服务器:
package Networks.Nagle;
import java.io.*;
import java.net.*;
import java.util.*;
public class NagleDemoServer
{
private static ServerSocket serverSocket;
private static final int PORT = 1234;
public static void main(String[] args) throws IOException
{
int received = 0;
String returned;
ObjectInputStream input = null;
PrintWriter output = null;
Socket client; …Run Code Online (Sandbox Code Playgroud) 我想为游戏中心构建一款iPhone游戏,目前我正在研究服务器的一部分.我通过示例学到了最好的东西,我很难找到任何简单的游戏服务器示例...
我想使用Ruby on Rails构建游戏服务器,不过我会解决使用任何框架的任何示例,只是为了理解这些概念是如何工作的.有没有人知道任何书籍或在线资源,或者显示一些关于如何构建游戏服务器的示例代码?
我不得不认为iPhone上的大多数多人游戏都需要游戏服务器,但我似乎找不到任何讨论如何构建游戏的资源.我发现讨论构建多人游戏(包括Apple的文档)的资源说过同样的事情,"开发游戏服务器超出了本书的范围,但我们将专注于连接到这种服务器所需的客户端代码. "
非常感谢您的帮助!
编辑:关于我正在努力完成的更多细节......
我正在尝试开发一种双人(可能更多)游戏,用户在竞争中比其他玩家更快地解决难题.比赛制作将由游戏中心处理,但我需要一个游戏服务器来启动/管理游戏并将结果存储在数据库中.整个过程将类似......
我试图对Android应用程序进行分区,以便在手机上部分执行它,部分在服务器上执行(服务器可以在其中运行模拟器).我已经读过Android不支持RMI.我想这样做就像客户端 - 服务器架构一样,模拟器在eclipse中运行.那么实现这个项目是否可行?任何想法都受到高度赞赏.
谢谢.
请建议实现可靠udp的java库.它将用于游戏服务器与客户端和其他服务器进行通信.
PS也许你可以推荐一些能够更高效地完成这项任务的技术(游戏服务器)?但这必须适用于Linux.
编辑:这是一个动作类型的游戏,所以它需要尽快与服务器通信.
编辑2:我发现用于FPS游戏的Enet,但它是C++,如果我每秒多次调用它会有开销吗?
谢谢阅读!
背景:
我正在为服务器开发一个Android客户端,其中需求是应用程序,需要与 WebSockets基于服务器的服务器来回连续交换消息.
实施:对于客户端,我使用weberknecht的 WebSocket Android客户端库,而服务器是Tornado基于.
问题:
目前,我祈求initWebSocketClient在onCreate通过生成的AsyncTask.但是,我一直收到客户端超时异常.
Android客户端:
private void initWebSocketClient() {
Log.e(TAG, "initWebSocketClient");
try {
URI url = new URI("ws://192.168.207.84:8080/");
WebSocket websocket = new WebSocketConnection(url);
// Register Event Handlers
websocket.setEventHandler(new WebSocketEventHandler() {
public void onOpen()
{
Log.e(TAG, "--open");
}
public void onMessage(WebSocketMessage message)
{
Log.e(TAG, "--received message: " + message.getText());
}
public void onClose()
{
Log.e(TAG, "--close");
}
});
// Establish WebSocket Connection
websocket.connect();
// Send …Run Code Online (Sandbox Code Playgroud) 用户保存三个数据: 名称,注释和图像.正如您可以看到下面的代码,我成功编写代码将名称和注释发送到服务器端.但是,我不知道如何将选定的图像文件从设备发送到serverDB.
public class AddEditWishlists extends Activity {
// Client-Server - Start //////////////////////
// Progress Dialog
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
EditText inputName;
EditText inputDesc;
// url to create new product
private static String url_create_product =
"http://10.56.43.91/android_connect/create_product.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
// Client-Server - End //////////////////////
//Define Variables
private EditText inputname;
private EditText inputnote;
private Button upload;
private Bitmap yourSelectedImage;
private ImageView inputphoto;
private Button …Run Code Online (Sandbox Code Playgroud) 最近,我设法在我的PC和Raspberry Pi上创建套接字,以实现两个设备之间的通信.目前,客户端能够自动向服务器发送消息.我想知道,如果有可能修改脚本来发送tcp数据包而不是纯文本消息,因为我非常希望将来使用我的PC来控制覆盆子pi,而不需要ssh/etc.
我看了一些例子,但由于我在编写自己的脚本/代码方面没有太多经验,所以我不太清楚如何去做.如果有人可以通过解释和一些例子(如果可能的话)指导我正确的方向,我将不胜感激.
无论如何这里是我正在运行的服务器/客户端脚本:
客户:
import socket
import sys
import struct
import time
#main function
if __name__ == "__main__":
if(len(sys.argv) < 2) :
print 'Usage : python client.py hostname'
sys.exit()
host = sys.argv[1]
port = 8888
#create an INET, STREAMing socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
print 'Socket Created'
try:
remote_ip = socket.gethostbyname( host )
s.connect((host, port))
except socket.gaierror:
print 'Hostname could not be resolved. Exiting'
sys.exit()
print 'Socket Connected to ' …Run Code Online (Sandbox Code Playgroud) 我有兴趣探索实时多人客户端 - 服务器游戏开发和相关算法.很多着名的多人游戏如Quake 3或Half-Life 2都使用增量压缩技术来节省带宽.
服务器必须不断向所有客户端发送最新的游戏状态快照.总是发送完整快照会非常昂贵,因此服务器只发送最后一个快照和当前快照之间的差异.
......好吗,对吗?好吧,我发现很难想到的部分是如何实际计算两种游戏状态之间的差异.
游戏状态可能非常复杂,并且在堆上分配的实体通过指针相互引用,可以具有表示从架构到另一个不同的数值,以及更多.
我发现很难相信每个游戏对象类型都有一个手写的序列化/反序列化/差异计算功能.
让我们回到基础.假设我有两个状态,用位表示,我想计算它们之间的区别:
state0: 00001000100 // state at time=0
state1: 10000000101 // state at time=1
-----------
added: 10000000001 // bits that were 0 in state0 and are 1 in state1
removed: 00001000000 // bits that were 1 in state0 and are 1 in state1
Run Code Online (Sandbox Code Playgroud)
太好了,我现在有了added和removed diff的bitsets - 但是......
...差异的大小仍然与州的大小完全相同.而且我实际上必须通过网络发送两个差异!
一个有效的策略实际上是从那些diff位集构建某种稀疏数据结构吗?例:
// (bit index, added/removed)
// added = 0 …Run Code Online (Sandbox Code Playgroud) algorithm serialization network-programming client-server delta
client-server ×10
android ×4
java ×2
tcp ×2
.net-2.0 ×1
algorithm ×1
architecture ×1
delta ×1
eclipse ×1
http-post ×1
image-file ×1
iphone ×1
packet ×1
python ×1
server-push ×1
sockets ×1
tornado ×1
udp ×1
websocket ×1