MethodName
Sign in Subscribe

Socket 客户端与服务器的架构初步构想

构想着使用Socket来维持多个客户端和服务器保持着长连接。

Socket 客户端与服务器的架构初步构想

先分享一篇不错的socket的文章

Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)

近期一直在考虑如何做一个多人同时在线的游戏,对于服务器这一块肯定是需要用到socket的,于是先将游戏想的简单一点,比如,这个多人在线的游戏是一个打麻将的,那么只需要最多先支持4个人同时在线就行了,那么服务器要做的事情有:

  • 跟多台客户端保持着长连接(多人同时在线)
  • 将一些信息同时发给每个客户端(洗牌)
  • 将某个客户端发送给服务器的消息传递给其它的客户端(出牌)

那么我先需要的是一个支持多人连接的socket服务器,然后我要将每个新增的连接存起来,并且能够在任意情况下对这个连接的客户端发送消息,服务器代码如下:

服务端:C#控制台程序



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

namespace socket
{
	class MainClass
	{
		static byte[] result = new byte[1024];//接收数据
	    static int myProt = 9527;   //端口  
		static string socketip = "127.0.0.1";
		static Socket serverSocket; //socket对象
		static object[] collectArray = new object[4];//连接对象池
		public static void Main(string[] args)
		{

			//服务器IP地址  
			IPAddress ip = IPAddress.Parse(socketip);
			//创建服务端socket对象
			serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			//绑定IP地址:端口 
			serverSocket.Bind(new IPEndPoint(ip, myProt));   
			//设定最多连接
			serverSocket.Listen(collectArray.Length);    
			Console.WriteLine("启动监听【{0}】成功", serverSocket.LocalEndPoint.ToString());
			//监听线程  
			Thread myThread = new Thread(ListenClientConnect);
			//启动监听
			myThread.Start();
		}

		///   
		/// 监听客户端连接  
		///   
		private static void ListenClientConnect()
		{
			while (true)
			{
				Socket clientSocket = serverSocket.Accept();
				string say = "Server Say Hello";
				clientSocket.Send(Encoding.Default.GetBytes(say),say.Length,0);
				Thread receiveThread = new Thread(ReceiveMessage);


				//创建连接对象,并加入collect池中
				for (int i = 0; i < collectArray.Length; i++)
				{
					if (collectArray[i] == null)
					{
						CollectObject collect = new CollectObject();
						collect.t_socket = clientSocket;
						collect.t_index = i;
						collect.t_userid = "tid_" + i;
						collectArray[i] = collect;
						receiveThread.Start(i);
						Console.WriteLine("新增链接【{0}】", collect.t_userid);
						break;
					}
				}


			}
		}

		///   
		/// 接收消息  
		///   
		///   
		private static void ReceiveMessage(object index)
		{
			CollectObject Mycollect = collectArray[Convert.ToInt32(index)] as CollectObject;
			while (true)
			{
				try
				{
					//通过clientSocket接收数据  
					int receiveNumber = Mycollect.t_socket.Receive(result, result.Length, 0);
					byte[] bt = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, result, 0, receiveNumber);
					string content = Encoding.Unicode.GetString(bt);
					Console.WriteLine("接收消息:【{0}】",content);
					sendData(Mycollect.t_socket, content);
				}
				catch
				{
					//关闭连接
					Mycollect.t_socket.Close();

					Console.WriteLine("链接【{0}】已断开",Mycollect.t_userid);
					//从连接池中删除
					collectArray[Convert.ToInt32(index)] = null;
					break;
				}
			}
		}

		/// 
		/// 发送数据
		/// 
		/// 客服端socket对象
		/// 消息内容
		private static void sendData(Socket clientSocket,string message)
		{
			//发送消息给服务器
			string responStr = "";
			if (message == "a")
			{
				responStr = "尼玛";
			}
			else if (message == "b")
			{
				responStr = "这是密码呀";
			}
			else if (message == "c")
			{
				responStr = "为所欲为";
			}
			else
			{
				responStr = "别以为你发了个("+message+")我就要回复你,滚粗~~~";
			}
			byte[] responBTs = Encoding.Default.GetBytes(responStr);
			clientSocket.Send(responBTs, responBTs.Length, 0);
			Console.WriteLine("发送消息:【{0}】", responStr);
		}

	}




	/// 
	/// 链接对象
	/// 
	class CollectObject
	{
		/// 
		/// socket对象
		/// 
		public Socket t_socket { get; set;}
		/// 
		/// 连接池下标
		/// 
		public int t_index { get; set; }
		/// 
		/// 用户ID
		/// 
		public string t_userid { get; set; }
	}
}

这个简单的服务器最多支持4个客户端同时连接,使用一个固定长度的全局数组和自定义了一个连接对象的类,将每一个新增的连接创建为一个连接对象保存在数组中,然后任意一个客户端发送消息触发某些操作时,或者服务器需要广播消息,都可以通过这个数组将将消息传递给其它客户端,这里的每一个连接都有一个单独线程,安全性有待下一步将客户端做好之后再来实验一下。

Next 使用cocoa2d来开发一个麻将游戏

END

玻璃钢生产厂家沈阳玻璃钢花钵多少钱河源玻璃钢摆件定制泉州玻璃钢动物雕塑多少钱沧州不锈钢花盆加工安徽玻璃钢沙发厂盐城玻璃钢餐桌椅制作揭阳玻璃钢座椅生产厂家永州玻璃钢产品加工吉安玻璃钢雕塑多少钱嘉兴玻璃钢雕塑厂襄阳玻璃钢垃圾桶多少钱孝感玻璃钢制品公司长沙玻璃钢装饰乌海玻璃钢花池定制盐城玻璃钢天花吊顶厂台湾玻璃钢坐凳哪家好北海玻璃钢医疗外壳厂淮南玻璃钢医疗外壳厂家直销桂林玻璃钢医疗外壳生产厂家白城玻璃钢公仔雕塑制造黑河玻璃钢沙发厂家朔州玻璃钢造型加工梅州玻璃钢摆件多少钱绍兴玻璃钢人物雕塑制作淮安玻璃钢医疗外壳价格青海玻璃钢座椅定做固原不锈钢家具价格宁德玻璃钢产品生产厂家白山玻璃钢产品价格儋州玻璃钢座椅制造香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化