IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Unity 聊天室(Socket编程) -> 正文阅读

[网络协议]Unity 聊天室(Socket编程)

示例:?

?什么是Socket:

Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者应答网络请求!Socket是支撑TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接使用的协议,本地主机的IP地址,本地远程的协议端口,远地主机的IP地址,远地进程的协议端口。

通信模型:

?服务端实现连接的步骤

1.创建Socket,绑定IP和端口。

2.调用Accept()监听客户端请求。

3.简历连接后,通过输入流读取客户端发送的请求。

4.通过输出流向客户端发送信息。

5.关闭相关资源。

客户端实现连接的步骤

1.创建Socket,指明需要连接的服务器地址和端口号。

2.建立连接后向服务器发送请求。

3.相应服务器信息。

4.关闭相关资源。

基本操作:

public Socket (System.Net.Sockets.AddressFamily addressFamily, 
               System.Net.Sockets.SocketType socketType,
               System.Net.Sockets.ProtocolType protocolType);

创建一个Socket调用他的构造函数;

addressFamily参数指定类使用的寻址方案Socket?

socketType参数指定类的类型?Socket

protocolType?参数指定所使用的协议Socket?

这三个参数不是独立的。?某些地址族限制可与它们一起使用的协议,而类型通常Socket是协议中的隐式。?如果地址族、?Socket类型和协议类型的组合导致无效?Socket?,则此构造函数会引发?SocketException。

Bind()

如果需要使用特定的本地终结点,请使用方法。?必须先调用,?Bind然后才能调用Listen()方法。

在调用之前 ,必须先创建 IPEndPoint 用于与数据通信的本地。

Listen()Connect()

将Socket置于侦听状态。Listen导致面向连接的Socket监听传入的连接尝试。?backlog参数指定可以排队等待接受的传入连接的数量。

Connect与远程主机建立连接。

Accept()

为新建连接创建新的Socket。Accept从侦听套接字的连接请求队列中同步提取第一个挂起的连接请求,然后创建并返回一个新的Socket。

Receive()

接收来自绑定的Socket的数据。Receive方法将数据读入 buffer 参数,并返回成功读取的字节数。

Send()

将数据发送到连接的Socket。???????Send将数据同步发送到或方法中指定的远程主机并返回成功发送的字节数。

Poll()

确定????????Socket?的状态。microSeconds等待响应的时间(以微秒为单位)。基于 mode 参数中传递的轮询模式值的?Socket?的状态。

Close()

关闭????????Socket?连接并释放所有关联的资源。

使用Socket创建一个简单的聊天室

服务端

写了一控制台应用,也可以移植到其他平台。

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace MyServer
{
    class Client
    {
        private Socket clientSocket;
        private Thread t;
        private byte[] data = new byte[1024];
        public Client(Socket s)
        {
            clientSocket = s;
            //启动一个线程接受数据;
            t = new Thread(ReceiveMessage);
            t.Start();

        }
        private void ReceiveMessage()
        {
            while (true)
            {
                //判断连接是否断开

               
                    if (clientSocket.Poll(10, SelectMode.SelectRead))
                    {
                    clientSocket.Close();
                        break;//跳出循环

                    }
               

                int length = clientSocket.Receive(data);
                string message = Encoding.UTF8.GetString(data, 0, length);
                //接受到数据要分发到客户端
                Console.WriteLine("收到:" + message);
                Program.BroadcastMessage(message);
            }
        }
        public void SendMessage(string message)
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);
        }
        public bool Connected
        {
            get { return clientSocket.Connected; }
        }
    }


    class Program
    {
        //存储每一个客户端
        static List<Client> clientList = new List<Client>();

        /// <summary>
        /// 服务器广播这个消息
        /// </summary>
        /// <param name="message"></param>
        public static void BroadcastMessage(string message)
        {
            var notConnectedList = new List<Client>();

            foreach (var client in clientList)
            {
                if (client.Connected)
                    client.SendMessage(message);
                else
                    notConnectedList.Add(client);
            }
            foreach (var item in notConnectedList)
            {
                clientList.Remove(item);
            }
        }

        static void Main(string[] args)
        {


            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //192.168.xx.xxx
            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.xx.xxx"), 7788));
            tcpServer.Listen(100);

            Console.WriteLine("服务器启动成功");

            while (true)
            {
                Socket clientSocket = tcpServer.Accept();
                Console.WriteLine("有一个客户端连过来了");
                Client client = new Client(clientSocket);//收发消息放到Client类中处理
                clientList.Add(client);
            }


        }
    }
}

客户端

使用Unity编写的客户端

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using System.Net;
using UnityEngine.UI;
using System.Text;
using System.Threading;

public class MyClient : MonoBehaviour
{
    public string ipaddress = "192.168.xx.xxx";
    public int port=7788;

    private Socket clientSocket;

    private Thread t;

    private byte[] data = new byte[1024];
    public InputField inputField;
    public Text chat;
    public InputField myName;
    public string message = "";
    void Start()
    {
        ConnectToServer();
    }
    private void Update()
    {
        if (message != null && message !="")
        {
            chat.text += "\n" + message;
            message = "";
        }
    }
    private void ConnectToServer()
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //发起连接
        clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port));
        //创建一个新的线程接受消息
        t = new Thread(ReceiveMessage);
        t.Start();

    }
   //循环接受消息
    void ReceiveMessage()
    {

        while (true)
        {
            if (clientSocket.Connected == false)
                break;
            int length = clientSocket.Receive(data);

            message = Encoding.UTF8.GetString(data, 0, length);

          //  chat.text += "\n" + message;
        }
      
    }
    void SendMessages(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        clientSocket.Send(data);
    }

    public void OnSendButtonClick()
    {
        string value = myName.text+":"+ inputField.text;
        SendMessages(value);
        inputField.text = "";
    }

    private void OnDestroy()
    {
        t.Abort();
        clientSocket.Shutdown(SocketShutdown.Both);//既不接受也不发送
        clientSocket.Close();//关闭连接
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 13:06:20  更:2021-11-17 13:06:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:48:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码