Socket通信Demo(Unity客户端和C#)

Socket通信基本流程

  • 首先要启动服务器创建Socket,然后要绑定服务器的一个端口
  • 这样客户端通过服务器IP+端口号就能连接到服务器了
  • 服务器接下来会设置监听队列,监听并等待要连接到它的客户端
  • 客户端在服务器启动之后也建立自己的Socket,然后使用客户端的Socket去连接服务器
  • 连接成功之后客户端和服务器之间就可以发送数据和接收数据
  • 当客户端关闭的时候,服务器会捕捉到客户端连接关闭
  • 服务器会把对应客户端的Socket也进行关闭

实现 

新建一个Unity项目新建脚本编写客户端

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;

public class Client : MonoBehaviour
{
    private Socket socket;
    //定义用来存消息的容器
    private byte[] buffer = new byte[1024];
    // Start is called before the first frame update
    void Start()
    {
        //参数: IPV4协议, 套接字的传输类型(流式传输), socket传输协议(TCP)
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream ,ProtocolType.Tcp);  
        //连接服务器: 服务器IP, 服务器端口号
        socket.Connect("127.0.0.1", 6666);  //连接完成
        //连接成功调用接收方法异步接收消息
        StartReceive();
        //连接成功发送消息
        Send();
    }

    //接收消息
    void StartReceive()
    {
        socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,ReceiveCallback,null);
    }
    
    //接收消息的回调方法(作为参数传递的函数)
    void ReceiveCallback(IAsyncResult iar)
    {
        //接收返回消息长度
        int len = socket.EndReceive(iar);
        //接收为0代表终止连接
        if (len == 0)
        {
            return;
        }
        //解析buffer
        string str = Encoding.UTF8.GetString(buffer, 0, len);
        Debug.Log(str);
        //解析完在执行接收方法 
        StartReceive();
    }

    void Send()
    {
        socket.Send(Encoding.UTF8.GetBytes("服务器你好,我是客户端!"));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

创建一个空物体挂载客户端脚本

 新建一个窗体应用编写服务端

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;

public class Program
{
    private static Socket socket;
    private static byte[] buffer = new byte[1024];
    static void Main(string[] args)
    {
        //初始化
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //绑定
        socket.Bind(new IPEndPoint(IPAddress.Any, 6666));
        //监听:  挂起的连接队列最大长度 —— 同时处理连接请求的最大数,超出最大数会排队等待
        socket.Listen(0);
        StartAccept();

        Console.Read(); //阻塞住让程序不会结束
    }

    //开始应答
    static void StartAccept()
    {
        //开始异步应答连接   参数: 回调函数,object
        socket.BeginAccept(AcceptCallback, null);
    }

    static void AcceptCallback(IAsyncResult iar)
    {
        //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。
        Socket client = socket.EndAccept(iar);
        //开始接收
        StartReceive(client);
        //重新开始应答
        StartAccept();
    }

    //接收消息
    static void StartReceive(Socket client)
    {
        //开始从连接的 Socket 中异步接收数据
        client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);
    }

    //回调函数
    static void ReceiveCallback(IAsyncResult iar)
    {
        Socket client = iar.AsyncState as Socket;
        //结束接收返回消息长度
        int len = client.EndReceive(iar);
        //接收为0代表终止连接
        if (len == 0)
        {
            return;
        }
        //解析buffer
        string str = Encoding.UTF8.GetString(buffer, 0, len);
        Console.WriteLine(str);
        //解析完在执行接收方法 
        StartReceive(client);
    }
}

先运行服务端然后运行客户端

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
socket通信客户端app源代码demo,测试通过。日志:2015-07-24 11:26:01.733 23123[303:67144] g_deviceHeight = 568, g_deviceWidth = 320 2015-07-24 11:26:01.769 23123[303:67165] i= 0 2015-07-24 11:26:02.775 23123[303:67165] select 超时! 2015-07-24 11:26:02.775 23123[303:67165] msg= {"head":{"token":"(null)","cmd":"0002","result":"0","ecode":"","msg":"‰∏≠ÂõΩ01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789e"},"body":{}} 2015-07-24 11:26:02.778 23123[303:67165] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@input_msg1={"head":{"token":"(null)","cmd":"0002","result":"0","ecode":"","msg":"‰∏≠ÂõΩ01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789e"},"body":{}} 2015-07-24 11:26:02.782 23123[303:67165] ret8= 1312 2015-07-24 11:26:02.827 23123[303:67165] i= 9 2015-07-24 11:26:02.827 23123[303:67165] &client_fd_set= 29529232 2015-07-24 11:26:02.828 23123[303:67165] ret2= 1 2015-07-24 11:26:02.828 23123[303:67165] 服务器:消息队列解析。 2015-07-24 11:26:02.828 23123[303:67165] 服务器:12594 2015-07-24 11:26:02.828 23123[303:67165] 服务器:消息字符串解析。 2015-07-24 11:26:02.828 23123[303:67165] 服务器:消息格式错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值