这是我的代码
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Net.Sockets;
public class s_TCP : MonoBehaviour {
internal Boolean socketReady = false;
TcpClient mySocket;
NetworkStream theStream;
StreamWriter theWriter;
StreamReader theReader;
String Host = "198.57.44.231";
Int32 Port = 1337;
string channel = "testingSona";
void Start () {
setupSocket();
//string msg = "__SUBSCRIBE__"+channel+"__ENDSUBSCRIBE__";
string msg = "Sending By Sona";
writeSocket(msg);
readSocket();
}
void Update () {
//readSocket();
}
public void setupSocket() {
try {
mySocket = new TcpClient(Host, Port);
theStream = mySocket.GetStream();
theWriter = new StreamWriter(theStream);
theReader = new StreamReader(theStream);
socketReady = true;
}
catch (Exception e) {
Debug.Log("Socket error: " + e);
}
}
public void writeSocket(string theLine) {
if (!socketReady)
return;
String foo = theLine + "\r\n";
theWriter.Write(foo);
theWriter.Flush();
}
public String readSocket() {
if (!socketReady)
return "";
if (theStream.DataAvailable){
string message = theReader.ReadLine();
print(message);print(12345);
return theReader.ReadLine();
}
else{print("no value");
return "";
}
}
public void closeSocket() {
if (!socketReady)
return;
theWriter.Close();
theReader.Close();
mySocket.Close();
socketReady = false;
}
}
已创建连接。但是消息没有写入服务器并且正在阅读
我该怎么做
答案 0 :(得分:0)
我认为您已从http://answers.unity3d.com/questions/15422/unity-project-and-3rd-party-apps.html获取此代码,但我认为此代码中存在错误。我会在这里重复我在那里发布的内容。
以下代码无效:
public String readSocket() {
if (!socketReady)
return "";
if (theStream.DataAvailable)
return theReader.ReadLine();
return "";
}
这让我头疼了好几个小时。我认为检查流上的DataAvailable并不是检查 streamreader 上是否有数据要读取的可靠方法。所以你不想检查DataAvailable。但是,如果您只是删除它,那么当没有更多内容时,代码将在ReadLine上阻塞。因此,您需要设置从流中读取的超时,这样您就不会等待(比如说)一毫秒:
theStream.ReadTimeout = 1;
然后,你可以使用类似的东西:
public String readSocket() {
if (!socketReady)
return "";
try {
return theReader.ReadLine();
} catch (Exception e) {
return "";
}
}
这段代码并不完美,我仍然需要改进它(例如,检查引发了什么类型的异常,并适当地处理它)。也许有更好的方法来做到这一点(我尝试使用Peek(),但它返回的-1我怀疑是在套接字关闭时,而不是当现在没有更多数据要读取时)。但是,这应该可以解决已发布代码的问题,就像我所拥有的那样。如果您发现服务器中缺少数据,那么它可能位于您的阅读器流中,并且在从服务器发送新数据并存储在流中以便theStream.DataAvailable返回true之前不会被读取。