zoukankan      html  css  js  c++  java
  • Socket通信

    交互就是比较烦的,涉及的东西还是很多的

    使用Socket通信,在局域网中还是比较合适的。

    TCP的三次握手差不多也可以保证数据的正确性了,算是比较可靠的了

    也参考了网络上其他的一些写法,自己写个测试下,可以通过。

    服务器端:

    
    

    using UnityEngine;
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;

    
    

    using System.Collections.Generic;

    
    

    public class Server1
    : MonoBehaviour
    {
    Socket serverSocket;
    Socket clientSocket;
    Thread clientThread;
    Thread t;
    // Use this for initialization
    void Start()
    {
    t = new Thread(new ThreadStart(OpenServer));
    t.Start();
    }

    
    

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

    
    

    }

    void OpenServer()
    {
    IPAddress ipAdr = IPAddress.Parse("127.0.0.1");

    //端口号,服务器端和客户端需要保持一致,否则端口访问错误
    IPEndPoint ipEp = new IPEndPoint(ipAdr, 8081);
    serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    serverSocket.Bind(ipEp);
    serverSocket.Listen(10);

    
    

    while (true)
    {
    try
    {
    clientSocket = serverSocket.Accept();

    clientThread = new Thread(new ThreadStart(ReceiveData));
    clientThread.Start();

    
    

    }
    catch (System.Exception ex)
    {
    print(ex);
    }
    }
    }

    
    

    void ReceiveData()
    {
    bool keepalive = true;
    Socket s = clientSocket;
    byte[] buffer = new byte[1024];

    
    

    //根据收听到的客户端套接字向客户端发送信息
    IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;
    //lstServer.Items.Add("Client:" + clientep.Address + "("+clientep.Port+")");
    string welcome = "IP为" + clientep.Address + "的客户端连接成功";
    byte[] data = new byte[1024];
    data = Encoding.UTF8.GetBytes(welcome);
    s.Send(data, data.Length, SocketFlags.None);

    
    

    while (keepalive)
    {
    //在套接字上接收客户端发送的信息
    int bufLen = 0;
    try
    {
    bufLen = s.Available;

    
    

    s.Receive(buffer, 0, bufLen, SocketFlags.None);
    if (bufLen == 0)
    continue;
    }
    catch (Exception ex)
    {
    Debug.Log("Receive Error:" + ex.Message);
    return;
    }
    clientep = (IPEndPoint)s.RemoteEndPoint;
    string clientcommand = System.Text.Encoding.UTF8.GetString(buffer).Substring(0, bufLen);
    Debug.Log("服务端收到:" + clientcommand);
    //lstServer.Items.Add(clientcommand + "("+clientep.Address + ":"+clientep.Port+")");

    
    

    }
    }
    }

     

    客户端;

     1 using UnityEngine;
     2 using System;
     3 using System.Net;
     4 using System.Net.Sockets;
     5 using System.Text;
     6 using System.Threading;
     7 
     8 using System.Collections.Generic;
     9 public class Client1
    10     : MonoBehaviour
    11 {
    12     Socket clientSocket;
    13     byte[] sdata = new byte[1024];
    14     Thread t;
    15     // Use this for initialization  
    16     void Start()
    17     {
    18 
    19     }
    20 
    21     // Update is called once per frame  
    22     void Update()
    23     {
    24 
    25     }
    26 
    27     void ConnectServer()
    28     {
    29         IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081);
    30         clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    31         try
    32         {
    33             clientSocket.Connect(ipep);
    34         }
    35         catch (SocketException ex)
    36         {
    37             Debug.Log("connect error: " + ex.Message);
    38             return;
    39         }
    40 
    41         while (true)
    42         {
    43             //接收服务器信息  
    44             int bufLen = 0;
    45             try
    46             {
    47                 bufLen = clientSocket.Available;
    48                 clientSocket.Receive(sdata, 0, bufLen, SocketFlags.None);
    49                 if (bufLen == 0)
    50                 {
    51                     continue;
    52                 }
    53             }
    54             catch (Exception ex)
    55             {
    56                 Debug.Log("Receive Error:" + ex.Message);
    57                 return;
    58             }
    59             string clientcommand = System.Text.Encoding.UTF8.GetString(sdata).Substring(0, bufLen);
    60             Debug.Log("客户端收到:" + clientcommand);
    61           
    62         }
    63     }
    64 
    65     void sendMsg()
    66     {
    67         byte[] data = new byte[1024];
    68         data = Encoding.UTF8.GetBytes(sendStr);
    69         clientSocket.Send(data, data.Length, SocketFlags.None);
    70     }
    71 
    72     string sendStr = "发送信息";
    73     void OnGUI()
    74     {
    75         if (GUILayout.Button("连接"))
    76         {
    77             t = new Thread(new ThreadStart(ConnectServer));
    78             t.Start();
    79         }
    80         sendStr = GUILayout.TextArea(sendStr);
    81         if (GUILayout.Button("send"))
    82         {
    83             sendMsg();
    84         }
    85     }
    86 
    87     
    88 }

    搞定

    只需建立两个项目工程,一个客户端,一个服务器,分别挂载脚本

  • 相关阅读:
    java实现第五届蓝桥杯出栈次序
    java实现第五届蓝桥杯年龄巧合
    java实现第五届蓝桥杯年龄巧合
    java实现第五届蓝桥杯年龄巧合
    java实现第五届蓝桥杯年龄巧合
    java实现第五届蓝桥杯年龄巧合
    Java使用RandomAccessFile读写文件
    Java 实现文件随机读写-RandomAccessFile
    NIO 中文乱码自我解决的简单DEMO
    NIO 中文乱码问题的解决代码实现
  • 原文地址:https://www.cnblogs.com/MissLi/p/6945920.html
Copyright © 2011-2022 走看看