using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class ClientDemo : MonoBehaviour
{
private string serverAddress;//服务器地址
private int port;//服务器端口
private TcpClient localClient;//当前tcp客户端
private Thread receiveThread;//接收服务器消息线程
private byte[] resultBuffer = new byte[1024];//服务器返回流字节
private string resultStr;//服务器返回字符串
void Start()
{
//连接至服务端
InitClientSocket();
}
/// <summary>
/// 销毁时操作
/// </summary>
private void OnDestroy()
{
if (localClient != null)
localClient.Close();
if (receiveThread != null)
receiveThread.Abort();
}
/// <summary>
/// 客户端实例化Socket连接
/// </summary>
private void InitClientSocket()
{
localClient = new TcpClient();
try
{
serverAddress = ReadFile(savePath + "/" + IPAndAddress, 2);
port = Convert.ToInt32(ReadFile(savePath + "/" + IPAndAddress, 3));
Debug.Log(serverAddress + " " + port);
//当前客户端连接的服务器地址与远程端口
localClient.Connect(IPAddress.Parse(serverAddress), port);
//开始接收服务器消息子线程
receiveThread = new Thread(SocketReceiver);
receiveThread.Start();
Debug.Log("客户端-->服务端完成,开启接收消息线程");
}
catch (Exception ex)
{
Debug.Log("客户端连接服务器异常: " + ex.Message);
}
Debug.Log("连接到服务器 本地地址端口:" + localClient.Client.LocalEndPoint + " 远程服务器端口:" + localClient.Client.RemoteEndPoint);
}
/// <summary>
/// 客户端发送消息到服务器
/// </summary>
public void SendMessageToServer(int username,float time,float speed,float distance)
{
try
{
string macAddress = GetMacAddress();
//mac地址+用户id+时间+速度+距离+高度+频率+类型
string clientStr = macAddress+" "+ username.ToString()+" "+Math.Round( time,2)+" "+ Math.Round(speed,2) +" "+ Math.Round(distance,2)+" 0 0 0";
int structCmd = 1;
//数据格式:structCmd+length+content
byte[] int1 = BitConverter.GetBytes(structCmd);
byte[] content = Encoding.UTF8.GetBytes(clientStr);
int length = content.Length;
byte[] int2 = BitConverter.GetBytes(length);
byte[] buffer =new byte[int1.Length+int2.Length+content.Length];
int1.CopyTo(buffer, 0);
int2.CopyTo(buffer, int1.Length);
content.CopyTo(buffer, int1.Length + int2.Length);
//获取当前客户端的流对象,然后将要发送的字符串转化为byte[]写入发送
NetworkStream stream = localClient.GetStream();
stream.Write(buffer, 0, buffer.Length);
// localClient.Client.Send(buffer);
}
catch (Exception ex)
{
Debug.Log("发送消息时服务器产生异常: " + ex.Message);
}
}
/// <summary>
/// 客户端检测收到服务器信息子线程
/// </summary>
private void SocketReceiver()
{
if (localClient != null)
{
while (true)
{
if (localClient.Client.Connected == false)
break;
//在循环中,
localClient.Client.Receive(resultBuffer);
resultStr = Encoding.UTF8.GetString(resultBuffer);
Debug.Log("客户端收到服务器消息 : " + resultStr);
}
}
}
const string savePath = "C:/unity/riding";
const string IPAndAddress = "IPAndAddress.txt";
StreamWriter streamWriter;
//按路径读取txt文本的内容,第一个参数是路径名,第二个参数是第几行,返回值是sring[]数组
string ReadFile(string PathName, int linenumber)
{
//新建目录
if (Directory.Exists(savePath))
{
Debug.Log("存在目录");
}
else
{
Debug.Log("不存在目录");
//创建文件夹
Directory.CreateDirectory(savePath);
}
//文件流
FileInfo fileInfo = new FileInfo(savePath + "/" + IPAndAddress);
if (!fileInfo.Exists)
{
//如果txt不存在,创建文本
streamWriter = fileInfo.CreateText();
streamWriter.WriteLine("第二行输入服务器IP数字,第三行输入服务器端口号");
streamWriter.WriteLine("192.168.0.111");
streamWriter.WriteLine("56789");
Debug.Log("不存在文本");
}
else
{
Debug.Log("存在文本");
streamWriter = fileInfo.AppendText();
}
streamWriter.Close();
streamWriter.Dispose();
string[] strs = File.ReadAllLines(savePath + "/" + IPAndAddress);//读取txt文本的内容,返回sring数组的元素是每行内容
if (linenumber == 0)
{
return "";
}
else
{
return strs[linenumber - 1]; //返回第linenumber行内容
}
}
/// <summary>
/// 获取mac地址
/// </summary>
/// <returns></returns>
public static string GetMacAddress()
{
string physicalAddress = "";
NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface ni in nis)
{
if (string.IsNullOrEmpty(ni.GetPhysicalAddress().ToString()) == false)
{
Debug.Log("Mac地址 = " + ni.GetPhysicalAddress().ToString());
physicalAddress = ni.GetPhysicalAddress().ToString();
break;
}
}
return physicalAddress;
}
}