从Android unity c#客户端连接到python服务器

2024-05-17 00:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基本的python server正在侦听我的IP address上的连接。我还有一个在unity上运行的基本c# client。当我从我的pc运行它时,连接已经建立,但是当我构建apk并在我的android手机上运行它时,什么都没有发生。我从来没有做过任何与两台设备之间的连接有关的事情,所以我很无聊。是什么阻止了我手机上的客户端连接到服务器,我如何修复它

为了演示的目的,我审查了我的IP。 服务器代码:

import socket
import threading
HOST = '123.123.123.1'  # Change to your ip
PORT = 123


class Server:
    def __init__(self):
        self.server_socket = None
        self.client1 = None
        self.client2 = None
        self.client1_thread = None
        self.client2_thread = None

    def __del__(self):
        if self.server_socket is not None:
            self.server_socket.close()
        print("Server shutdown successful")

    def setup_server_and_bind(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_socket.bind((HOST, PORT))
        self.server_socket.listen(10)
        print("Listening")

    def connect_to_clients(self):
        print("Waiting for users to request connection")
        client_socket, port = self.server_socket.accept()
        self.client1 = ClientConnection(client_socket, port)
        print("Connection to Client1 established")
        client_socket, port = self.server_socket.accept()
        self.client2 = ClientConnection(client_socket, port)
        print("Connection to Client2 established")

    def handle_clients(self):
        self.client1_thread = threading.Thread(target=self.handle_client, args=(self.client1,))
        self.client2_thread = threading.Thread(target=self.handle_client, args=(self.client2,))
        self.client1_thread.start()
        self.client2_thread.start()

    def handle_client(self, client_connection):
        print("Started handling client")
        while True:
            msg = client_connection.socket.recv(1024)
            print("Client sent: " + msg.decode())
            client_connection.socket.send("Hello from server".encode())


class ClientConnection:
    def __init__(self, socket, port):
        self.socket = socket
        self.port = port



if __name__ == '__main__':
    server = Server()
    server.setup_server_and_bind()
    server.connect_to_clients()
    server.handle_clients()
    server.client1_thread.join()
    server.client2_thread.join()

Unity客户端代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using System.Threading;
using System.Text;

public class SendSegments
{
    const int PORT = 123;
    const string IP = "123.123.123.1";
    #region private members     
    private TcpClient socketConnection;
    private Thread clientReceiveThread;
    #endregion

    public SendSegments()
    {
        ConnectToTcpServer();
    }

    /// <summary>   
    /// Setup socket connection.    
    /// </summary>  
    public void ConnectToTcpServer()
    {
        try
        {
            clientReceiveThread = new Thread(new ThreadStart(ListenForData));
            clientReceiveThread.IsBackground = true;
            clientReceiveThread.Start();
        }
        catch (Exception e)
        {
            Debug.Log("On client connect exception " + e);
        }
    }

    /// <summary>   
    /// Runs in background clientReceiveThread; Listens for incoming data.  
    /// </summary>     
    private void ListenForData()
    {
        try
        {
            socketConnection = new TcpClient(IP, PORT);
            Byte[] bytes = new Byte[10240];
            while (true)
            {
                // Get a stream object for reading              
                using (NetworkStream stream = socketConnection.GetStream())
                {
                    int length;
                    // Read incoming stream into byte array.
                    while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        var incomingData = new byte[length];
                        Array.Copy(bytes, 0, incomingData, 0, length);
                        // Convert byte array to string message.                        
                        string serverMessage = Encoding.ASCII.GetString(incomingData);
                        Debug.Log("server message received as: " + serverMessage);
                    }
                }
            }
        }
        catch (SocketException socketException)
        {
            Debug.Log("Socket exception: " + socketException);
        }
    }

    /// <summary>   
    /// Send message to server using socket connection.     
    /// </summary>  
    public void SendBytes(byte[] clientMessageAsByteArray)
    {
        if (socketConnection == null)
        {
            return;
        }
        try
        {
            // Get a stream object for writing.             
            NetworkStream stream = socketConnection.GetStream();
            if (stream.CanWrite)
            {
                stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
                Debug.Log("Client sent his message - should be received by server");
            }
        }
        catch (SocketException socketException)
        {
            Debug.Log("Socket exception: " + socketException);
        }
    }
}

Python客户端代码:

import socket
HOST = '123.123.123.1'
PORT = 123
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    sock.connect((HOST, PORT))
except Exception as e:
    print("Cannot connect to the server:", e)
print("Connected")

sock.send("Client1".encode())
print(sock.recv(1024).decode())
sock.recv(1024)

因为服务器等待两个连接,所以我从phone/pc运行unity客户端,从pc运行python演示客户端。unity客户端可以在pc上工作,但不能在phone上工作


Tags: toselfclient客户端streamserverportdef