简单版socket线程连接,同步消息(异步连接)

本文详细介绍了如何实现简单的Socket线程连接,包括服务器端和客户端的设置,同时探讨了同步消息传递和异步连接的概念及其应用场景。
摘要由CSDN通过智能技术生成

----- 服务器

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.Sockets;
    using System.Net;
    using System.Threading;

    namespace Socket_Server // 服务端
    {
        class Program
        {
            static List<Socket> socketlist = new List<Socket>();
            static void Main(string[] args)
            {
                // 实例化 socket
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888); // 绑定 ip 和 port
                server.Bind(point);
                server.Listen(100); // 开启监听
                Console.WriteLine("服务器启动");
                server.BeginAccept(new AsyncCallback(AcceptClient), server);
                Console.ReadKey();
            }
            static void AcceptClient(IAsyncResult iar)
            {
                Socket server = iar.AsyncState as Socket;
                Socket client = server.EndAccept(iar); // 保存异步链接的客户端
                Console.WriteLine("已连接...");
                socketlist.Add(client);
                Thread th = new Thread(ReceiveMsg); // 开启客户端线程
                th.Start(client);
                server.BeginAccept(new AsyncCallback(AcceptClient), server);
            }

            // 接受消息
            static void ReceiveMsg(object obj)
            {
                Socket socket = obj as Socket;
                while (true)
                {
                    byte[] buffer = new byte[1024];
                    int length = 0;
                    try
                    {
                        length = socket.Receive(buffer);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Exception: " + e.Message);
                        IPEndPoint point = socket.RemoteEndPoint as IPEndPoint;
                        string ipEndpoint = point.Address.ToString();
                        Console.WriteLine(ipEndpoint + ":退出...");
                        socketlist.Remove(socket);
                        SendMsgToAll(ipEndpoint + ":有客户端退出..."); // 调用群发消息
                        break;
                    }
                    string resMsg = Encoding.UTF8.GetString(buffer, 0, length);
                    IPEndPoint IEP = socket.RemoteEndPoint as IPEndPoint;
                    string ip = IEP.Address.ToString();
                    string time = DateTime.Now.ToString();
                    resMsg = "[" + ip + "  " + time + "]" + ": \n" + resMsg;
                    Console.WriteLine(resMsg);
                    SendMsgToAll(resMsg);
                }
            }

            // 群发消息
            static void SendMsgToAll(string resMsg)
            {
                // 把就收到的消息群发出去
                for (int i = 0; i < socketlist.Count; i++)
                {
                    socketlist[i].Send(Encoding.UTF8.GetBytes(resMsg));
                }
            }
        }

-----客户端

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
public class Chat : MonoBehaviour
{
    string Message;
    Socket client;
    void Start()
    {

        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));
        Thread th = new Thread(new ThreadStart(ReceiveMsg));
        th.Start();
    }
    void Update()
    {
    }
    void OnDestroy()
    {
        client.Close();
    }
    void ReceiveMsg()
    {
        while (true)
        {
            byte[] buffer = new byte[1024];
            int length = client.Receive(buffer);
            string resMsg = "\n" + Encoding.UTF8.GetString(buffer, 0, length);
            string str = showMsg.text;
            Debug.Log("收到:" + resMsg);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值