Unity中使用异步Socket无法发送数据

Unity中使用异步Socket无法发送数据
照着《Unity网络游戏实战》写的代码,结果测试的时候try send数据一直不能发送

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using UnityEngine.UI;
using System;

public class net : MonoBehaviour
{
    //与服务器端的套接字
    Socket socket;
    //服务端IP与端口
    public InputField hostInput;
    public InputField portInput;
    //文本框
    public Text recvText;
    public string recvStr;
    //显示客户端窗口
    public Text clientText;
    //聊天输入框
    public InputField textInput;
    //接收缓冲区
    const int BUFFER_SIZE = 1024;
    byte[] readBuff = new byte[BUFFER_SIZE];
    //只有主线程能修改UI组件的属性,因此在Update里更换文本
    void Update()
    {
        recvText.text = recvStr;
    }
    public void Connection()
    {
        //清理text
        recvText.text = "";
        //Socket
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        //Connect
        string host = hostInput.text;
        int port = int.Parse(portInput.text);
        socket.Connect(host,port);
        
        clientText.text = "客户端地址 "+socket.LocalEndPoint.ToString();
        // //Send
        // string str = "Hello Unity!";
        // byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
        // Debug.Log(str);
        // socket.Send(bytes);
        //Recv
        // int count = socket.Receive(readBuff);
        // str = System.Text.Encoding.UTF8.GetString(readBuff,0,count);
        // recvText.text = str;
        // Debug.Log(count);
        // Debug.Log(str);
        socket.BeginReceive(readBuff,0,BUFFER_SIZE,SocketFlags.None,ReceiveCb,null);
        // //Close
        // socket.Close();
    }
    //接收回调
    private void ReceiveCb(IAsyncResult ar)
    {
        try
        {
            //接收数据大小
            int count = socket.EndReceive(ar);
            Debug.Log(count);
            //数据处理
            string str = System.Text.Encoding.UTF8.GetString(readBuff,0,count);
            if(recvStr.Length>300) recvStr = "";
            recvStr += str + "\n";
            //继续接收
            socket.BeginReceive(readBuff,0,BUFFER_SIZE,SocketFlags.None,ReceiveCb,null);
        }
        catch(Exception e)
        {
            recvText.text += "连接已断开";
            socket.Close();
        }
    }
    public void Send()
    {
        string str = textInput.text;
        byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
        try
        {
            int flag = socket.Send(bytes);
        }
        catch(Exception e){
            Debug.Log("lose");
        }
    }
}


img

望采纳
可能是你的代码没有正确的连接到服务器,可以尝试检查一下服务器的IP地址和端口号是否正确,或者检查一下服务器是否正确的开启了。

该回答引用GPTᴼᴾᴱᴺᴬᴵ

根据您提供的代码,无法确定出错原因的具体位置。但是,我可以提供一些可能会导致无法发送数据的原因以及可能的解决方法:
1.检查连接是否已成功建立。在连接之前,应该先检查输入的服务器地址和端口是否正确,然后才能尝试建立连接。如果连接失败,可能是由于网络连接问题或服务器不可用。您可以通过在Unity中使用Socket.Poll方法来测试连接是否已建立。例如,您可以添加以下代码:

if (socket.Poll(0, SelectMode.SelectWrite))
{
    // 连接已建立,可以发送数据
    // ...
}
else
{
    // 连接未建立
    Debug.Log("连接未建立");
}

2.检查发送的数据是否正确。您可以尝试将发送的数据打印到控制台以进行检查。请注意,使用System.Text.Encoding.Default可能会导致在不同平台上出现不同的结果。建议使用System.Text.Encoding.UTF8。例如,您可以将以下代码添加到Send方法中:

Debug.Log("发送的数据:" + str);

3.检查Send方法是否被调用。您可以将以下代码添加到Send方法中,以检查该方法是否被调用:

Debug.Log("Send方法被调用");

4.检查防火墙设置。如果您的防火墙设置过于严格,可能会阻止Unity发送数据。您可以尝试禁用防火墙,或者在防火墙中添加Unity的应用程序。

5.检查是否有异常。在Send方法中,如果发送数据时发生异常,将会捕获该异常并输出一条日志。如果您看到了“lose”的日志,这意味着发送数据时发生了异常。您可以尝试查看异常的详细信息,并根据异常信息进行修复。

希望这些提示能够帮助您找到问题所在。