public void Connect(string host = "0.0.0.0", ushort port = DEFAULT_PORT, string natHost = "", ushort natPort = NatHolePunch.DEFAULT_NAT_SERVER_PORT) { if (Disposed) { throw new ObjectDisposedException("UDPServer", "此对象已被处置且不能用于连接,请使用新的UDPServer。This object has been disposed and can not be used to connect, please use a new UDPServer"); } try { Client = new CachedUdpClient(port); Client.EnableBroadcast = true; Me = new NetworkingPlayer(ServerPlayerCounter++, host, true, ResolveHost(host, port), this); Me.InstanceGuid = InstanceGuid.ToString(); //在成功绑定的结果中执行任何通用初始化 // Do any generic initialization in result of the successful bind OnBindSuccessful(); //创建将监听来自连接客户端的新数据并开始执行的线程 // Create the thread that will be listening for new data from connected clients and start its execution Task.Queue(ReadClients); // 创建将检查播放器超时的线程 // Create the thread that will check for player timeouts Task.Queue(() => { commonServerLogic.CheckClientTimeout((player) => { Disconnect(player, true); OnPlayerTimeout(player); CleanupDisconnections(); }); }); //让我知道我连接成功 //Let myself know I connected successfully OnPlayerConnected(Me); //将自己设置为连接的客户端 // Set myself as a connected client Me.Connected = true; //Set the port SetPort((ushort)((IPEndPoint)Client.Client.LocalEndPoint).Port); if (!string.IsNullOrEmpty(natHost)) { nat.Register((ushort)Me.IPEndPointHandle.Port, natHost, natPort); nat.clientConnectAttempt += NatClientConnectAttempt; } } catch (Exception e) { Logging.BMSLog.LogException(e); // Do any generic initialization in result of the binding failure OnBindFailure(); throw new FailedBindingException("Failed to bind to host/port, see inner exception", e); } }
public void Host(CSteamID selfSteamId, ELobbyType lobbyType, OnLobbyReady func = null) { if (Disposed) { throw new ObjectDisposedException("SteamP2PServer", "This object has been disposed and can not be used to connect, please use a new SteamP2PServer"); } try { Client = new CachedSteamP2PClient(selfSteamId); Me = new NetworkingPlayer(ServerPlayerCounter++, selfSteamId, true, this); Me.InstanceGuid = InstanceGuid.ToString(); m_CallbackLobbyCreated = Callback <LobbyCreated_t> .Create((LobbyCreated_t data) => { LobbyID = (CSteamID)data.m_ulSteamIDLobby; if (func != null) { func(); } }); m_CreateLobbyResult = SteamMatchmaking.CreateLobby(lobbyType, 5); // Do any generic initialization in result of the successful bind OnBindSuccessful(); // Create the thread that will be listening for new data from connected clients and start its execution Task.Queue(ReadClients); // Create the thread that will check for player timeouts Task.Queue(() => { commonServerLogic.CheckClientTimeout((player) => { Disconnect(player, true); OnPlayerTimeout(player); CleanupDisconnections(); }); }); //Let myself know I connected successfully OnPlayerConnected(Me); // Set myself as a connected client Me.Connected = true; StartAcceptingConnections(); } catch (Exception e) { Logging.BMSLog.LogException(e); // Do any generic initialization in result of the binding failure OnBindFailure(); throw new FailedBindingException("Failed to bind to host/port, see inner exception", e); } }
/// <summary> /// Start the Forge Networking server on this Facepunch Steamworks client /// </summary> /// <param name="haveLobby">Boolean used internally to tell whether we have already created the lobby</param> public void Host(bool haveLobby = false) { if (Disposed) { throw new ObjectDisposedException("FacepunchP2PServer", "This object has been disposed and can not be used to connect, please use a new FacepunchP2PServer"); } try { if (!haveLobby) { CreateLobby(); return; } var selfSteamId = SteamClient.SteamId; Client = new CachedFacepunchP2PClient(selfSteamId); Me = new NetworkingPlayer(ServerPlayerCounter++, selfSteamId, true, this) { InstanceGuid = InstanceGuid.ToString() }; // Do any generic initialization in result of the successful bind OnBindSuccessful(); // Create the thread that will be listening for new data from connected clients and start its execution Task.Queue(ReadClients); // Create the thread that will check for player timeouts Task.Queue(() => { commonServerLogic.CheckClientTimeout((player) => { Disconnect(player, true); OnPlayerTimeout(player); CleanupDisconnections(); }); }); // Let myself know I connected successfully OnPlayerConnected(Me); // Set myself as a connected client Me.Connected = true; OnServerCreated(); StartAcceptingConnections(); } catch (Exception e) { Logging.BMSLog.LogException(e); // Do any generic initialization in result of the binding failure OnBindFailure(); throw new FailedBindingException("Failed to bind to SteamClient.SteamId, see inner exception", e); } }
/// <summary> /// This will begin the connection for TCP, this is a thread blocking operation until the connection /// is either established or has failed /// </summary> /// <param name="hostAddress">[127.0.0.1] Ip Address to host from</param> /// <param name="port">[15937] Port to allow connections from</param> public void Connect(string hostAddress = "0.0.0.0", ushort port = DEFAULT_PORT) { if (Disposed) { throw new ObjectDisposedException("TCPServer", "This object has been disposed and can not be used to connect, please use a new TCPServer"); } if (string.IsNullOrEmpty(hostAddress)) { throw new BaseNetworkException("An ip address must be specified to bind to. If you are unsure, you can set to 127.0.0.1"); } // Check to see if this server is being bound to a "loopback" address, if so then bind to any, otherwise bind to specified address if (hostAddress == "0.0.0.0" || hostAddress == "localhost") { ipAddress = IPAddress.Any; } else { ipAddress = IPAddress.Parse(hostAddress); } try { // Setup and start the base C# TcpListner listener = new TcpListener(ipAddress, port); //listener.Start(); Me = new NetworkingPlayer(ServerPlayerCounter++, "0.0.0.0", true, listener, this); Me.InstanceGuid = InstanceGuid.ToString(); // Create the thread that will be listening for clients and start its execution //Thread connectionThread = new Thread(new ThreadStart(ListenForConnections)); //connectionThread.Start(); //Task.Queue(ListenForConnections); listener.Start(); listener.BeginAcceptTcpClient(ListenForConnections, listener); // Do any generic initialization in result of the successful bind OnBindSuccessful(); // Create the thread that will be listening for new data from connected clients and start its execution Task.Queue(ReadClients); // Create the thread that will check for player timeouts Task.Queue(() => { commonServerLogic.CheckClientTimeout((player) => { Disconnect(player, true); OnPlayerTimeout(player); CleanupDisconnections(); }); }); //Let myself know I connected successfully OnPlayerConnected(Me); // Set myself as a connected client Me.Connected = true; //Set the port SetPort((ushort)((IPEndPoint)listener.LocalEndpoint).Port); } catch (Exception e) { Logging.BMSLog.LogException(e); // Do any generic initialization in result of the binding failure OnBindFailure(); throw new FailedBindingException("Failed to bind to host/port, see inner exception", e); } }