Sock基础


z
1 客户端
//客户端 通信套接字
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
Socket sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.获取要连接的服务端 节点
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//3.向服务端 发送链接请求
sokMsg.Connect(endPoint);
//4.开启通信线程
//客户端 通信线程
Thread thrMsg = new Thread(RecevieMsg);
thrMsg.IsBackground = true;
thrMsg.SetApartmentState(ApartmentState.STA);//在winform7 要用到
thrMsg.Start();
------------------------------
void RecevieMsg()
{
//3.1创建 消息缓存区
byte[] arrMsg = new byte[1024 * 1024 * 1];
try
{
while (isRec)
{
//此处 接收 服务器发来的数据中,因为包含了一个 标识符,所以内容的真实长度,应该 - 1
int realLength = sokMsg.Receive(arrMsg) - 1;// Receive 会阻断线程

switch (arrMsg[0])
{
case 0://接收到文本消息
GetMsg(arrMsg, realLength);
break;
case 1://
GeFile(arrMsg, realLength);
break;
default:
break;
}
}
}
catch (Exception ex)
{
sokMsg.Close();
sokMsg = null;
ShowMsg("服务端断开连接!");
}
}

 


2 在服务端
private void btnStartListen_Click(object sender, EventArgs e)
{
try
{
//1.创建【监听套接字】 使用 ip4协议,流式传输,TCP连接
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.绑定端口
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);//127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));//10001
//2.2绑定端口(其实内部 就向系统的 端口表中 注册 了一个端口,并指定了当前程序句柄)
sokWatch.Bind(endPoint);
//2.3设置监听队列(指,限制 同时 处理的 连接请求数--即同时处理的客户端连接请求)
sokWatch.Listen(10);
//2.4开始监听,调用监听线程 执行 监听套接字的 监听方法
thrWatch = new Thread(WatchConnecting);
thrWatch.IsBackground = true;
thrWatch.Start();
ShowMsg("服务器启动啦~~!");
}
catch (SocketException sex)
{
MessageBox.Show("异常:" + sex);
}
catch (Exception ex)
{
MessageBox.Show("异常:" + ex);
}
}

/// <summary>
/// 服务端监听方法
/// </summary>
void WatchConnecting()
{
try
{
//循环监听 客户端的 连接请求
while (isWatch)
{
//2.4开始监听:此方法会阻断当前线程,直到有 其它程序 连接过来,才执行完毕
Socket sokMsg = sokWatch.Accept();
//2.5创建通信管理类
MsgConnection conn = new MsgConnection(sokMsg, ShowMsg, RemoveClient);

//将当前连接成功的 【与客户端通信的套接字】 的 标识 保存起来,并显示到 列表中
//将 远程客户端的 ip和端口 字符串 存入 列表
lbOnline.Items.Add(sokMsg.RemoteEndPoint.ToString());
//将 服务端的通信套接字 存入 字典集合
dictCon.Add(sokMsg.RemoteEndPoint.ToString(), conn);

ShowMsg("有客户端连接了~~!");
}
}
catch (Exception ex)
{
ShowMsg("异常:" + ex);
}
}

// 发送消息
sokMsg.Send();


/// <summary>
/// 断开socket连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btdisConnect_Click(object sender, EventArgs e)
{
//如果当前客户端的链接socket不为空并且处于和服务器的链接状态时,断开当前链接
if (cSocket != null && cSocket.Connected)
{
cSocket.Disconnect(false);
}
}

 


----------------------------可以将一个实体序列化成数组
/// <summary>
/// 将对象序列化成byte[]数组的帮助类,提供序列化和反序列功能
/// </summary>
public class SerDesrHelper
{
/// <summary>
/// 将对象序列化成byte数组
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static byte[] Serialization(object obj)
{
byte[] buffer;
//1 初始化一个二进制流的序列化器
BinaryFormatter ser = new BinaryFormatter();
// 2 定义一个内存流,用来接收二进制流的序列化器将对象obj序列化以后的byte[]数组
using (MemoryStream ms = new MemoryStream())
{
// 3 调用二进制流的序列化器Serialize()方法将obj序列化成二进制流保存到ms中
ser.Serialize(ms, obj);

//4 要将ms的当前流指针定位到0的位置
ms.Position = 0;
// 5 定义一个ms长度的接收byte[]数组
buffer = new byte[ms.Length];

// 6 将ms中的内容读到byte[]数组buffer中
ms.Read(buffer, 0, buffer.Length);
}

// 7 返回有内容的buffer
return buffer;
}

/// <summary>
/// 将byte数组字节码反序列化成相应的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objbty"></param>
/// <returns></returns>
public static T Deserialize<T>(byte[] objbty)
{
if (objbty.Length == 0) return default(T);

//1 初始化一个二进制流的序列化器
BinaryFormatter ser = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream(objbty))
{
return (T)ser.Deserialize(ms);
}
}
}

转载于:https://www.cnblogs.com/cdaq/p/4645579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python转r字符_python r不转义变量

普通字符串常量 含有转义字符&#xff0c;会按照转义字符的意义输出&#xff0c;如下&#xff1a;text"1 E:/Code/PycharmProjects/QtDemo/ToolsList\__pycache__\start.cpython-36.pyc \r\n" print(text) 输出如下&#xff1a;1 E:/Code/PycharmProjects/QtDemo/Too…

uinty粒子系统子物体变大_Unity2018粒子系统全息讲解,坑深慎入(3)

马上注册&#xff0c;加入CGJOY&#xff0c;让你轻松玩转CGJOY。您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册x200357v0p9jufzelwj0uuj.jpg (60.94 KB, 下载次数: 16)2018-6-11 20:22 上传声明&#xff01;声明&#xff01;声明&#xff01;这不会让…

第16/24周 SQL Server 2014中的基数计算

大家好&#xff0c;欢迎回到性能调优培训。上个星期我们讨论在SQL Server里基数计算过程里的一些问题。今天我们继续详细谈下&#xff0c;SQL Server 2014里引入的新基数计算。 新基数计算 SQL Server 2014里一个增强是新的基数计算。上个星期你已经学到老基数计算有些限制&…

python爬虫知乎图片_Python爬虫入门教程 25-100 知乎文章图片爬取器之一

1. 知乎文章图片爬取器之一写在前面 今天开始尝试爬取一下知乎&#xff0c;看一下这个网站都有什么好玩的内容可以爬取到&#xff0c;可能断断续续会写几篇文章&#xff0c;今天首先爬取最简单的&#xff0c;单一文章的所有回答&#xff0c;爬取这个没有什么难度。 找到我们要爬…

mysql主从复制不同步案例_Mysql主从不同步问题处理案例

在使用Mysql的主从复制架构中&#xff0c;有两个比较头疼的问题&#xff1a;1、主从数据不同步后如何处理2、主从同步延迟问题如何解决本文将根据实际案例来分析下问题1&#xff0c;至于问题2多数文档介绍的办法是启用多线程复制来解决&#xff0c;言归正传&#xff0c;这里的问…

九度oj题目1518:反转链表

题目1518&#xff1a;反转链表 时间限制&#xff1a;1 秒 内存限制&#xff1a;128 兆 特殊判题&#xff1a;否 提交&#xff1a;2567 解决&#xff1a;948 题目描述&#xff1a;输入一个链表&#xff0c;反转链表后&#xff0c;输出链表的所有元素。(hint : 请务必使用链表) 输…

python3.6生成exe_Python 3.6打包成EXE可执行程序的实现

1、下载pyinstaller python 3.6 已经自己安装了pip&#xff0c;所以只需要执行 pip install pyinstaller就可以了2、打包程序 进入到你你需要打包的目录&#xff1b;比如我在H:\xcyk开始打包&#xff0c;执行pyinstaller xxx.py我们发现&#xff0c;竟然报错&#xff01;&#…

登录mysql时 未找到 grant命令_我在mysql数据库中可以登陆,为什么用grant命令创建用户时提示错误?...

问题表象&#xff1a;我的mysql中的 my.ini文件配置&#xff1a;[csharp] view plaincopyprint?#Path to installation directory. All paths are usually resolved relative to this.basedir"D:/software_builder/mysql/"#Path to the database rootdatadir"C…

在 Apex 代码中生成 csv 文件

在 Apex 代码中生成 csv 文件可以写一个 Visualforce 页面&#xff0c;设定类型为 excel 的格式&#xff0c;然后调用 PageReference 的 getContent()方法来获取 Blob 格式&#xff0c;存放在附件。 不过另一种更简单的方式就是拼接字符串&#xff0c;csv 即逗号分隔值&#xf…

python实现五大基本算法_算法基础:五大排序算法Python实战教程

排序是每个算法工程师和开发者都需要一些知识的技能。 不仅要通过编码实现&#xff0c;还要对编程本身有一般性的了解。 不同的排序算法是算法设计如何在程序复杂性&#xff0c;速度和效率方面具有如此强大影响的完美展示。 让我们来看看前6种排序算法&#xff0c;看看我们如何…

将10进制整数转换成16进制整数输出

题意&#xff1a; 把十进制整数转换为十六进制&#xff0c;格式为0x开头&#xff0c;10~15由大写字母A~F表示。 Input 每行一个整数x&#xff0c;0< x < 2^31。 Output 每行输出对应的八位十六进制整数&#xff0c;包括前导0。 案例输出&#xff1a; Sample Input 0 1023…

opencvpython教程百度云资源_Python+OpenCV图像处理入门,视频教程下载

课程介绍&#xff1a; 李老师讲课生动、深入浅出&#xff0c;出版OpenCV编程案例详解、Python-OpenCV图穷录、MATLAB图像处理、MATLAB图像案例教程等在线课程。 本课程系统概括了Python-OpenCV的使用方法&#xff0c;让学习者快速入门。根据本课程规划的图书《Python-OpenCV图穷…

将结构体写入文件_将COCO检测结果写入json文件

最近很多朋友留言问我如何将检测结果写入json文件并且用于COCO API的评估&#xff0c;之前对于检测结果的格式已经做了简单的说明&#xff0c;这里提供一些简单的函数&#xff0c;直接调用将结果写入即可。用于COCO API测试的文件格式HUST小菜鸡&#xff1a;用于COCO API测试的…

LR通过SiteScope监控mysql

SiteScope下载&#xff0c;安装 要想使用LoadRunner监测MySQL数据库的性能&#xff0c;LoadRunner没有提供直接监测 MySQL的功能&#xff0c;所以&#xff0c;我们需要借助sitescope监控&#xff0c;然后在LoadRunner显示sitescope监测结果&#xff0c;这样间接地监控MySQL性能…

js for循环_JS 函数的执行时机(深入理解6个6)

定时器&#xff1a;setTimeout()setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式提示&#xff1a; 1000 毫秒 1 秒。 提示&#xff1a; 如果你只想重复执行可以使用 setInterval() 方法。 提示&#xff1a; 使用 clearTimeout() 方法来阻止函数的执行。语法&#x…

OCLint+Xcode 代码规范利器

很多公司里面都会强调代码规范的问题&#xff0c;开发者也都知道代码规范的好处。可实际开发中往往因为各种原因使我们把它的优先级不知不觉中降低了。  这里向一个有代码追求和洁癖的程序猿推荐一个分析工具&#xff0c;它可以成为你重构代码或着review的基本规则 OCLint是一…

python指定文件路径_python实现指定文件夹下的指定文件移动到指定位置

# coding:utf-8 import os import shutil import sys reload(sys) sys.setdefaultencoding(utf8) # print os.getcwd() # 有些文件夹下面有很多文件夹&#xff0c;每个文件夹下面有很多视频文件&#xff0c;现在通过脚本&#xff0c;将文件夹下面的所有文件转移到一个目录下面 …

MySQL求类型为GX的平均积分_mysql基本操作

一、连接操作格式&#xff1a;mysql-h主机地址 -u用户名 -p用户密码例&#xff1a;连接到远程主机上的mysql假设远程主机的IP为&#xff1a;110.110.110.110用户名为root,密码为abcd123则键入以下命令&#xff1a;mysql-h110.110.110.110-uroot-pabcd123二、用户级操作1、selec…

PC-红警联机问题与下载

或许不是软件问题&#xff1a; 你做好相关设置了吗&#xff1f; 红警局域网联机的具体方法: 适用于原版红警、尤里复仇&#xff0c;及任何同样的扩展版。 第一步&#xff1a;安装IPX协议。 方法&#xff1a; 控制面板——网络连接&#xff08;或网上邻居属性&#xff09;——本…

k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

本文很长很长&#xff0c;有很多很多图&#xff0c;包含以下部分&#xff1a;1.算法简介2.如何分类平面点3.如何分类空间点4.如何分类多维数据5.后记提醒&#xff1a;以下内容包括&#xff1a;智障操作&#xff0c;无中生友&#xff0c;重复造轮子 等1.算法简介k均值聚类算法&a…