前言
前面已经把游戏的服务端UI搭起来来了,现在需要实现的就是编写服务端控制器与客户端的代码,实现服务端与客户端的数据传输,并将传输情况显示在服务端的UI上

服务端控制器完整代码

private static Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static Thread thread;
private static Thread r_thred;
private static int MaxListen = 1;//最大连入客户端,0无限
private static bool ServerOpen = false; public static List<ClientInfo> Clientlist = new List<ClientInfo>();//用户集合 // GET: WebSocket
public ActionResult Index()
{
if (ServerOpen == false)
{
OpenServer("192.168.64.1", 8090);
}
return View();
} //得到在线人数
public ActionResult OnlineNumber()
{
return Json(Clientlist.Count, JsonRequestBehavior.AllowGet);
} //得到客户的地址
public ActionResult ClientInfodata()
{
if (Clientlist.Count != 0)
{
//var ClientData = new { ClientRemoteEndPoint = Clientlist[0].ClientRemoteEndPoint };
return Json(Clientlist[0].ClientRemoteEndPoint.ToString(), JsonRequestBehavior.AllowGet);
}else
{
return Json(null, JsonRequestBehavior.AllowGet);
} } //得到状态以及消息
public ActionResult getMsg()
{
var data = new { DateTimeS = ReturnJson.DateTimeS, StateCodeI = ReturnJson.StateCodeI, StateTextS = ReturnJson.StateTextS, DataO = ReturnJson.DataO };
return Json(data, JsonRequestBehavior.AllowGet);
} //关闭服务方法
public void CloseServer()
{
try
{
//socketWatch.Close();
//ServerOpen = false; ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 10;
ReturnJson.StateTextS = "服务端已关闭!";
ReturnJson.DataO = null;
}
catch (SocketException e)
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
ReturnJson.DataO = null;
} } //开启服务方法
public void OpenServer(string IP, int Port)
{
try
{
IPAddress iPAddress = IPAddress.Parse(IP);
IPEndPoint iPEnd = new IPEndPoint(iPAddress, Port);
socketWatch.Bind(iPEnd);
socketWatch.Listen(MaxListen);
thread = new Thread(Listen);
thread.IsBackground = true;
thread.Start(socketWatch);
ServerOpen = true;
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 100;
ReturnJson.StateTextS = "服务端准备就绪,等待连接!";
ReturnJson.DataO = IP + ":" + Port; }
catch (SocketException e)
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
ReturnJson.DataO = null;
}
} //服务端等待客户端的连接
private static Socket socketSend;
public void Listen(object o)
{
try
{
Socket socketWatch = o as Socket;
while (true)
{
socketSend = socketWatch.Accept();
r_thred = new Thread(Received);
r_thred.IsBackground = true;
r_thred.Start(socketSend);
ClientInfo clientInfo = new ClientInfo() { ClientRemoteEndPoint = socketSend.RemoteEndPoint.ToString()}; Clientlist.Add(clientInfo); ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 120;
ReturnJson.StateTextS = "服务端已和客户端连接!";
ReturnJson.DataO = null; } }
catch (SocketException e)
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
ReturnJson.DataO = null;
}
} //服务端等待客户端的消息
public void Received(object o)
{
try
{
Socket socketSend = o as Socket;
while (true)
{
byte[] buffer = new byte[1024 * 1024 * 3];
int len = socketSend.Receive(buffer);
if (len == 0)
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "客户端已断开连接!";
ReturnJson.DataO = null;
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, len);
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 140;
ReturnJson.StateTextS = "接收到客户端请求";
ReturnJson.DataO = str;
}
}
catch (SocketException e)
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
ReturnJson.DataO = null;
}
} //服务端发送消息给所有客户端
public void Send(string str)
{
if(Clientlist.Count != 0)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 200;
ReturnJson.StateTextS = "服务端已发送数据!";
ReturnJson.DataO = str;
}else
{
ReturnJson.DateTimeS = DateTime.Now.ToString();
ReturnJson.StateCodeI = 20;
ReturnJson.StateTextS = "当前没有客户端在线,消息没发送出去!";
ReturnJson.DataO = null;
}
} 客户端完整代码
public string IP = "";
public int Port = 0;
private static Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static Thread thread;
private static Thread r_thread; private void Start()
{
ConnectionServer();
}
public void ConnectionServer()
{
try
{
IPAddress iPAddress = IPAddress.Parse(IP);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, Port);
socketWatch.Connect(iPEndPoint);
}
catch (SocketException)
{ }
}
private static Socket socketSend;
public void SendData()
{
//ConnectionServer();
string Str = GameObject.Find("Canvas/InputField").GetComponent<InputField>().text;
byte[] bytestr = Encoding.UTF8.GetBytes(Str);
socketWatch.Send(bytestr, bytestr.Length, 0);
thread = new Thread(ReceiveData);
thread.IsBackground = true;
thread.Start();
} public void ReceiveData()
{
string recvStr = "";
int bytes;
byte[] bytestr = new byte[1024];
bytes = socketWatch.Receive(bytestr, bytestr.Length, 0);
recvStr += Encoding.UTF8.GetString(bytestr, 0, bytes);
Debug.Log(recvStr); }

我们先启动服务端进行监听

打开客户端

服务端检测到客户端上线

客户端发送消息给服务端

服务端发送消息给客户端

服务端检测到客户端下线

后言
我们现在已经完成服务端与客户端的通讯了,如果觉得本技术文章对你有帮助请给我点个赞,如果有什么不足的地方,给我提意见,让我加以改进

C#Socket通讯(2)的更多相关文章

  1. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  2. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  3. c# TCP Socket通讯基础

    在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...

  4. Android笔记:Socket通讯常见问题

    经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2  如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...

  5. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

  6. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  7. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  8. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯

    前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...

  9. .Net中的Socket通讯

    .NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是: ·Socket类 这个低层的类用于管理连接,WebReq ...

  10. Linux网络服务器epoll模型的socket通讯的实现(一)

    准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...

随机推荐

  1. JavaScript 流程控制-循环

    1.循环 循环目的 在实际问题中,有许多具有规律性的重复操作,因此在程序中要完成这类操作就需要重复执行某些语句 JS中的循环 在JS中,主要有三种类型的循环语句: for循环 while循环 do.. ...

  2. Js获取某个节点的类名

    1. document.querySelectorAll(".style-color")[0].getAttribute("class")   2. $('.s ...

  3. hystrix熔断器之配置

    HystrixCommandProperties命令执行相关配置: hystrix.command.[commandkey].execution.isolation.strategy 隔离策略THRE ...

  4. 4.Kafka使用

  5. awk的一些认识

    awk awk '{pattern + action}' {filenames} 当我们所指定的规则脚本过长的时候,我们可以使用-f的选项加上我们的脚本文件.再复杂点我们可以直接调用shell脚本,就 ...

  6. Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案

    一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...

  7. 基于Scrapy的交互式漫画爬虫

    Github项目地址 前言 该项目始于个人兴趣,本意为给无代码经验的朋友做到能开箱即用 阅读此文需要少量Scrapy,PyQt 知识,全文仅分享交流 摘要思路,如需可阅读源码,欢迎提 issue 一. ...

  8. Python练习题 037:Project Euler 009:毕达哥拉斯三元组之乘积

    本题来自 Project Euler 第9题:https://projecteuler.net/problem=9 # Project Euler: Problem 9: Special Pythag ...

  9. MySQL数据库入侵及防御方法

    来自:http://blog.51cto.com/simeon/1981572 作者介绍 陈小兵,高级工程师,具有丰富的信息系统项目经验及18年以上网络安全经验,现主要从事网络安全及数据库技术研究工作 ...

  10. C++重载>>和<<(输入和输出运算符)详解

    转载:http://c.biancheng.net/view/2311.html 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据 ...