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");
}
}
}
望采纳
可能是你的代码没有正确的连接到服务器,可以尝试检查一下服务器的IP地址和端口号是否正确,或者检查一下服务器是否正确的开启了。
根据您提供的代码,无法确定出错原因的具体位置。但是,我可以提供一些可能会导致无法发送数据的原因以及可能的解决方法:
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的应用程序。
希望这些提示能够帮助您找到问题所在。