を失敗した私の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)
私は、サーバーの端末に何かを入力すると、それは統一プロジェクトのコンソールには何も印刷することはできませんで...誰もが、長い時間のために非常に混乱して...助けることができます。..
は凍結または立ち往生? asyncとThreadについての答え[ここ](http://stackoverflow.com/q/37260833/3785314)を見てください。あなたはスレッドと一緒に行くことをお勧めします。答えは、Unityで動作するTCPコードを持つ別の回答にリンクしています。 – Programmer
エラーは37行目で発生しています。接続していると思いますが、Debug.Logに問題があります。エラーには "filename unknown"と表示されます。これがNetworkStreamかDebug.Logかどうかはわかりません。 – jdweng
@Programmerありがとう。スレッドを使用するようにコードを修正しました。それは私の問題を解決する.. – user6142261