我想用手機當客戶端向電腦傳遞訊息,但是好像手機連不上電腦(兩個專案同時在電腦測驗的時候可以正常傳遞)。如果手機當服務端,電腦當客戶端的時候就可以正常通信。
服務端和客戶端的代碼都是寫在unity的腳本里的。
為什么會出現這種問題,是電腦沒開什么權限嗎,還是ip地址的問題啊?
愁到頭禿了...求大佬解答!急!在線等!
uj5u.com熱心網友回復:
首先,他們要在同一個局域網uj5u.com熱心網友回復:
您好~
手機和電腦連的同一個WiFi,ip地址是電腦端的,手動輸入后通過input field獲取,但手機會卡在連接這里
uj5u.com熱心網友回復:
這中一般debug一下就知道了。感覺你的描述不是在同一局域網,也有可能是防火墻的問題uj5u.com熱心網友回復:
這是client部分的代碼
using UnityEngine;
using System.Collections;
using System.Net.NetworkInformation;
using System.Net;
using System.Net.Sockets;
using System.IO;
using Net;
namespace Net
{
public class SocketClient : MonoBehaviour
{
//public GameObject test;
//public string myIP;
private static byte[] result = new byte[1024];
private static byte[] result_2 = new byte[1024];
public static string realResult = null;
private static Socket clientSocket;
//是否已連接的標識
public bool IsConnected = false;
public SocketClient()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
/// <summary>
/// 連接指定IP和埠的服務器
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
public void ConnectServer(string ip, int port)
{
IPAddress mIp = IPAddress.Parse(ip);
IPEndPoint ip_end_point = new IPEndPoint(mIp, port);
try
{
clientSocket.Connect(ip_end_point);
IsConnected = true;
Debug.Log("連接服務器成功");
}
catch
{
IsConnected = false;
Debug.Log("連接服務器失敗");
return;
}
try
{
//服務器下發資料長度
int receiveLength = clientSocket.Receive(result);
ByteBuffer buffer = new ByteBuffer(result);
int len = buffer.ReadShort();
string data = buffer.ReadString();
Debug.Log("服務器回傳資料:" + data);
}
catch { }
}
/// <summary>
/// 發送資料給服務器
/// </summary>
public void SendMessages(string data)
{
if (IsConnected == false)
return;
try
{
ByteBuffer buffer = new ByteBuffer();
buffer.WriteString(data);
clientSocket.Send(WriteMessage(buffer.ToBytes()));
}
catch
{
IsConnected = false;
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
/// <summary>
/// 資料轉換,網路發送需要兩部分資料,一是資料長度,二是主體資料
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
private static byte[] WriteMessage(byte[] message)
{
MemoryStream ms = null;
using (ms = new MemoryStream())
{
ms.Position = 0;
BinaryWriter writer = new BinaryWriter(ms);
ushort msglen = (ushort)message.Length;
writer.Write(msglen);
writer.Write(message);
writer.Flush();
return ms.ToArray();
}
}
//連接關閉
public void SocketQuit()
{
//先關閉客戶端
if (clientSocket != null)
{
IsConnected = false;
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Debug.Log("嘗試關閉客戶端");
}
}
}
}
using UnityEngine;
using System.Collections;
using Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using UnityEngine.UI;
using UnityEngine.Android;
using System.Linq;
public class SocketClientTest : MonoBehaviour
{
string myIP;
int myPort;
SocketClient mSocket = new SocketClient();
public Text myText;
public InputField inputIP;//獲取輸入的IP
public GameObject startPanel;//開始界面
//static int i = 0;
//public GameObject player;//記錄player的位置并發送
//string x, y, z;
// Use this for initialization
void Start()
{
myText.text = "Now Start";
myPort = 1998;
});
}
// Update is called once per frame
void Update()
{
//x = player.transform.position.x.ToString();
//y = player.transform.position.y.ToString();
//z = player.transform.position.z.ToString();
//mSocket.ConnectServer(myIP, 1989);
//mSocket.SendMessages("x" + x + "y" + y + "z" + z);
}
public void OnPressBtn()
{
Destroy(startPanel);
myIP = inputIP.text;
mSocket.ConnectServer(myIP, myPort);
myText.text = "IP=" + myIP + ",port=" + myPort.ToString();
mSocket.SendMessages("成功了!");
}
public void PressToQuit()
{
mSocket.SendMessages("close");
mSocket.SocketQuit();
}
}

移動端點擊之后就會卡在這個界面,(如果連接失敗的話這個panel也是可以消失的)電腦除錯就可以正常運行,埠也是開放的...請問這個問題出在哪呀
uj5u.com熱心網友回復:
電腦可以手機不行我碰到過一次,你把代碼里所有的debug刪掉再打包。uj5u.com熱心網友回復:
手機和電腦連的同一個WiFi在電腦端,WIN+R cmd下輸入IPConfig 找到 IPv4 地址
確保在一個局域網中
檢查埠是否占用
uj5u.com熱心網友回復:
找到原因了!原來是WiFi自帶了AP隔離,默認設定還不能關...巨坑可以電腦和手機互相ping一下看是否在同一局域網
uj5u.com熱心網友回復:
但服務端單獨寫個控制臺應用可以通信,放在unity里就不行。沒找到原因轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/12434.html
標籤:Unity3D
