[Unity3D ARPG网络游戏编程实践]1——初识unity网络编程

[Unity3D ARPG网络游戏编程实践]

想杀人了,百度了半天也不知道本地服务怎么写,结果资源里的服务器竟然可以用了~~~~(>_<)~~~~
使用了两种方法
1 这个方法特别郁闷,自己写服务器,自己写客户端可以通讯。可是这个服务器用在 [Unity3D ARPG网络游戏编程实践] 中就不能链接成功,还好资源里带有启动本地服务的程序,不会原因,不懂服务器链接的原理
宣雨松版服务器客户端通讯代码

服务器端
using UnityEngine;
using System.Collections;

public class localServer : MonoBehaviour {

    int port = 10110;
    void OnGUI()
    {
        switch (Network.peerType)
        {
            case NetworkPeerType.Client://成功连接至客户端
                break;
            case NetworkPeerType.Connecting://正在尝试连接
                break;
            case NetworkPeerType.Disconnected://未启动状态,在此开始网络连接
                StartServer();
                break;
            case NetworkPeerType.Server://成功连接服务器
                OnServer();
                break;
            
        }
    }

    void StartServer()
    {
        if (GUILayout.Button("创建本地服务器"))
        {
            //创建本地服务器允许10台主机连接,第三个参数:是否支持nat方式的连接
            NetworkConnectionError error = Network.InitializeServer(10, port, false);
            //如果连接失败打印错误信息
            Debug.Log("连接状态:" + error);
        }
    }

    void OnServer()
    {
        GUILayout.Label("服务器创建完毕,等待用户连接");
        //得到用户的连接数量
        int length = Network.connections.Length;
        for (int i = 0; i < length; i++)
        {
            GUILayout.Label("连接服务器客户端的ID:" + i);
            GUILayout.Label("连接服务器客户端IP:" + Network.connections[i].ipAddress);
            GUILayout.Label("连接服务器客户端端口号:" + Network.connections[i].port);
        }

        if (GUILayout.Button("断开本地连接"))
        {
            Network.Disconnect();
        }
    }
}



客户端代码

using UnityEngine;
using System.Collections;

public class clientServer : MonoBehaviour {

    //要连接的服务器地址  
    //string IP = "192.168.110.231";
    string IP = "127.0.0.1";
    //要连接的端口  
    int Port = 10110;

    void OnGUI()
    {
        //端类型的状态  
        switch (Network.peerType)
        {
            //禁止客户端连接运行, 服务器未初始化  
            case NetworkPeerType.Disconnected:
                StartConnect();
                break;
            //运行于服务器端  
            case NetworkPeerType.Server:
                break;
            //运行于客户端  
            case NetworkPeerType.Client:
                break;
            //正在尝试连接到服务器  
            case NetworkPeerType.Connecting:
                break;
        }
    }


    void StartConnect()
    {
        if (GUILayout.Button("连接服务器"))
        {
            NetworkConnectionError error = Network.Connect(IP, Port);
            Debug.Log("连接状态" + error);
        }
    }  
}

  

2 [Unity3D ARPG网络游戏编程实践] 视频资源
只有客户端代码(注意,networkSript1类没有继承自MonoBehaviour,不能直接添加给照相机,可以在照相机组件视窗中add newscript添加脚本)

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

public class networkSript1{
    private static networkScript instance;
    private static Socket socket;

    private static string IP = "127.0.0.1";
    private static int port = 10100;

    public static networkScript getInstance()
    {
        if (instance == null)
        {
            instance = new networkScript();
            init();
        }
        return instance;
    }

    public static void init()
    {
        try
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(IP, port);
            Debug.Log("服务器连接成功");
        }
        catch
        {

            Debug.Log("服务器连接失败");
        }
    }
}

  

具体操作:
1 删除摄像机,使用NGUI添加小部件
2 创建资源并给场景添加button
3 给摄像机添加网络连接脚本:networkSript1类没有继承自MonoBehaviour,不能直接添加给照相机,可以在照相机组件视窗中add newscript添加脚本
3.1 socket对象(inter网连接类型,流方式传输,tcp协议)
3.2 函数Connect(ip,port)
4 在button的回调函数中添加连接代码

总结
Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, SocketError, AsyncCallback, Object)
开始从连接的 Socket 中异步接收数据。

public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
out SocketError errorCode,
AsyncCallback callback,
Object state
)
参数
buffer
类型:System.Byte[]
Byte 类型的数组,它是存储接收到的数据的位置。
offset
类型:System.Int32
buffer 中存储所接收数据的位置。
size
类型:System.Int32
要接收的字节数。
socketFlags
类型:System.Net.Sockets.SocketFlags
SocketFlags 值的按位组合。
errorCode
类型:System.Net.Sockets.SocketError
一个 SocketError 对象,它存储套接字错误。
callback
类型:System.AsyncCallback
一个 AsyncCallback 委托,它引用操作完成时要调用的方法。
state
类型:System.Object
一个用户定义对象,其中包含接收操作的相关信息。 当操作完成时,此对象会被传递给 EndReceive 委托。

返回值
类型:System.IAsyncResult
引用异步读的 IAsyncResult。

原文地址:https://www.cnblogs.com/lv-sally/p/4563890.html