前提・実現したいこと
UnityでTCPを利用したチャットのやりとりをできるようにしたいんです。C#
AcceptSocket(); を使っても
BeginAcceptTcpClient(
どちらを使ってもフリーズしてしまいます。何が間違っているのかわかりません。
発生している問題・エラーメッセージ
Croutineでずっとリスニングループさせたりするとフリーズします。
ループさせないでAsyncCallbackの方法をするとSocket Error 対象のコンピュータによって拒否されたため、接続できませんでした。というエラーになります。
該当のソースコード
(フリーズするダメなコード Server側)
int port = 2222;
TcpListener server = new TcpListener(System.Net.IPAddress.Any, port);
//AcceptSocket()を使った場合
Socket client = server.AcceptSocket(); //ブロッキングするのでここでフリーズ
//AsyncCallbackを使った場合
server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server);
...
public static void DoAcceptTcpClientCallback(IAsyncResult ar)
{
TcpListener listener = (TcpListener) ar.AsyncState;
client = listener.EndAcceptTcpClient(ar);//ここでおそらくフリーズ
....
サーバー側修正後、ポートとIPなどがおかしいくてエラーSocketException: 対象のコンピューターによって拒否されたため、接続できませんでした。がでる Client側のコード
bool isForceStop = false;
NetworkStream stream = null;
bool isStopReading = false;
byte[] readbuf;
private IEnumerator Start(){ Debug.Log("START START"); readbuf = new byte[1024]; while (!isForceStop) { if(!isStopReading) { StartCoroutine(ReadMessage ()); } yield return new WaitForSeconds(1f);//あんまりしょっちゅうやらないために } } void Update() { if (Input.GetKeyDown (KeyCode.A) == true) { isForceStop = true; } } public IEnumerator SendCurrentMessage(string message){ Debug.Log ("START SendMessage:" + message); if (stream == null) { stream = GetNetworkStream(); } string playerName = "[A]: "; //サーバーにデータを送信する Encoding enc = Encoding.UTF8; byte[] sendBytes = enc.GetBytes(playerName + message + "\n"); //データを送信する stream.Write(sendBytes, 0, sendBytes.Length); yield break; } //常駐 private IEnumerator ReadMessage(){ stream = GetNetworkStream (); // 非同期で待ち受けする stream.BeginRead (readbuf, 0, readbuf.Length, new AsyncCallback (ReadCallback), null); isStopReading = true; yield return null; } public void ReadCallback(IAsyncResult ar ){ Encoding enc = Encoding.UTF8; stream = GetNetworkStream (); int bytes = stream.EndRead(ar); string message = enc.GetString (readbuf, 0, bytes); message = message.Replace("\r", "").Replace("\n", ""); isStopReading = false; Chat.Insntace.GetMessage (message); } private NetworkStream GetNetworkStream(){ if (stream != null && stream.CanRead) { return stream; } string ipOrHost = "192.168.0.4"; //string ipOrHost = "127.0.0.1"; int port = 2222; //TcpClientを作成し、サーバーと接続する TcpClient tcp = new TcpClient(ipOrHost, port); //TcpClient tcp = new TcpClient(System.Net.IPAddress.Any.ToString(), port); Debug.Log("success conn server"); //NetworkStreamを取得する return tcp.GetStream(); }
試したこと
Try chatch でエラーハンドルを入れても何も解決しません。
ネットの解決方法色々試しました。たとえば、while(!server.Pending())を入れてみたり、Thread.sleep(1000)をいれてみたり...
補足情報(FW/ツールのバージョンなど)
Unityは2017.2.0f3
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。