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 ...
随机推荐
- 移动端 取消0.3ms的延迟 两种方案解决
在index.html中添加一下代码 <script src="https://as.alipayobjects.com/g/component/fastclick/1.0.6/fas ...
- 设计模式之Command
由于学习hystrix的使用和原理 所以就学习了command模式https://www.jdon.com/designpatterns/command.htm Command模式是最让我疑惑的一 ...
- 动态加载dll的实现+远线程注入
1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...
- Java Web学习(九)网络协议详解
一.基本概念 概念:协议是网络中计算机或设备之间进行通信的一系列规则的集合. 协议栈/族:在网络中为了完成通信而使用到的多层上的各种协议按照层次顺序的组合. 作用:建立对等层之间的虚拟通信.实现层次之 ...
- appcan 文件下载与预览
用appcan开发的app如何在手机上查看附件和预览附件呢?今天就为大家介绍一下,用APP看附件实大是太方便了. 1.直接上代码吧,首先要初始化插件用到的所有方法.这个方法中 cbIsFileExis ...
- Mac 环境下配置 MySQL 以及 Mac终端登录MySQL
1.首先mysql官网下载Mac 版 mysql直接安装 2.打开偏好设置-> MySQL -> 查看是否开启mysql服务 3.打开终端 进入mysql目录: /usr/local/my ...
- P2590 树的统计
一道树剖的模板题 首先,由于本人比较懒,就把单点修改写成了区间修改,其实也没有有多大区别(关键是我不会写单点修改QAQ) 不得不说,树剖的码量比较大,调了一上午才勉强调完. 这道题要求我们支持 单点修 ...
- 题解 SP1026 【FAVDICE - Favorite Dice】
首先,这是一道经典的期望dp题 因为最终状态 $ (所有面都被筛到过) $ 是确定的,所以才用 逆推 ,设状态 $ f[i] $ 表示已经筛到了 $ i $ 个不同的面,有 $ i\over n $ ...
- 项目使用eslint
今天eslint版本更新了,然后昂,有些奇奇怪怪的错误提示了,然后想,这我得 1.配置一个保存时根据eslint规则自动修复 2.欸,之前编码遇到未使用的变量都会有标记黄线,我很好定位,这会怎么没了 ...
- c 判断端口是否已被使用
isPortOpen.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...