前言
前面已经把游戏的服务端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. 预科班D2

    2020.09.08星期二 预科班D2 学习内容: 一.复习 1.平台: 平台=操作系统+计算机硬件 2.跨平台性 3.文件 文件是指操作系统提供给上层使用者操作硬盘的一种功能.

  2. IDEA 2020.2安装破解版教程激活码注册码破解补丁 for Mac Windows Linux-中关村老大爷

    IntelliJ Idea Ultimate 2020.2.x版软件最新安装破解版教程方法,本教程提供Idea Ultimate 2020.2版安装包,破解补丁,激活码,亲测100%完美破解激活,支持 ...

  3. Book of Shaders 02 - 矩阵:二维仿射变换练习

    0x00 一些废话 如果要深入学习 CG (Computer Graphics,计算机图形学),必然要学习相关的数学知识.CG 涉及到多个不同的领域,根据所研究领域的不同,也会涉及到不同的数学分支.但 ...

  4. Vue axios封装 实现请求响应拦截

    封装 axios.js import axios from 'axios' import { baseURL } from '@/config' class HttpRequest { constru ...

  5. matlab数字图像处理-冈萨雷斯-读取,显示,保存图像

    图像读取:imread(filename) 显示图像‘ 显示多幅图像 保存图像 b 计算压缩比

  6. 骚操作:不重启 JVM,如何替换掉已经加载的类?

    Java对象行为 java.lang.instrument.Instrumentation 直接操作字节码 BTrace Arthas 三生万物 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在 ...

  7. Python列出指定目录下的子目录/文件或者递归列出

    1.python只列出当前目录(或者指定目录)下的文件或者目录条目 import os files,dirs=[],[] for item in os.listdir(): if os.path.is ...

  8. linux学习(七)文件打包和压缩命令

    一.前言 在Windows操作系统下,我们会使用WinRAR或者快压等等的压缩软件来进行压缩或者解压. 在Linux下当然也存在压缩或解压的操作,下面我们就来学习一下在Linux下是怎么压缩和解压的! ...

  9. 记一次磁盘UUID不能识别故障处理

    早上zabbix报警,磁盘满了,登录服务器查看信息,一顿操作,突然发现最后lvextend命令不能扩容,查看LVM信息 报错信息"Couldn't find device with uuid ...

  10. 转载:关于Python3中venv虚拟环境

    https://www.cnblogs.com/zhaof/p/7299025.html