C#Socket通讯(2)
前言
前面已经把游戏的服务端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)的更多相关文章
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- c# TCP Socket通讯基础
在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...
- Android笔记:Socket通讯常见问题
经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2 如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...
- java socket通讯(二)处理多个客户端连接
通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...
- java socket通讯(一) 入门示例
一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...
- 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...
- .Net中的Socket通讯
.NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是: ·Socket类 这个低层的类用于管理连接,WebReq ...
- Linux网络服务器epoll模型的socket通讯的实现(一)
准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...
随机推荐
- adb命令—monkey篇
monkey 目录 monkey 1.Monkey介绍 2.Monkey是用来做什么的 3.Monkey程序介绍 下面就是一些Monkey命令了 1.Monkey介绍 顾名思义,Monkey就是猴子, ...
- Bootstrap学习第二天轮播插件
Bootstrap不仅提供了整套的样式,还提供了一系列插件,帮助开发者构建更受欢迎的网站. Bootstrap的轮播插件用起来很简单,代码如下. <!DOCTYPE html> <h ...
- 原生js实现懒加载并节流
像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费.采用懒加载技术,即用户浏览到哪儿,就加载该处的图片.这样节省网络资源.提升用户体验.减少服务器压力. 方法1: ...
- 关于java基础语法的学习笔记
*java语言特点 1,简单易用 2,跨平台 拥有JVM虚拟机(运行程序) 3,面向对象 4,支持多线程*java核心机制 1,java虚拟机 JVM 2,垃圾回收机制*JDK和JRE JDK JRE ...
- spring framework源码之SpringFactoriesLoader
SpringFactoriesLoader 查询META-INF/spring.factories的properties配置中指定class对应的所有实现类. public abstract clas ...
- PYG2010-02-精装友情通讯录再分析
- Ubuntu18.04安装常用软件指南
安装中文版火狐浏览器 第一步:先卸载:sudo apt-get remove firefox第二步:安装:sudo apt-get install firefox第三步:设置成中文:sudo apt- ...
- 安装Ubuntu虚拟机
centos已经满足不了我了,这里就装了个虚拟机,等有钱了再单配台单系统的Linux主机. 一.下载Ubuntu的ISO文件 用国内的网易镜像站点 进去点个16.04.6,然后下个64位的.iso就好 ...
- 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地
消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...
- 结合 Shell 对 Koa 应用运行环境检查
在开发环境中,启动一个koa 应用服务,通常还需要同时启动数据库.比如.Mongodb.mysql 等 如果一直开着数据库服务,在不使用的话,电脑会占一定的性能.然而如果每次手动去启动服务,效率又不高 ...