开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

项目源码

关注:1272

当前位置:游戏蛮牛 资源专区 项目源码

查看: 4104|回复: 287

[Unity] Unity3d基于Socket通讯例子

  [复制链接]  [移动端链接]
6蛮牛粉丝
1370/1500
排名
1575
昨日变化

17

主题

193

帖子

1370

积分

Rank: 6Rank: 6Rank: 6

UID
82788
好友
3
蛮牛币
3359
威望
0
注册时间
2015-3-21
在线时间
470 小时
最后登录
2017-11-16
发表于 2017-3-24 17:19:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 夜空星灿烂 于 2017-3-28 13:47 编辑

在一个网站上看到有关于Socket的通讯事例,就拿来学习学习,高手就莫喷!
原文链接:http://bbs.9ria.com/thread-364859-1-1.html
首先, 直接两个服务器端代码丢到相机上,然后也把客户端代码挂到相机上,发布服务端,再把服务器两个代码勾掉再发布客户端最后运行服务端,再运行客户端。
unity里面展示:file:///C:/Users/Administrator/AppData/Local/YNote/data/qq233344ACD512D13C553FF71505B4C730/8d394e1cb202445dafbc1da3c2f90daa/clipboard.png 170852ep29d9rlojpje9cd.png
file:///C:/Users/Administrator/AppData/Local/YNote/data/qq233344ACD512D13C553FF71505B4C730/8d394e1cb202445dafbc1da3c2f90daa/clipboard.png
运行效果:
170912g8jor9up9rbpncgj.png
服务端代码:Progrm.CS

[C#] 纯文本查看 复制代码
using System;
using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using UnityEngine.UI;
using System.Net;
using System.Threading;
 
public class Program : MonoBehaviour
{
    // 设置连接端口
    const int portNo = 500;
    // Use this for initialization
    void Start () {
        Thread myThread = new Thread(ListenClientConnect);//开启协程
        myThread.Start(); 
    }
    // Update is called once per frame
    void Update () {
}
    private void ListenClientConnect()
    {
        // 初始化服务器IP
        IPAddress localAdd = IPAddress.Parse("127.0.0.1");
        // 创建TCP侦听器
        TcpListener listener = new TcpListener(localAdd, portNo);
        listener.Start();
        // 显示服务器启动信息
       // oldstr = String.Concat("正在启动服务器!");
       // textshow.text = oldstr;
        //("Server is starting...\n");
        // 循环接受客户端的连接请求
        while (true)
        {
            ChatClient user = new ChatClient(listener.AcceptTcpClient());
            // 显示连接客户端的IP与端口
            print(user._clientIP + " 加入服务器\n");
        }
    }
 
}


服务端代码:ChatClient.CS
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System;
using System.Net;
using System.Threading;
using UnityEngine.UI;
using System.Text;

public class ChatClient : MonoBehaviour {
    public static Hashtable ALLClients = new Hashtable(); // 客户列表
    private TcpClient _client;  // 客户端实体
    public string _clientIP;   // 客户端IP
    private string _clientNick; // 客户端昵称
    private byte[] data;     // 消息数据
    private bool ReceiveNick = true;
    public ChatClient(TcpClient client)
    {
        this._client = client;
        this._clientIP = client.Client.RemoteEndPoint.ToString();
        // 把当前客户端实例添加到客户列表当中
        ALLClients.Add(this._clientIP, this);
        data = new byte[this._client.ReceiveBufferSize];
        // 从服务端获取消息
        client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
    }
    // 从客戶端获取消息
    public void ReceiveMessage(IAsyncResult ar)
    {
        int bytesRead;
        try
        {
            lock (this._client.GetStream())
            {
                bytesRead = this._client.GetStream().EndRead(ar);
            }
            if (bytesRead < 1)
            {
                ALLClients.Remove(this._clientIP);
                Broadcast(this._clientNick + " 已经离开服务器");//已经离开服务器
                return;
            }
            else
            {
                string messageReceived = Encoding.UTF8.GetString(data, 0, bytesRead);
                if (ReceiveNick)
                {
                   this._clientNick = messageReceived;
                   Broadcast(this._clientNick + " 已经进入服务器");//已经进入服务器
                   //this.sendMessage("hello");
                   ReceiveNick = false;
                }
                else
                {
                    Broadcast(this._clientNick + ">>>>" + messageReceived);
                }
            }
            lock (this._client.GetStream())
            {
                this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
            }
        }
        catch (Exception ex)
        {
            ALLClients.Remove(this._clientIP);
            Broadcast(this._clientNick + " 已经离开服务器");//已经离开服务器
        }
    }

    // 向客戶端发送消息
    public void sendMessage(string message)
    {
        try
        {
            System.Net.Sockets.NetworkStream ns;
            lock (this._client.GetStream())
            {
                ns = this._client.GetStream();
            }
            // 对信息进行编码
            byte[] bytesToSend = Encoding.UTF8.GetBytes(message);
            ns.Write(bytesToSend, 0, bytesToSend.Length);
            ns.Flush();
        }
        catch (Exception ex)
        {
                  Debug.Log("Error:"+ex);
        }
    }

    // 向客户端广播消息
    public void Broadcast(string message)
    {
       // oldstr= message+"\n";
        print( message);//打印消息

        foreach (DictionaryEntry c in ALLClients)
        {
            ((ChatClient)(c.Value)).sendMessage(message + Environment.NewLine);
        }
    }
    void Update()
    {
    }
}


客户端代码:ClientHandler.CS
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System;
using System.Text;

public class ClientHandler : MonoBehaviour {

    const int portNo = 500;
    private TcpClient _client;
    private  byte[] data;

    public string nickName = "";
    public string message = "";
    public string sendMsg = "";
    // Use this for initialization
    void OnGUI()
    {
        nickName = GUI.TextField(new Rect(10, 10, 100, 20), nickName);
        message = GUI.TextArea(new Rect(10, 40, 300, 200), message);
        sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);

        if (GUI.Button(new Rect(120, 10, 80, 20), "Connect"))
        {
            //Debug.Log("hello");
            this._client = new TcpClient();
            this._client.Connect("127.0.0.1", portNo);

            data = new byte[this._client.ReceiveBufferSize];

            //SendMyMessage(txtNick.Text);
            SendMyMessage(nickName);

            this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
        };

        if (GUI.Button(new Rect(230, 250, 80, 20), "Send"))
        {
            SendMyMessage(sendMsg);
            sendMsg = "";
        };
    }

    /// <summary>
    /// 向服务器发送数据(发送聊天信息)
    /// </summary>
    /// <param name="message"></param>
    public void SendMyMessage(string message)
    {
        try
        {
            NetworkStream ns = this._client.GetStream();

            byte[] data = Encoding.UTF8.GetBytes(message);

            ns.Write(data, 0, data.Length);
            ns.Flush();
        }
        catch (Exception ex)
        {
            Debug.Log("Error:" + ex);
        }
    }
    /// <summary>
    /// 接收服务器的数据(聊天信息)
    /// </summary>
    /// <param name="ar"></param>
    public void ReceiveMessage(IAsyncResult ar)
    {
        try
        {
            int bytesRead;
            bytesRead = this._client.GetStream().EndRead(ar);

            if (bytesRead < 1)
            {
                return;
            }
            else
            {            
                message += Encoding.UTF8.GetString(data, 0, bytesRead).ToString();
            }

            this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
        }
        catch (Exception ex)
        {
            print("Error:" + ex);
        }
    }
    void Start () {
}
// Update is called once per frame
  void Update () {
  }
}

附上小小工程一个,不嫌弃就拿走

游客,如果您要查看本帖隐藏内容请回复





回复

使用道具 举报

5熟悉之中
802/1000
排名
2400
昨日变化
10

0

主题

105

帖子

802

积分

Rank: 5Rank: 5

UID
99122
好友
1
蛮牛币
352
威望
0
注册时间
2015-5-10
在线时间
219 小时
最后登录
2017-11-19
QQ
发表于 2017-3-27 17:27:25 | 显示全部楼层
感谢分享!!!!
[发帖际遇]: kk800 被钱袋砸中进医院,看病花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
394/500
排名
5722
昨日变化
1

0

主题

110

帖子

394

积分

Rank: 4

UID
83972
好友
1
蛮牛币
110
威望
0
注册时间
2015-3-24
在线时间
98 小时
最后登录
2017-11-17
发表于 2017-3-27 18:03:01 | 显示全部楼层
的点点滴滴点点滴滴

回复 支持 反对

使用道具 举报

3偶尔光临
270/300
排名
6764
昨日变化
2

0

主题

24

帖子

270

积分

Rank: 3Rank: 3Rank: 3

UID
173251
好友
0
蛮牛币
92
威望
0
注册时间
2016-10-2
在线时间
100 小时
最后登录
2017-10-23
发表于 2017-3-28 09:34:20 | 显示全部楼层
666666666666

回复

使用道具 举报

4四处流浪
352/500
排名
5644
昨日变化

0

主题

53

帖子

352

积分

Rank: 4

UID
39084
好友
0
蛮牛币
132
威望
0
注册时间
2014-8-10
在线时间
109 小时
最后登录
2017-6-1
发表于 2017-3-28 10:23:28 | 显示全部楼层

感谢分享!!!!

回复

使用道具 举报

7日久生情
1684/5000
排名
1970
昨日变化
1

4

主题

478

帖子

1684

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
112674
好友
4
蛮牛币
1065
威望
0
注册时间
2015-7-8
在线时间
636 小时
最后登录
2017-11-17
QQ
发表于 2017-3-28 11:10:54 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
505/1000
排名
3618
昨日变化
1

0

主题

36

帖子

505

积分

Rank: 5Rank: 5

UID
30969
好友
0
蛮牛币
785
威望
0
注册时间
2014-6-23
在线时间
149 小时
最后登录
2017-11-6
发表于 2017-3-28 11:40:54 | 显示全部楼层
折磨好的资源看看

回复 支持 反对

使用道具 举报

2初来乍到
110/150
排名
15607
昨日变化
6

0

主题

40

帖子

110

积分

Rank: 2Rank: 2

UID
150407
好友
0
蛮牛币
33
威望
0
注册时间
2016-5-31
在线时间
38 小时
最后登录
2017-9-12
发表于 2017-3-28 12:16:42 | 显示全部楼层
看上去不错

回复

使用道具 举报

6蛮牛粉丝
1122/1500
排名
1274
昨日变化
7

0

主题

74

帖子

1122

积分

Rank: 6Rank: 6Rank: 6

UID
176276
好友
0
蛮牛币
2706
威望
0
注册时间
2016-10-17
在线时间
292 小时
最后登录
2017-11-20
发表于 2017-3-28 15:21:12 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1216/1500
排名
3267
昨日变化

0

主题

533

帖子

1216

积分

Rank: 6Rank: 6Rank: 6

UID
148286
好友
0
蛮牛币
2634
威望
0
注册时间
2016-5-11
在线时间
327 小时
最后登录
2017-11-17
发表于 2017-3-28 17:04:05 | 显示全部楼层
很好很哈

回复

使用道具 举报

5熟悉之中
599/1000
排名
4062
昨日变化
2

6

主题

135

帖子

599

积分

Rank: 5Rank: 5

UID
196542
好友
3
蛮牛币
4325
威望
0
注册时间
2016-12-27
在线时间
152 小时
最后登录
2017-11-2
发表于 2017-3-28 18:04:27 | 显示全部楼层
可以的  拿来用用

回复 支持 反对

使用道具 举报

3偶尔光临
158/300
排名
15607
昨日变化
6

0

主题

115

帖子

158

积分

Rank: 3Rank: 3Rank: 3

UID
209789
好友
0
蛮牛币
317
威望
0
注册时间
2017-3-3
在线时间
11 小时
最后登录
2017-4-14
发表于 2017-3-28 18:35:00 | 显示全部楼层

感谢分享资源







回复 支持 反对

使用道具 举报

7日久生情
2003/5000
排名
17661
昨日变化
6

2

主题

1675

帖子

2003

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2610
威望
0
注册时间
2016-11-22
在线时间
302 小时
最后登录
2017-11-15
发表于 2017-3-29 10:20:07 | 显示全部楼层
赞,谢谢分享,学习一下

回复 支持 反对

使用道具 举报

4四处流浪
419/500
排名
5644
昨日变化

0

主题

75

帖子

419

积分

Rank: 4

UID
127311
好友
0
蛮牛币
52
威望
0
注册时间
2015-10-30
在线时间
154 小时
最后登录
2017-6-1
发表于 2017-3-29 11:09:46 | 显示全部楼层
好东西谢谢分享

回复

使用道具 举报

2初来乍到
125/150
排名
17661
昨日变化
6

0

主题

68

帖子

125

积分

Rank: 2Rank: 2

UID
10279
好友
0
蛮牛币
135
威望
0
注册时间
2013-12-14
在线时间
33 小时
最后登录
2017-9-30
发表于 2017-3-29 13:15:35 | 显示全部楼层
学习一下,这种通讯的功能是不是需要服务器呢?刚刚开始学习

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表