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
  • 相关阅读:
    Monggodb基础
    手游运营数据指标
    JSON语法
    Java中日期转换问题
    Java线程中锁的问题
    鼠标移动监听的注意事项
    链接数据库的问题
    获取显示器的宽高
    JTable的使用问题
    JScrollPane控件中添加其他控件的问题&&JScrollPane设置滚动条&&调整滚动速度
  • 原文地址:https://www.cnblogs.com/huojiaoqingchun0123/p/10888532.html
Copyright © 2011-2022 走看看