我正在尝试创建一个C#TCP客户端,它可以接收来自C服务器的消息并将其发送给它。
但是我有一个问题。
我可以读取服务器发送的第一条消息,但是如果我向服务器发送消息,它想向我发送KO,但我从未收到过KO。
但是它可以与netcat一起使用...
我的代码如下:
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
/*
** @brief Permit to create and keep the server connection
**
** @param Void
** @return Void
*/
public class TCPClients : MonoBehaviour {
private TcpClient socketConnection;
private Thread clientReceiveThread;
private bool stop = true;
// private MapModification map;
/*
** @brief Permit to start code
**
** @param Void
** @return Void
*/
void Start ()
{
ConnectToTcpServer();
}
/*
** @brief to call function at each frame
**
** @param Void
** @return Void
*/
void Update ()
{
if (Input.GetKeyDown(KeyCode.Space))
{
SendMessages("CLIENT_GFX");
}
}
/*
** @brief Permit to create and keep the server connection
**
** @param Void
** @return Void
*/
private void ConnectToTcpServer ()
{
try
{
clientReceiveThread = new Thread (new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true;
clientReceiveThread.Start();
}
catch (Exception e)
{
Debug.Log("On client connect exception " + e);
}
}
/*
** @brief Permit to connect and listen server
**
** @param Void
** @return Void
*/
private void ListenForData()
{
try {
socketConnection = new TcpClient("192.168.1.47", 4244);
}
catch (SocketException socketException) {
Debug.Log("Socket exception: " + socketException);
}
using (NetworkStream stream = socketConnection.GetStream())
{
while (stop) {
Byte[] bytes = new Byte[1024];
int length;
if (stream.DataAvailable)
{
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) //block here
{
Debug.Log("Length = " + length);
var incommingData = new byte[length];
Array.Copy(bytes, 0, incommingData, 0, length);
string serverMessage = Encoding.ASCII.GetString(incommingData);
Debug.Log("Message from server :" + serverMessage);
}
Debug.Log("After while");
}
Thread.Sleep(1);
}
}
}
/*
** @brief Permit to send a massage to the server
**
** @param string message -> contain the message
** that will be send to the server
** @return Void
*/
private void SendMessages(string message)
{
if (socketConnection == null)
{
return;
}
try
{
NetworkStream stream = socketConnection.GetStream();
if (stream.CanWrite)
{
string clientMessage = message;
byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);
stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
Debug.Log("Message send = " + clientMessage);
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
/*
** @brief Permit to close socket and stop loop at application quit
**
** @param Void
** @return Void
*/
private void OnApplicationQuit()
{
stop = false;
socketConnection.GetStream().Close();
socketConnection.Close();
}
}
就像您看到的那样,我认为我正在阅读一会儿,因为这样做比较麻烦。
如果有人可以帮助我。
谢谢。
最佳答案
变量“ stop”永远不会设置为false。 (应用退出时除外)
我认为你需要设定
stop = false;
就在它说Debug.Log(“ After while”);的行之前;
此外,您可以在失败的情况下重试,但是在x次失败重试之后,您应该执行“某些操作”,例如记录问题或退出应用程序。仅1毫秒后重试对我来说似乎有点太快了。
关于c# - C#Unity和C服务器中的TcpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772571/