Unity3D教程:学习Socket

这个例子是用Socket的TCP协议做的,当然也可以用UDP和TCPListener来做。没用到多线程,其实就是为了看看里面的一些函数而已。


Server.cs:

using UnityEngine;  	
using System.Collections;  	
using System.Net;  	
using System.IO;  	
using System.Net.Sockets;  	
using System.Text;  	
 	
public class Server : MonoBehaviour {  		
    void Start () {  	
       OpenServer();  	
    }  		
    void OpenServer()  
	
    {  	
        IPAddress ipAdr = IPAddress.Parse("10.56.03.32");  	
        IPEndPoint ipEp = new IPEndPoint(ipAdr , 1234);  	
        Socket serverScoket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  	
        serverScoket.Bind (ipEp);  	
        serverScoket.Listen(20);  
	
        while(true)  
	
        {  //Unity3D教程手册:www.unitymanual.com
	
            Socket client = serverScoket.Accept();  
	
            byte[] request = new byte[512];  
	
            int bytesRead = client.Receive(request);  
	
            string input = Encoding.UTF8.GetString(request,0,bytesRead);  
	
            print("server request:"+input);  
	
            string output = "连接服务器成功~~~~";  
	
            byte[] concent = Encoding.UTF8.GetBytes(output);  
	
            client.Send(concent);  
	
            client.Shutdown(SocketShutdown.Both);  
	
            client.Close();  
	
        }  
	
    }  
	
}

Client.cs:

using UnityEngine;  	
using System.Collections;  	
using System.Text;  	
using System.Net;  	
using System.Net.Sockets;  	
using System.IO;  	
	
    public class Client : MonoBehaviour {  	
 	
        void Start () {  	
            ConncetServer();  	
        }  	
 	
        void ConncetServer()  	
        {  	
            IPAddress ipAdr = IPAddress.Parse("10.56.03.32");  	
            IPEndPoint ipEp = new IPEndPoint(ipAdr , 1234);  	
            Socket clientScoket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  	
            clientScoket.Connect(ipEp);  	
            string output = "客户端请求连接~~~";  	
            byte[] concent = Encoding.UTF8.GetBytes(output);          	
            clientScoket.Send(concent);  //Unity3D教程手册:www.unitymanual.com	
            byte[] response = new byte[1024];  	
            int bytesRead = clientScoket.Receive(response);  	
            string input = Encoding.UTF8.GetString(response,0,bytesRead);  	
            print("Client request:"+input);  	
            clientScoket.Shutdown(SocketShutdown.Both);  	
            clientScoket.Close();  	
        }  	
    } 


using UnityEngine;  
    using System.Collections;  
    using System.Net.Sockets;  
    using System.Net;  
    using System;  
    using System.Text;  
    using System.Threading;  
 
    public class TestAsyncSocketClient2 : MonoBehaviour  
    {  
        private Socket client = null;  
        private string ip = "127.0.0.1";  
        private int port = 8989;  
 
        private int size = 1024;  
        private byte[] readData = new byte[1024];  
        private byte[] data = new byte[1024];  
        void Start()                        
        {   //Unity3D教程手册:www.unitymanual.com
 
            //  socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 多socket 复用同一端口  
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
            IPEndPoint address = new IPEndPoint(IPAddress.Parse(ip), port);  
            //client.Blocking = false;  
            client.BeginConnect(address, new AsyncCallback(Connected), null); //建立异步连接服务 , Connected 进行监听  
            //connectDone.WaitOne();  
        }  
        void Connected(IAsyncResult iar)    //建立连接  
        {  
           //Socket client = (Socket)iar.AsyncState;  
           client.EndConnect(iar);  
            //client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);  
            echo("建立连接");  
 
        }  
        void Send(string str)  
        {  
            byte[] msg = Encoding.UTF8.GetBytes(str);  
            client.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(SendData), client);    //开始发送  
        }  
        void SendData(IAsyncResult iar) //发送数据  
        {  //Unity3D教程手册:www.unitymanual.com
            Socket remote = (Socket)iar.AsyncState;  
            int sent = remote.EndSend(iar);         //关闭发送  
            remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), remote);   //开始接收  
        }  
 
 
 
        void Update()  
        {  
            startReceive(); //这步很重要,,,不然会收不到服务器发过来的消息  
        }  
        bool ReceiveFlag = true;  
        void startReceive()  
        {  
            if (ReceiveFlag) {  
                ReceiveFlag = false;  
                client.BeginReceive(readData, 0, readData.Length, SocketFlags.None, new AsyncCallback(endReceive), client);  
            }             
        }  
 
        void endReceive(IAsyncResult iar) //接收数据  
        {  
            ReceiveFlag = true;  
            Socket remote = (Socket)iar.AsyncState;  
            int recv = remote.EndReceive(iar);  
            if (recv > 0)  
            {  
                string stringData = Encoding.UTF8.GetString(readData, 0, recv);  
                text2 += "\n" + "接收服务器数据:+++++++++++++++" + stringData;  
            }  
 
        }  
        void ReceiveData(IAsyncResult iar) //接收数据  
        {  
            Socket remote = (Socket)iar.AsyncState;  
            int recv = remote.EndReceive(iar);          //关闭接收 注意:如果关闭了接收,就不能接收了 测试是这样  
 
            string stringData = Encoding.UTF8.GetString(data, 0, recv);  
            text2 += "\n" + "回收发送数据:+++++++++++++++" + stringData;  
 
        }  
 
 
        void CloseSocket()                  //关闭socket  
        {  
            if (client.Connected)  
            {  
                echo("关闭socket");  
                client.Close();  
            }              
        }  
        void OnApplicationQuit()  
        {  
            CloseSocket();  
        }  
 
        void echo(object msg)  
        {  
            Debug.Log(msg);  
        }  
 
        string text = "";  
        string text2 = "";  
        Vector2 p = new Vector2(600, 300);  
        void OnGUI()  
        {  
            GUILayout.BeginVertical(GUILayout.Width(500) );  
                text = GUILayout.TextField(text);  
                if (GUILayout.Button("发送数据"))  
                {  
                    Send(text);  
                }  
                GUILayout.BeginScrollView(p);  
                text2 = GUILayout.TextArea(text2, GUILayout.Height(300));  
                GUILayout.EndScrollView();  
            GUILayout.EndVertical();  
 
        }  
 
    }  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值