自己写的Unity聊天工具

来源:互联网 发布:jpg转换矢量图软件 编辑:程序博客网 时间:2024/06/06 00:10

今天上点干货出来大笑,其实就是上学期的一个网络编程的作业,用Unity做的客户端,用C#直接写的服务端,代码是最简单的Socket编程,基本没有难的东西,不过如果像一年前的我那么菜的话(其实现在也超菜的)应该还是会有点用的。




这里就直接上源码了,真有看了还不会的可以评论哈。

服务端

using System;using System.Collections.Generic;using System.Linq;using System.Net.Sockets;using System.Net;using System.Text;using System.Threading.Tasks;using System.Diagnostics;namespace SocketServer{    class Program    {        public static List<Client> clientList = new List<Client>();        static void Main(string[] args)        {            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6789));            tcpServer.Listen(100);            while (true)            {                Socket clientSocket = tcpServer.Accept();                Console.WriteLine("有一个客户端连接");                Client client = new Client(clientSocket);                clientList.Add(client);            }        }        /// <summary>        /// 广播        /// </summary>        /// <param name="s"></param>        public static void BorodCast(string s,string username)        {            foreach (var item in clientList)            {                if (item.username != username)                {                    byte[] data = Encoding.UTF8.GetBytes(s);                    item.SendMessage(s);                }            }        }        public static Client FindByName(string name)        {            foreach (var item in clientList)            {                if (item.username == name)                    return item;            }            return null;        }    }}

监听到连接后创建Client并把Socket传过去,下面是Client类的代码

using System;using System.Collections.Generic;using System.Linq;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace SocketServer{    class Client    {        public string username;        private Socket clientSocket;        private Thread t;        private byte[] data = new byte[1024];        public Client(Socket clientSocket)        {            this.clientSocket = clientSocket;            t = new Thread(ReceiveMessage);            t.Start();        }        /// <summary>        /// 服务器接受消息        /// </summary>        private void ReceiveMessage()        {            while (true)            {                int bytes = clientSocket.Receive(data);                string s = Encoding.UTF8.GetString(data, 0, bytes);                string[] p = s.Split(' ');                Console.WriteLine(s);                switch (p[0])                {                    case "RequestLogin":                        ResponseLogin(p[1]);                        break;                    case "RequestChat":                        Console.WriteLine("接收到来自" + username + "对" + p[1] + "的聊天请求");                        ResponseChat(p[1]);                        break;                    case "Chat":                        Transmit(p[1],p[2]);                        break;                    case "ChatRoom":                        BroadCast(p[1]);                        break;                }            }        }        /// <summary>        /// 响应登录        /// </summary>        /// <param name="s"></param>        private void ResponseLogin(string s)        {            username = s;            string temp = "LoginSuccessful ";            foreach (var item in UserInfo.user.Keys)            {                temp += item + " ";            }            Console.WriteLine("开始发送Ending" );            temp += "Ending";            clientSocket.Send(Encoding.UTF8.GetBytes(temp));            Console.WriteLine("发送wancheng");            Broad(s);                    }        private void Broad(string s)        {            if (UserInfo.user.ContainsKey(s))            {                UserInfo.user[s] = true;            }            else            {                UserInfo.user.Add(s, true);                Program.BorodCast("NewUser" + " " + s, username);            }        }        /// <summary>        /// 对聊天请求的回应        /// </summary>        /// <param name="s"></param>        private void ResponseChat(string s)        {            if(UserInfo.user.ContainsKey(s))            {                if(UserInfo.user[s]==true)                {                    foreach (var item in Program.clientList)                    {                        if (s == item.username)                            item.SendChatRequest(username);                            }                }            }        }        public void SendMessage(string s)        {            byte[] response = Encoding.UTF8.GetBytes(s);            clientSocket.Send(response);        }        /// <summary>        /// 向被呼叫的客户端发送消息        /// </summary>        /// <param name="name"></param>        public void SendChatRequest(string name)        {            byte[] response = Encoding.UTF8.GetBytes("Called"+" "+name);            this.clientSocket.Send(response);        }        public void Transmit(string a,string b)        {            Program.FindByName(a).SendMessage("Chat"+" "+username + " " + b);        }        public void BroadCast(string s)        {            string str="ChatRoom"+" "+s;            Program.BorodCast(str,username);        }    }}
//存储用户信息的类
namespace SocketServer{    static class UserInfo    {        public static Dictionary<string, bool> user = new Dictionary<string, bool>();    }}

客户端Unity写的参杂太多UI什么的代码这里就不发了,客户端和服务端的源码稍后我直接传资源里,需要的同学可以直接下载,对了别吐槽我消息都是单词,设计个协议什么的哪有直接用单词简单吐舌头

这几天还在自编自导的做一个辣鸡卡牌游戏,做了类似CS的局域网联机模式,大厅啊建主啊加入啊什么的都有,等我把代码整理下(主要是把无关的代码去掉),写好注释就发上来,有比我还菜想学习的同学记着关注,大家共同学习。

源码下载地址:http://download.csdn.net/detail/kzhenguo/9908231