2016-12-18 7 views
0

を失敗した私のC#のサーバ用コードです:ここでは次にユニティソケット接続は、ここで

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      TcpListener serverSocket = new TcpListener(8888); 
      TcpClient clientSocket = default(TcpClient); 
      serverSocket.Start(); 
      Console.WriteLine(" >> Server Started"); 
      clientSocket = serverSocket.AcceptTcpClient(); 
      Console.WriteLine(" >> Accept connection from client"); 
//   Console.ReadLine(); 

      while (true) { 
       String textinput; 
       textinput = Console.ReadLine(); 
       NetworkStream serverStream = clientSocket.GetStream(); 
       byte[] outStream = System.Text.Encoding.ASCII.GetBytes (textinput + "$"); 
       serverStream.Write (outStream, 0, outStream.Length); 
       serverStream.Flush(); 
      } 

      clientSocket.Close(); 
      serverSocket.Stop(); 
      Console.WriteLine(" >> exit"); 
      Console.ReadLine(); 
     } 

    } 
} 

は、C#クライアントのコードです:

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

namespace WindowsApplication1 
{ 
    class Form1 
    { 
     static void Main(string[] args) 
     { 
      System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
      clientSocket.Connect("10.132.198.29", 8888); 
      Console.WriteLine ("Running the client"); 

      while ((true)) 
      { 
       try 
       { 
        NetworkStream networkStream = clientSocket.GetStream(); 
        byte[] bytesFrom = new byte[10025]; 
        networkStream.Read(bytesFrom, 0, (int)bytesFrom.Length); 
        string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        Console.WriteLine(" >> Data from Server - " + dataFromClient); 
        string serverResponse = "Last Message from Server" + dataFromClient; 
        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 
        Console.WriteLine(" >> " + serverResponse); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.ToString()); 
       } 
      } 
      // byte[] inStream = new byte[10025]; 
      // serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 

     } 
    } 
} 

これらのすべては、端末で正常に動作しますが、私はしたいですクライアントを統一プロジェクトに変換する。 私はUnityプロジェクトで空のオブジェクトを作成し、次のコードをスクリプトに追加します(元のC#クライアントコードにはいくつかの変更が加えられました)。

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


public class Client : MonoBehaviour { 

    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
    // Use this for initialization 
    void Start() { 
     System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
     clientSocket.Connect("10.132.198.29", 8888); 
     Debug.Log ("Running the client"); 

    } 

    // Update is called once per frame 
    void Update() { 
     try 
     { 
      NetworkStream networkStream = clientSocket.GetStream(); 
      byte[] bytesFrom = new byte[10025]; 
      networkStream.Read(bytesFrom, 0, (int)bytesFrom.Length); 
      string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
      Debug.Log(" >> Data from Server - " + dataFromClient); 
      string serverResponse = "Last Message from Server" + dataFromClient; 
      Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
      networkStream.Write(sendBytes, 0, sendBytes.Length); 
      networkStream.Flush(); 
      Debug.Log(" >> " + serverResponse); 
     } 
     catch (Exception ex) 
     { 
      Debug.Log("Exception error:"+ex.ToString()); 
     } 
    } 
} 

実際には、私のユニティプロジェクトを実行します。私は、サーバーが "クライアントからの接続を受け入れる"という印刷を見ることができます。私のIPを変更すると、団結プロジェクトは固まってしまいます。だから私の団結プロジェクトがサーバに正常に接続したと思います。しかし、統一プロジェクト、コンソール印刷

Exception error:System.IO.IOException: Not connected 
    at System.Net.Sockets.NetworkStream..ctor (System.Net.Sockets.Socket socket, FileAccess access, Boolean owns_socket) [0x00000] in <filename unknown>:0 
    at System.Net.Sockets.NetworkStream..ctor (System.Net.Sockets.Socket socket, Boolean owns_socket) [0x00000] in <filename unknown>:0 
    at (wrapper remoting-invoke-with-check) System.Net.Sockets.NetworkStream:.ctor (System.Net.Sockets.Socket,bool) 
    at System.Net.Sockets.TcpClient.GetStream() [0x00000] in <filename unknown>:0 
    at Client.Update() [0x00000] in /Users/User/Unity3D/ClientTest/Assets/Client.cs:23 
UnityEngine.Debug:Log(Object) 
Client:Update() (at Assets/Client.cs:37) 

私は、サーバーの端末に何かを入力すると、それは統一プロジェクトのコンソールには何も印刷することはできませんで...誰もが、長い時間のために非常に混乱して...助けることができます。..

+1

は凍結または立ち往生? asyncとThreadについての答え[ここ](http://stackoverflow.com/q/37260833/3785314)を見てください。あなたはスレッドと一緒に行くことをお勧めします。答えは、Unityで動作するTCPコードを持つ別の回答にリンクしています。 – Programmer

+0

エラーは37行目で発生しています。接続していると思いますが、Debug.Logに問題があります。エラーには "filename unknown"と表示されます。これがNetworkStreamかDebug.Logかどうかはわかりません。 – jdweng

+1

@Programmerありがとう。スレッドを使用するようにコードを修正しました。それは私の問題を解決する.. – user6142261

答えて

0

非同期待機のスレッドを使用します。このように:

System.Threading.Thread SocketThread; 
volatile bool keepReading = false; 

// Use this for initialization 
void Start() 
{ 
    Application.runInBackground = true; 
    startServer(); 
} 

void startServer() 
{ 
    SocketThread = new System.Threading.Thread(networkCode); 
    SocketThread.IsBackground = true; 
    SocketThread.Start(); 
} 



private string getIPAddress() 
{ 
    IPHostEntry host; 
    string localIP = ""; 
    host = Dns.GetHostEntry(Dns.GetHostName()); 
    foreach (IPAddress ip in host.AddressList) 
    { 
     if (ip.AddressFamily == AddressFamily.InterNetwork) 
     { 
      localIP = ip.ToString(); 
     } 

    } 
    return localIP; 
} 


Socket listener; 
Socket handler; 

void networkCode() 
{ 
    string data; 

    // Data buffer for incoming data. 
    byte[] bytes = new Byte[1024]; 

    // host running the application. 
    Debug.Log("Ip " + getIPAddress().ToString()); 
    IPAddress[] ipArray = Dns.GetHostAddresses(getIPAddress()); 
    IPEndPoint localEndPoint = new IPEndPoint(ipArray[0], 1755); 

    // Create a TCP/IP socket. 
    listener = new Socket(ipArray[0].AddressFamily, 
     SocketType.Stream, ProtocolType.Tcp); 

    // Bind the socket to the local endpoint and 
    // listen for incoming connections. 

    try 
    { 
     listener.Bind(localEndPoint); 
     listener.Listen(10); 

     // Start listening for connections. 
     while (true) 
     { 
      keepReading = true; 

      // Program is suspended while waiting for an incoming connection. 
      Debug.Log("Waiting for Connection");  //It works 

      handler = listener.Accept(); 
      Debug.Log("Client Connected");  //It doesn't work 
      data = null; 

      // An incoming connection needs to be processed. 
      while (keepReading) 
      { 
       bytes = new byte[1024]; 
       int bytesRec = handler.Receive(bytes); 
       Debug.Log("Received from Server"); 

       if (bytesRec <= 0) 
       { 
        keepReading = false; 
        handler.Disconnect(true); 
        break; 
       } 

       data += Encoding.ASCII.GetString(bytes, 0, bytesRec); 
       if (data.IndexOf("<EOF>") > -1) 
       { 
        break; 
       } 

       System.Threading.Thread.Sleep(1); 
      } 

      System.Threading.Thread.Sleep(1); 
     } 
    } 
    catch (Exception e) 
    { 
     Debug.Log(e.ToString()); 
    } 
} 

void stopServer() 
{ 
    keepReading = false; 

    //stop thread 
    if (SocketThread != null) 
    { 
     SocketThread.Abort(); 
    } 

    if (handler != null && handler.Connected) 
    { 
     handler.Disconnect(false); 
     Debug.Log("Disconnected!"); 
    } 
} 

void OnDisable() 
{ 
    stopServer(); 
} 

ここからそれを得た:Unity3d C# plugin to act as a socket server

関連する問題