zoukankan      html  css  js  c++  java
  • Unity C# Scoket Thread

    关于 Scoket和Thread 也没什么要说的,网上有很多资料。但是需要注意的是 Scoket和Thread 都需要创建和杀死。不然一定会造成程序假死。好了上代码

    服务器:

      1 using System;
      2 using System.Collections;
      3 using System.Collections.Generic;
      4 using System.IO;
      5 using System.Net;
      6 using System.Net.Sockets;
      7 using System.Text;
      8 using System.Threading;
      9 using UnityEngine;
     10 
     11 public class TCPTestServer : MonoBehaviour
     12 {
     13     #region private members     
     14     /// <summary>     
     15     /// 服务器监听连接    
     16     /// </summary>     
     17     private TcpListener tcpListener;
     18     /// <summary> 
     19     /// 服务器监听线程
     20     /// </summary>     
     21     private Thread tcpListenerThread;
     22     /// <summary>     
     23     /// 创建连接上的客户端
     24     /// </summary>     
     25     private TcpClient connectedTcpClient;
     26     #endregion
     27 
     28     // Use this for initialization
     29     void Start()
     30     {
     31         // 启动服务器监听线程        
     32         tcpListenerThread = new Thread(new ThreadStart(ListenForIncommingRequests));
     33         tcpListenerThread.IsBackground = true;
     34         tcpListenerThread.Start();
     35     }
     36 
     37     // Update is called once per frame
     38     void Update()
     39     {
     40         // 服务器发送测试数据
     41         if (Input.GetKeyDown(KeyCode.R))
     42         {
     43             Debug.Log("R");
     44             SendMessage();
     45         }
     46 
     47         if (Input.GetKeyDown(KeyCode.Escape))
     48         {
     49             Debug.Log("Escape Server");
     50             Close();
     51             Application.Quit();
     52         }
     53     }
     54 
     55     /// <summary>     
     56     /// 服务器监听
     57     /// </summary>     
     58     private void ListenForIncommingRequests()
     59     {
     60         try
     61         {
     62             // 创建监听端口
     63             tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8052);
     64             tcpListener.Start();
     65             Debug.Log("Server is listening");
     66             Byte[] bytes = new Byte[1024];
     67             while (true)
     68             {
     69                 using (connectedTcpClient = tcpListener.AcceptTcpClient())
     70                 {                
     71                     using (NetworkStream stream = connectedTcpClient.GetStream())
     72                     {
     73                         int length;                        
     74                         while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
     75                         {
     76                             var incommingData = new byte[length];
     77                             Array.Copy(bytes, 0, incommingData, 0, length);                            
     78                             string clientMessage = Encoding.Unicode.GetString(incommingData);
     79                             Debug.Log("客户端: " + clientMessage);
     80                         }
     81                     }
     82                 }
     83             }
     84         }
     85         catch (SocketException socketException)
     86         {
     87             Debug.Log("SocketException " + socketException.ToString());
     88         }
     89     }
     90     /// <summary>     
     91     /// Send message to client using socket connection.     
     92     /// </summary>     
     93     private void SendMessage()
     94     {
     95         if (connectedTcpClient == null)
     96         {
     97             return;
     98         }
     99 
    100         try
    101         {
    102             // Get a stream object for writing.             
    103             NetworkStream stream = connectedTcpClient.GetStream();
    104             if (stream.CanWrite)
    105             {
    106                 string serverMessage = "小畜生";
    107                 byte[] serverMessageAsByteArray = Encoding.Unicode.GetBytes(serverMessage);
    108                 stream.Write(serverMessageAsByteArray, 0, serverMessageAsByteArray.Length);
    109             }
    110         }
    111         catch (SocketException socketException)
    112         {
    113             Debug.Log("Socket exception: " + socketException);
    114         }
    115     }
    116 
    117     private void OnApplicationQuit()
    118     {
    119         Close();
    120     }
    121 
    122     private void OnDestroy()
    123     {
    124         Close();
    125     }
    126 
    127     // 关闭TCP连接和线程,防止程序假死
    128     void Close()
    129     {
    130         if (tcpListenerThread != null)
    131         {
    132             tcpListenerThread.Interrupt();
    133             tcpListenerThread.Abort();
    134         }
    135 
    136         if(null != tcpListener)
    137         {
    138             tcpListener.Stop();
    139         }
    140 
    141         if(null != connectedTcpClient)
    142         {
    143             connectedTcpClient.Close();
    144         }
    145     }
    146 }
    Server

    客户端:

      1 using System;
      2 using System.Collections;
      3 using System.Collections.Generic;
      4 using System.Net.Sockets;
      5 using System.Text;
      6 using System.Threading;
      7 using UnityEngine;
      8 using UnityEngine.UI;
      9 using Newtonsoft.Json;
     10 using System.IO;
     11 
     12 public class TCPTestClient : MonoBehaviour
     13 {
     14     #region private members     
     15     private TcpClient socketConnection;
     16     private Thread clientReceiveThread;
     17     #endregion
     18     // Use this for initialization     
     19     void Start()
     20     {
     21         
     22     }
     23     // Update is called once per frame
     24     void Update()
     25     {
     26         // 连接服务器
     27         if (Input.GetKeyDown(KeyCode.Q))
     28         {
     29             Debug.Log("Q");
     30             ConnectToTcpServer();
     31         }
     32 
     33         // 发送消息到服务器
     34         if (Input.GetKeyDown(KeyCode.Space))
     35         {
     36             Debug.Log("Space");
     37             SendMessage();
     38         }
     39 
     40         if (Input.GetKeyDown(KeyCode.Escape))
     41         {
     42             Debug.Log("Escape Client");
     43             Close();
     44             Application.Quit();
     45         }
     46 
     47     }
     48     /// <summary>     
     49     /// 连接服务器    
     50     /// </summary>     
     51     private void ConnectToTcpServer()
     52     {
     53         try
     54         {
     55             clientReceiveThread = new Thread(new ThreadStart(ListenForData));
     56             clientReceiveThread.IsBackground = true;
     57             clientReceiveThread.Start();
     58         }
     59         catch (Exception e)
     60         {
     61             Debug.Log("On client connect exception " + e);
     62         }
     63     }
     64     /// <summary>     
     65     /// 接受服务器消息
     66     /// </summary>     
     67     private void ListenForData()
     68     {
     69         try
     70         {
     71             socketConnection = new TcpClient("localhost", 8052);
     72             Byte[] bytes = new Byte[1024];
     73             while (true)
     74             {
     75                 // Using 用完就会销毁            
     76                 using (NetworkStream stream = socketConnection.GetStream())
     77                 {
     78                     int length;
     79                     while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
     80                     {
     81                         var incommingData = new byte[length];
     82                         Array.Copy(bytes, 0, incommingData, 0, length);
     83                         string serverMessage = Encoding.Unicode.GetString(incommingData);
     84                         Debug.Log("服务器: " + serverMessage);                                  
     85                     }
     86                 }
     87             }
     88         }
     89         catch (SocketException socketException)
     90         {
     91             Debug.Log("Socket exception: " + socketException);
     92         }
     93     }
     94     /// <summary>     
     95     /// 发送数据    
     96     /// </summary>     
     97     private void SendMessage()
     98     {
     99         if (socketConnection == null)
    100         {
    101             return;
    102         }
    103         try
    104         {        
    105             NetworkStream stream = socketConnection.GetStream();
    106             if (stream.CanWrite)
    107             {
    108                 string clientMessage = "小妖精";
    109                 byte[] clientMessageAsByteArray = Encoding.Unicode.GetBytes(clientMessage);
    110                 stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
    111             }
    112         }
    113         catch (SocketException socketException)
    114         {
    115             Debug.Log("Socket exception: " + socketException);
    116         }
    117     }
    118 
    119     public void CreatePagoda(string str)
    120     {
    121         ModelCreate.modelDelegate(str);
    122     }
    123 
    124     private void OnApplicationQuit()
    125     {
    126         Close();
    127     }
    128 
    129     private void OnDestroy()
    130     {
    131         Close();
    132     }
    133 
    134     // 关闭TCP连接和线程,防止程序假死
    135     void Close()
    136     {
    137         if (null != clientReceiveThread)
    138         {
    139             clientReceiveThread.Interrupt();
    140             clientReceiveThread.Abort();            
    141         }
    142         if (null != socketConnection)
    143         {
    144             socketConnection.Close();
    145         }
    146     }
    147 }
    Client
  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/huojiaoqingchun0123/p/10888532.html
Copyright © 2011-2022 走看看