C# .net Framework 4.0 Client-Profil, Windows-Anwendung .. Ich entwickle ein Spiel, das auf Remote-Computer seine aktuellen Bewegungen des Spiels über das Internet senden muß, wo die gleiche Anwendung (Spiel) ist installed.In gleiche Art und Weise aktueller Bewegungen vom Spiel des Remote-Computers sollte zurück gesendet werden ... Wie das möglich sein könnte?in C# .net, wie Nachricht an Remote-Computer über das Internet zu senden?
Antwort
Sie haben eine Menge zu berücksichtigen.
Sie werden über security
, firewall issues
usw.
zu denken brauchen Wenn das alles auf eine Seite gelegt wird, dann können Sie einen TCP-Socket-Server/Client-Ansatz einrichten. Eine schnelle Google wird viele Beispiele geben.
Schauen Sie sich die Microsoft Beispiel http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx
Was haben Sie versucht?
Sie können die System.Net und System.Net.Sockets Namespaces verwenden TCP-Pakete zu senden.
Sie sollten einige Middleware Blick in Teknologies wie WCF, Web service dies ist objektorientiert und leicht zu entwickeln, wenn Sie zuerst den Dreh raus bekommen
zu tun, dass Sie ein Client-Server-Verhalten über TCP implementieren müssen/IP
es gibt sehr verschiedene Wege, diese Dieser Code zu tun, die ich geschrieben habe Sie geben könnte einen Start (es ist eine Option, aber nicht der einzige, ich es dir wegzulassen, die Methode zu wählen, die Ihnen am besten passt)
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
static class ServerProgram
{
[STAThread]
static void Main()
{
ATSServer();
}
static void ATSServer()
{
TcpChannel tcpChannel = new TcpChannel(7000);
ChannelServices.RegisterChannel(tcpChannel);
Type commonInterfaceType = Type.GetType("ATSRemoteControl");
RemotingConfiguration.RegisterWellKnownServiceType(commonInterfaceType,
"RemoteATSServer", WellKnownObjectMode.SingleCall);
}
}
public interface ATSRemoteControlInterface
{
string yourRemoteMethod(string parameter);
}
public class ATSRemoteControl : MarshalByRefObject, ATSRemoteControlInterface
{
public string yourRemoteMethod(string GamerMovementParameter)
{
string returnStatus = "GAME MOVEMENT LAUNCHED";
Console.WriteLine("Enquiry for {0}", GamerMovementParameter);
Console.WriteLine("Sending back status: {0}", returnStatus);
return returnStatus;
}
}
class ATSLauncherClient
{
static ATSRemoteControlInterface remoteObject;
public static void RegisterServerConnection()
{
TcpChannel tcpChannel = new TcpChannel();
ChannelServices.RegisterChannel(tcpChannel);
Type requiredType = typeof(ATSRemoteControlInterface);
//HERE YOU ADJUST THE REMOTE TCP/IP ADDRESS
//IMPLEMENT RETRIEVAL PROGRAMATICALLY RATHER THAN HARDCODING
remoteObject = (ATSRemoteControlInterface)Activator.GetObject(requiredType,
"tcp://localhost:7000/RemoteATSServer");
string s = "";
s = remoteObject.yourRemoteMethod("GamerMovement");
}
public static void Launch(String GamerMovementParameter)
{
remoteObject.yourRemoteMethod(GamerMovementParameter);
}
}
Hoffe, dass dies hilft.
die Antworten bisher alle sind ein TCP basierten Ansatz. Wenn Sie hohe Leistung und geringe Latenz benötigen, sollten Sie stattdessen lieber UDP verwenden.
TCP bringt eine Menge Overhead zu garantieren, dass Pakete erneut gesendet werden, wenn sie verloren (und verschiedene andere Bits Funktionalität) sind. UDP hingegen überlässt es Ihnen, mit Paketen umzugehen, die nicht ankommen. Wenn Sie ein Spiel haben, bei dem es nicht wichtig ist, das eine oder andere Update zu verlieren, können Sie mit UDP anstelle von TCP eine weitaus bessere Bandbreitennutzung, Latenz und Skalierbarkeit erreichen.
UDP lässt Sie immer noch mit allen Problemen von Firewalls, Sicherheit usw. obwohl.
Wenn Sie brauchen, um es ohne zu Firewalls ein Problem sich Gedanken arbeiten dann wollen ist Sie eine Lösung wählen, die Port HTTP über 80
Vereinbarte verwendet, könnte UDP eine bessere Option sein. – Matt