按语:按照下文,服务端利用网络测试工具,把下面客户端代码放到U3D中摄像机上,运行结果正确。

http://www.manew.com/thread-102109-1-1.html

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

170852ep29d9rlojpje9cd.png (161.87 KB, 下载次数: 79)

下载附件  保存到相册

2017-3-28 13:37 上传

 

file:///C:/Users/Administrator/AppData/Local/YNote/data/qq233344ACD512D13C553FF71505B4C730/8d394e1cb202445dafbc1da3c2f90daa/clipboard.png 运行效果: <ignore_js_op>

170912g8jor9up9rbpncgj.png (311.03 KB, 下载次数: 73)

下载附件  保存到相册

2017-3-28 13:37 上传

 

服务端代码:Progrm.CS

[C#] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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#] 纯文本查看 复制代码
 
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
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#] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 () {
  }
}

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

本帖隐藏的内容

链接:https://pan.baidu.com/s/1a6lM4HZzkUjqI_YyfNOv4A 密码:1ije

Unity3d基于Socket通讯例子(转)的更多相关文章

  1. GJM: Unity3D基于Socket通讯例子 [转载]

    首先创建一个C# 控制台应用程序, 直接服务器端代码丢进去,然后再到Unity 里面建立一个工程,把客户端代码挂到相机上,运行服务端,再运行客户端. 高手勿喷!~! 完全源码已经奉上,大家开始研究吧! ...

  2. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  3. 用Robot Framework+python来测试基于socket通讯的C/S系统(网络游戏)

    项目终于换了方案,改用socket来实现而不是之前的http了,所以测试工具就不能用以前的了,因为测试人手少,逼不得已的必须要挖掘更多的自动化方案来弥补.于是先研究了下python的socket解决方 ...

  4. Unity3d网络游戏Socket通讯

    http://blog.csdn.net/wu5101608/article/details/37999409

  5. php和c++socket通讯(基于字节流,二进制)

    研究了一下PHP和C++socket通讯,用C++作为服务器端,php作为客户端进行. socket通讯是基于协议的,因此,只要双方协议一致就行. 关于协议的选择:我看过网上大部分协议都是在应用层的协 ...

  6. C#基于Socket的CS模式的完整例子

    基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器.打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序.打开工 ...

  7. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  8. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  9. 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)

    前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...

随机推荐

  1. 题解 UVa10780

    题目大意 多组数据,每组数据给定两个整数 \(m,n\),输出使 \(n\%m^k=0\) 的最大的 \(k\).如果 \(k=0\) 则输出Impossible to divide. 分析 计数水题 ...

  2. [PKUSC2018]主斗地

    暴搜 非常暴力的搜索,以至于我都不相信我能过. 方法是:暴力枚举所有牌型,然后暴力判断是否可行. 暴力枚举部分: 非常暴力: void dfs(int x,int l){ if(l==0){ flag ...

  3. POJ 3233 Matrix Power Series——快速幂&&等比&&分治

    题目 给定一个 $n \times n$  的矩阵 $A$ 和正整数 $k$ 和 $m$.求矩阵 $A$ 的幂的和. $$S = A + A^2 + ... + A^k$$ 输出 $S$ 的各个元素对 ...

  4. Codeforces Round #604 (Div. 2) B. Beautiful Numbers

    链接: https://codeforces.com/contest/1265/problem/B 题意: You are given a permutation p=[p1,p2,-,pn] of ...

  5. Fiddler拦截请求

    bpu (breakpoint url ) Create a request breakpoint for URIs containing the specified string. Setting ...

  6. 项目兼容ie8技术要点

    好久没有写博客了,因为最近公司项目要调ie8兼容,一直在忙这事,终于竣工了,跟大家分享下这老掉牙的浏览器是如何搞定的...本人新手一枚,欢迎大家指教 项目是使用的jeecg框架,后台使用的java,前 ...

  7. 备份docker运行的gitlab

    #!/bin/bash data=$(date "+%Y-%m-%d %H:%M:%S") gitBak='/data/gitlab/data/backups' delFile=` ...

  8. info命令

    info命令也可以查看命令的信息,但是和man命令不同,info命令如同一本书,一个命令只不过是书中的一个章节. 1.基本结构: 输入:info ls ls命令只不过是整个文档的10.1章节. 而在章 ...

  9. linux 查看带宽瓶颈

    1.首先要确定网卡带宽是多少(单位是Mbit/s) ethtool eth1 | grep Speed 2.确定当前带宽使用情况 使用 nload 工具,如果没有可以yum install nload ...

  10. 割点 —— Tarjan 算法

    由于对于这一块掌握的十分不好,所以在昨天做题的过程中一直困扰着我,好不容易搞懂了,写个小总结吧 qwq~ 割点 概念 在无向连通图中,如果将其中一个点以及所有连接该点的边去掉,图就不再连通,那么这个点 ...