TCP Socket通信

直接代码 可用
服务端

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets; 
using System.Text;
using System.Threading;
using UnityEngine; 
public class TCPServer : MonoBehaviour
 {
 public static  string ipAdress;
  public static int port;

private byte[] data = new byte[1024];
private Socket serverSocket;//服务器Socket
private Socket client;//客户端Socket
private Thread myThread;//启动监听线程
private Thread receiveThread;//接收数据线程

private List<Socket> clientSocketList = new List<Socket>();
public static TCPServer Instance;
private void Awake()
{
    if (Instance == null)
    {
        Instance = this;
    }
}
void Start()
{
    TCPServer.ipAdress = IPManager.GetIP(ADDRESSFAM.IPv4);


    InitSocket();

}

void InitSocket()
{
    try
    {
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint iPPoint = new IPEndPoint(IPAddress.Parse(ipAdress), port);
        serverSocket.Bind(iPPoint);
        serverSocket.Listen(10);
        Debug.Log("Server Running...");
     
        myThread = new Thread(ListenClientConnect);
       
        myThread.Start();
   

    }
    catch (System.Exception ex)
    {

        Debug.Log(ex.Message);
    }
}

void ListenClientConnect()
{
    while (true)
    {
        client = serverSocket.Accept();
        
        clientSocketList.Add(client);

        Debug.Log("客户端:" + client.RemoteEndPoint + "连接到服务器!");
        AllSendMs("From Server:" + client.RemoteEndPoint + "客户端已连接到服务器!");
      
        receiveThread = new Thread(ReceiveMsg);
        receiveThread.Start(client);
        
    }
}
public static string ReceiveInfo="";
void ReceiveMsg(object clientSocket)
{
    client = clientSocket as Socket;
   
    while (true)
    {
      
        try
        {
            //客户端连接服务器成功后,服务器接收客户端发送的消息
            byte[] buffer = new byte[1024 * 1024 * 3];
            //实际接收到的有效字节数
            int len = client.Receive(buffer);
          
           
            if (len == 0 || client.Poll(100, SelectMode.SelectRead))
            {
                string s = "客户端:" + client.RemoteEndPoint + "断开了连接!";
                Debug.Log(s);
                AllSendMs(s);
                clientSocketList.Remove(client);
                break;
            }

            string str = Encoding.UTF8.GetString(buffer, 0, len);
            ReceiveInfo = str;
            if (ReceiveInfo!="")
            {
                AllSendMs(str);
            }
          
           
            Debug.Log(ReceiveInfo);

          
        }
        catch (System.Exception ex)
        {
            Debug.Log("从服务器获取数据错误" + ex.Message);
            break;
        }
    }
  
}



public  void AllSendMs(string ms)
{
    for (int i = 0; i < clientSocketList.Count; i++)
    {
        clientSocketList[i].Send(Encoding.UTF8.GetBytes(ms));          
    }
}

//void AllSendMs(object obj)
//{
//    for (int i = 0; i < clientSocketList.Count; i++)
//    {
//        data = obj.SerializeToByteArray();
      
//        clientSocketList[i].Send(data, data.Length, 0);
//    }
//}

void OnDestroy()
{

    try
    {
        //关闭线程
        if (myThread != null || receiveThread != null)
        {
            myThread.Interrupt();
            myThread.Abort();

            receiveThread.Interrupt();
            receiveThread.Abort();

        }
        //最后关闭socket
        if (serverSocket != null)
        {
            for (int i = 0; i < clientSocketList.Count; i++)
            {
                clientSocketList[i].Close();
            }

            serverSocket.Shutdown(SocketShutdown.Both);
            serverSocket.Close();

        }
    }
    catch (System.Exception ex)
    {
        Debug.Log(ex.Message);
    }
    print("disconnect");
  }
}

客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;          
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TCPClient : MonoBehaviour
{
public Text texz;
public static  string ipAdress;

public static int port;

private byte[] data = new byte[1024];
public static  Socket clientSocket;
private Thread receiveT;
public static TCPClient Instance;
public static string ReceiceInfo;
private void Awake()
{
    if (Instance ==null)
    {
        Instance = this;
    }
}
void Start()
{
   
    ConnectToServer();
}

void ConnectToServer()
{
   
    try
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Thread.Sleep(1000);
        clientSocket.Connect(IPAddress.Parse(ipAdress), port);
        texz.text += (IPAddress.Parse(ipAdress));
        texz.text += (port);
        Thread.Sleep(1000);
        Debug.Log("连接服务器成功");
        receiveT = new Thread(ReceiveMsg);
        receiveT.Start();

    }
    catch (System.Exception ex)
    {
        texz.text += ex.Message;
        Debug.Log("连接服务器失败!");
        Debug.Log(ex.Message);
    }
}
 
private void ReceiveMsg()
{
    while (true)
    {
        if (clientSocket.Connected == false)
        {
            Debug.Log("与服务器断开了连接");
            break;
        }
        //客户端连接服务器成功后,服务器接收客户端发送的消息
        byte[] buffer = new byte[1024 * 1024 * 3];
        //实际接收到的有效字节数
        int len = clientSocket.Receive(buffer);
      

        string str = Encoding.UTF8.GetString(buffer, 0, len);
        ReceiceInfo = str;
        Debug .Log ("接收到的是:"+ ReceiceInfo);

    }
}

public  void SendMes(string ms)
{
    data = new byte[1024];
    data = Encoding.UTF8.GetBytes(ms);

    clientSocket.Send(data, data.Length , SocketFlags.None);
   
}

void SendMes(GameObject obj)
{   
    //byte[] data = new byte[1024];
    //data = 
    //clientSocket.Send(data, data.Length, 0);
}

void OnDestroy()
{
    try 
    {
        if (clientSocket != null)
        {
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();//关闭连接
        }

        if (receiveT != null)
        {
            receiveT.Interrupt();
            receiveT.Abort();
        }

    }
    catch (Exception ex)
    {
        Debug.Log(ex.Message);
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值