Search code examples
pythonc#unity-game-enginenetwork-programmingwii-balanceboard

Unable to get C# server to play nicely with Python client on separate computers on same network


Any ideas on why I can't get a unity C# server and python client on the same network to play nicely?

C# server

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

using System.Threading;

using UnityEngine;

public class Wiiboard : MonoBehaviour
{
    public int port;

    public void StartClient()
    {
        TcpListener server = null;
        try
        {
            IPAddress localAddr = IPAddress.Parse("0.0.0.0");

            // TcpListener server = new TcpListener(port);
            server = new TcpListener(localAddr, port);

            // Start listening for client requests.
            server.Start();

            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;

            // Enter the listening loop.
            while (true)
            {
                Debug.Log("Waiting for a connection... ");

                // Perform a blocking call to accept requests.
                // You could also use server.AcceptSocket() here.
                TcpClient client = server.AcceptTcpClient();
                Debug.Log(String.Format("Connected!"));

                data = null;

                // Get a stream object for reading and writing
                NetworkStream stream = client.GetStream();

                int i;

                // Loop to receive all the data sent by the client.
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    Debug.Log(String.Format("Received: {0}", data));

                    // Process the data sent by the client.
                    data = data.ToUpper();

                    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                    // Send back a response.
                    stream.Write(msg, 0, msg.Length);
                    Debug.Log(String.Format("Sent: {0}", data));
                }

                // Shutdown and end connection
                client.Close();
            }
        }
        catch (SocketException e)
        {
            Debug.LogError(String.Format("SocketException: {0}", e));
        }
        finally
        {
            // Stop listening for new clients.
            server.Stop();
        }

        Debug.Log(String.Format("\nHit enter to continue..."));
        Console.Read();
    }

    // Start is called before the first frame update
    void Start()
    {
        Thread t = new Thread(new ThreadStart(StartClient));
        t.Start();
    }
}

python client:

HOST = '192.168.0.38'  # The server's hostname or IP address
PORT = 25565        # The port used by the server

#https://realpython.com/python-sockets/
def client():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        print(f"CLIENT >>> waiting to connect to {HOST}:{PORT}")
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world!<EOF>')
        data = s.recv(1024)

    print('CLIENT >>> Received', repr(data))

[other, entirely irrelevant code. just stuff for the wiiboard]

client()

For context, I'm trying to relay data from a Wii balance board connected to my laptop(windows wouldn't play nicely with the board and VR doesn't play nicely with Linux as I've heard) to my desktop over a socket connection into unity. I've had no issues with sockets when my laptop was running windows, but since I had to run Linux on the laptop for this, it's stopped playing nicely.

I'm running the python client on my laptop running ubuntu 18.08 LTS and I am running the C# server on my windows 10 desktop in unity.

  • I've checked that the IP and port is okay
  • I've checked that both unity and the built application have firewall exceptions
  • I've ran the python client locally on the desktop and had it work
  • I've tried the same python client on the laptop but on windows with the same result

Clearly the code is not at fault here, but that leaves the question, what is?


Solution

  • The solution to my problem was simply to add a firewall exception using This helpful resource