Real fix for the client UDP problems and removed my long

winded and erroneous comment now that we have point-to-point
connections again.
Also committing the other classes to which I started adding
game name and version... unfinished but needed for the other
fix.


git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7038 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
PSp..om 14 years ago
parent 17ecd6f0c9
commit dda3e4c2a0
  1. 44
      engine/src/networking/com/jme3/network/Network.java
  2. 12
      engine/src/networking/com/jme3/network/Server.java
  3. 6
      engine/src/networking/com/jme3/network/base/DefaultClient.java
  4. 16
      engine/src/networking/com/jme3/network/base/DefaultServer.java
  5. 18
      engine/src/networking/com/jme3/network/kernel/udp/UdpConnector.java

@ -58,7 +58,7 @@ public class Network
*/
public static Server createServer( int port ) throws IOException
{
return createServer( port, port );
return createServer( "Unnamed Game", 42, port, port );
}
/**
@ -68,12 +68,29 @@ public class Network
*/
public static Server createServer( int tcpPort, int udpPort ) throws IOException
{
//InetAddress local = InetAddress.getLocalHost();
return createServer( "Unnamed Game", 42, tcpPort, udpPort );
}
/**
* Creates a named and versioned Server that will utilize both reliable and fast
* transports to communicate with clients. The specified port
* will be used for both TCP and UDP communication.
*
* @param gameName This is the name that identifies the game. Connecting clients
* must use this name or be turned away.
* @param gersion This is a game-specific verison that helps detect when out-of-date
* clients have connected to an incompatible server.
* @param tcpPort The port upon which the TCP hosting will listen for new connections.
* @param udpPort The port upon which the UDP hosting will listen for new 'fast' UDP
* messages.
*/
public static Server createServer( String gameName, int version, int tcpPort, int udpPort ) throws IOException
{
UdpKernel fast = new UdpKernel(udpPort);
//UdpKernel fast = new UdpKernel( InetAddress.getByName("localhost"), udpPort);
SelectorKernel reliable = new SelectorKernel(tcpPort);
return new DefaultServer( reliable, fast );
return new DefaultServer( gameName, version, reliable, fast );
}
/**
@ -81,7 +98,17 @@ public class Network
*/
public static NetworkClient createClient()
{
return new NetworkClientImpl();
return createClient( "Unnamed Game", 42 );
}
/**
* Creates a client that can be connected at a later time. The specified
* game name and version must match the server or the client will be turned
* away.
*/
public static NetworkClient createClient( String gameName, int version )
{
return new NetworkClientImpl(gameName, version);
}
/**
@ -123,8 +150,7 @@ public class Network
public static Client connectToServer( InetAddress address, int port, int remoteUdpPort,
int localUdpPort ) throws IOException
{
InetAddress local = InetAddress.getLocalHost();
UdpConnector fast = new UdpConnector( local, localUdpPort, address, port );
UdpConnector fast = new UdpConnector( localUdpPort, address, port );
SocketConnector reliable = new SocketConnector( address, port );
return new DefaultClient( reliable, fast );
@ -132,8 +158,9 @@ public class Network
protected static class NetworkClientImpl extends DefaultClient implements NetworkClient
{
public NetworkClientImpl()
public NetworkClientImpl(String gameName, int version)
{
super( gameName, version );
}
public void connectToServer( String host, int port, int remoteUdpPort,
@ -145,8 +172,7 @@ public class Network
public void connectToServer( InetAddress address, int port, int remoteUdpPort,
int localUdpPort ) throws IOException
{
InetAddress local = InetAddress.getLocalHost();
UdpConnector fast = new UdpConnector( local, localUdpPort, address, port );
UdpConnector fast = new UdpConnector( localUdpPort, address, port );
SocketConnector reliable = new SocketConnector( address, port );
setConnectors( reliable, fast );

@ -43,6 +43,18 @@ import java.util.Collection;
*/
public interface Server
{
/**
* Returns the 'game name' for this server. This should match the
* 'game name' set on connecting clients or they will be turned away.
*/
public String getGameName();
/**
* Returns the game-specific version of this server used for detecting
* mismatched clients.
*/
public int getVersion();
/**
* Sends the specified message to all connected clients.
*/

@ -57,6 +57,8 @@ public class DefaultClient implements Client
private int id = -1;
private boolean isRunning = false;
private String gameName;
private int version;
private Connector reliable;
private Connector fast;
private MessageListenerRegistry<Client> messageListeners = new MessageListenerRegistry<Client>();
@ -65,8 +67,10 @@ public class DefaultClient implements Client
private ConnectorAdapter reliableAdapter;
private ConnectorAdapter fastAdapter;
public DefaultClient()
public DefaultClient( String gameName, int version )
{
this.gameName = gameName;
this.version = version;
}
public DefaultClient( Connector reliable, Connector fast )

@ -59,6 +59,8 @@ public class DefaultServer implements Server
private boolean isRunning = false;
private AtomicInteger nextId = new AtomicInteger(0);
private String gameName;
private int version;
private Kernel reliable;
private KernelAdapter reliableAdapter;
private Kernel fast;
@ -76,8 +78,10 @@ public class DefaultServer implements Server
= new MessageListenerRegistry<HostedConnection>();
private List<ConnectionListener> connectionListeners = new CopyOnWriteArrayList<ConnectionListener>();
public DefaultServer( Kernel reliable, Kernel fast )
public DefaultServer( String gameName, int version, Kernel reliable, Kernel fast )
{
this.gameName = gameName;
this.version = version;
this.reliable = reliable;
this.fast = fast;
@ -89,6 +93,16 @@ public class DefaultServer implements Server
}
}
public String getGameName()
{
return gameName;
}
public int getVersion()
{
return version;
}
public void start()
{
if( isRunning )

@ -64,30 +64,14 @@ public class UdpConnector implements Connector
* Creates a new UDP connection that send datagrams to the
* specified address and port.
*/
public UdpConnector( InetAddress local, int localPort,
InetAddress remote, int remotePort ) throws IOException
public UdpConnector( int localPort, InetAddress remote, int remotePort ) throws IOException
{
InetSocketAddress localSocketAddress = new InetSocketAddress(localPort);
this.sock = new DatagramSocket( localSocketAddress );
//this.sock = new DatagramSocket( localPort, local );
remoteAddress = new InetSocketAddress( remote, remotePort );
// Setup to receive only from the remote address
sock.connect( remoteAddress );
//
// The above is a really nice idea since it means that we
// wouldn't get random datagram packets from anything that
// happened to send garbage to our UDP port. The problem is
// when connecting to a server at "localhost" because "localhost"
// will/should always resolve to 127.0.0.1... but the server
// doesn't send packets from 127.0.0.1 because it's listening
// on the real interface. And that doesn't match and this end
// rejects them.
//
// This means at some point the read() code will need to validate
// that the packets came from the real server before parsing them.
// Otherwise we likely throw random deserialization errors and kill
// the client. Which may or may not warrant extra code below. <shrug>
connected.set(true);
}

Loading…
Cancel
Save