1

Unity で単純な Tcp サーバーを作成しており、Flash アプリケーションをそれに接続しています。スレッド化された Tcp サーバーに関する優れたチュートリアルをオンラインで見つけました。私のフラッシュ アプリはそれにうまく接続します。ただし、リスニング スレッドの外部にあるデータを接続されたクライアントに送信することはできません。スレッド内で取得した Tcpclient のグローバル参照を作成してみました。ただし、その参照 (sclient) はリスニング スレッド内でのみ機能し、スレッド外のコンソールに Null を出力します。後で使用するために TCP クライアント参照を保持したり、ブロック スレッドの外部からアクセスしたりするためにできることがあるはずです。助けてください!

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

public class TCPServer: MonoBehaviour
{
    private TcpListener tcpListener;
    private Thread listenThread;
    private TcpClient sclient;

    public float fireRate = 0.5F;
    private float nextFire = 0.0F;

public TCPServer()
{
    IPAddress localAddress = IPAddress.Parse("127.0.0.1");
    this.tcpListener = new TcpListener(localAddress, 9001);
    this.listenThread = new Thread(new ThreadStart(ListenForClients));
    this.listenThread.Start();
}

public void ListenForClients()
{
  this.tcpListener.Start();

  while (true)
{
    //blocks until a client has connected to the server
    sclient = this.tcpListener.AcceptTcpClient();

    print(sclient);//print "System.Net.Sockets.TcpClient" in console

    this.sMessage("Can you hear me now?");//this one works fine
}       
}

public void sMessage(String m){
    print(cStream); //print "Null" to console
    NetworkStream clientStream = sclient.GetStream();
    ASCIIEncoding encoder = new ASCIIEncoding();
    byte[] buffer = encoder.GetBytes(m);

    print("Received Connection from " + tcpClient.Client.RemoteEndPoint );
    print("Sending message..");
    print(clientStream.CanWrite);//returns true in console

    clientStream.Write(buffer, 0 , buffer.Length);
    clientStream.WriteByte (0);
    clientStream.Flush();
}

void Update() {
    if (Input.GetButton("Fire1") && Time.time > nextFire) {
        nextFire = Time.time + fireRate;
        this.sMessage("BOOM BOOM");//this one won't work. keep saying sclient is null
    }
}
4

2 に答える 2

0

を呼び出すメソッドはどこにありますUpdateか?

呼び出したとき、まだクライアントが接続されていないようです。

于 2012-02-16T06:34:37.177 に答える
0

一般に、socket、networkstream の同期メソッドを避けるのが最善です。xxxxAsync (socket にはそのようなメソッドがあります) または BeginXXX メソッドを使用する必要があります。これにより、接続されたクライアントの数で高いパフォーマンスが得られます。同期についてはわかりました...新しく接続されたクライアントごとに新しいスレッドを作成し、そのスレッドでセッション処理を開始する必要があります。接続されたクライアント用のいくつかのセッション クラスを作成し、そのクラスですべての処理を行うことをお勧めします。

public class Your_Session
{
    private TcpClient m_pClient = null;

    public Your_Session(TcpClient client)
    {
        mpClient = client; // Assign client to mpClient
    }

    internal void Start(Object state)
    {
        // NOTE: call this Start method: 
        // ThreadPool.QueueUserWorkItem(new WaitCallback(session.Start));


        // Start your session processing here. This method is called from threapool thread. 
    }
}

ListenForClients メソッドで create session class instance(Your_Session session = new YourSession ...) を呼び出し、ThreadPool.QueueUserWorkItem(new WaitCallback(session.Start)); を呼び出すだけです。セッション処理を開始します。

于 2011-11-12T07:38:25.607 に答える