unity客户端代码(等服务器来在实验)

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值