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

扫一扫,访问微社区

项目源码

关注:1308

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

查看: 4908|回复: 325

[Unity] Unity3d基于Socket通讯例子

  [复制链接]  [移动端链接]
7日久生情
1504/5000
排名
1434
昨日变化
4

22

主题

213

帖子

1504

积分

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

UID
82788
好友
3
蛮牛币
4338
威望
0
注册时间
2015-3-21
在线时间
515 小时
最后登录
2018-1-23
发表于 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熟悉之中
809/1000
排名
2488
昨日变化
3

0

主题

106

帖子

809

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
596/1000
排名
4556
昨日变化
35

0

主题

181

帖子

596

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

4四处流浪
302/500
排名
6572
昨日变化
6

0

主题

29

帖子

302

积分

Rank: 4

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

回复

使用道具 举报

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

0

主题

53

帖子

352

积分

Rank: 4

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

感谢分享!!!!

回复

使用道具 举报

7日久生情
1895/5000
排名
1738
昨日变化
4

4

主题

534

帖子

1895

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
509/1000
排名
3740
昨日变化
3

0

主题

37

帖子

509

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

2初来乍到
110/150
排名
16210
昨日变化
7

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蛮牛粉丝
1287/1500
排名
1125
昨日变化
45

0

主题

76

帖子

1287

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

7日久生情
1508/5000
排名
2823
昨日变化

0

主题

678

帖子

1508

积分

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

UID
148286
好友
0
蛮牛币
3018
威望
0
注册时间
2016-5-11
在线时间
402 小时
最后登录
2018-1-23

迈向小康

发表于 2017-3-28 17:04:05 | 显示全部楼层
很好很哈

回复

使用道具 举报

5熟悉之中
621/1000
排名
4034
昨日变化
3

6

主题

138

帖子

621

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

3偶尔光临
158/300
排名
16210
昨日变化
7

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日久生情
2194/5000
排名
17777
昨日变化
15

2

主题

1835

帖子

2194

积分

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

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

回复 支持 反对

使用道具 举报

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

0

主题

75

帖子

419

积分

Rank: 4

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

回复

使用道具 举报

2初来乍到
133/150
排名
18365
昨日变化
12

0

主题

71

帖子

133

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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