Socket通信(二)
程序下载地址:
http://download.csdn.net/detail/u010312811/9683748
1.基本流程
服务器:
(1)用指定的端口号和服务器的IP建立一个EndPoint对象
(2)建立一个Socket对象
(3)用Socket对象的Bind()方法绑定EndPoint
(4)用Socket对象的Listen()方法开始监听
(5)接受客户端的连接,用Socket对象的Accept()方法创建新的Socket对象用于和请求的客户端进行通信
(6)通信结束后一定要关闭Socket
客户端:
(1)用指定的端口号和服务器的IP建立一个EndPoint对象
(2)建立一个Socket对象
(3)用Socket对象的Connect()方法以上面建立的EndPoint对象作为参数,向服务器发出连接请求
(4)如果连接成功,就用Socket对象的Send()方法向服务器发送信息
(5)用Socket对象的Receive()方法接收服务器发来的信息
(6)通信结束后需要关闭Socket
2.功能及效果图:
- Server和Client进行封装,方便调用
- 消息进行封装,消息收发利用Linq
- 消息使用事件进行发布订阅,降低耦合度
- 支持消息发送、文件发送(文件大小不超过10M)
- 服务器端支持用户昵称,上下线提醒
3.服务器功能介绍:
(1)服务器开始监听:
- 订阅消息接收事件
- 订阅文件接收事件
- 订阅用户的登陆、退出事件
//服务器开始监听端口
server.StartListen(txtIp.Text, int.Parse(txtPort.Text));
//服务器接收到消息
server.MessageReceived += server_MessageReceived;
//服务器接收到文件
server.FileReceived += server_FileReceived;
//服务器订阅用户的登录退出事件
server.UserLogIn += server_UserLogIn;
server.UserLogOut += server_UserLogOut; txtMsgReceive.Text += "服务器开始监听!\r\n";
(2)消息的发送:
- 获取需要发送的消息
- 将消息进行封装
- 获取需要接收数据的客户端IP
- 发送消息
//获取需要发送的消息
string strMsg = txtMsgSend.Text;
//填充数据结构
MessageBase mb = new MessageBase();
mb.UserName = "服务器";
mb.MessageType = MessageType.Message; //消息类型
mb.Messages = Encoding.Default.GetBytes(strMsg); //发送的消息转换为字节数组
mb.FileName = ""; //发送消息,文件名填空
//获取用户名和用户IP
string name=lbOnlineList.SelectedItem.ToString();
string ip=server.GetUserID(name);
//发送消息
if (name != "")
server.SendMessage(ip, mb);
else
MessageBox.Show("错误!");
(3)文件的发送:
- 获取本地文件路径
- 通过FileStream读取文件,并将文件保存为byte数组
- 将消息进行封装
- 获取需要接收数据的客户端IP
- 发送消息
//获取文件路径
string filePath = txtSelectFile.Text;
//发送消息
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
byte[] arrFile = new byte[bufferSize];
int length = fs.Read(arrFile, , arrFile.Length);
byte[] arrFileSend = new byte[length];
Array.Copy(arrFile, , arrFileSend, , length); MessageBase mb = new MessageBase();
mb.UserName = "服务器";
mb.MessageType = MessageType.File; //消息类型
mb.Messages = arrFileSend; //文件转换为字节数组
mb.FileName = Path.GetFileName(filePath); //文件名
//获取用户名和用户IP
string name = lbOnlineList.SelectedItem.ToString();
string ip = server.GetUserID(name);
//发送文件
if (name != "")
server.SendFile(ip, mb);
else
MessageBox.Show("错误!");
}
(4)消息的接收:
- 获取消息的封装
- 获取消息并处理数据
string strMsg = Encoding.Default.GetString(mb.Messages);
Action Update = () =>
{
txtMsgReceive.Text += string.Format("{0}[{1}]:\r\n{2}\r\n",mb.UserName,DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"),strMsg );
};
//Invoke(Update); //同步的方法
BeginInvoke(Update); //异步的方法
(5)文件的接收:
- 另存为对话框提示,获取保存的路径及文件名
- 提取消息并进行处理
Action Update = () =>
{
//弹出保存对话框
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = mb.FileName;
DialogResult dr = sfd.ShowDialog(); if (dr == DialogResult.OK)
{
//获取文件保存的路径
string fileSavePath = sfd.FileName;
//创建文件流,然后根据路径创建文件
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
{
fs.Write(mb.Messages, , mb.Messages.Length);
MessageBox.Show("文件保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
}
};
Invoke(Update);
(6)有新用户登录:
- 获取系统中的用户列表
- 更新用户显示列表
string[] users = server.GetUsers();
Action Update = () =>
{
lbOnlineList.Items.Clear();
for (int i = ; i < users.Length; i++)
{
lbOnlineList.Items.Add(users[i]);
} lbOnlineList.SelectedIndex = ;
};
Invoke(Update);
(7)用户退出:
- 获取系统中的用户列表
- 更新用户显示列表
string[] users = server.GetUsers();
Action Update = () =>
{
lbOnlineList.Items.Clear();
for (int i = ; i < users.Length; i++)
{
lbOnlineList.Items.Add(users[i]);
}
};
Invoke(Update);
4.客户端功能介绍:
(1)连接服务器:
- 实例化一个客户端
- 客户端连接到服务器
- 订阅客户端的消息接收事件、文件接收事件
client = new Client();
client.ConnectServer(txtIp.Text, int.Parse(txtPort.Text));
//客户端接收到消息
client.MessageReceived += client_MessageReceived;
//客户端接收到文件
client.FileReceived += client_FileReceived;
(2)消息的发送:
- 获取需要发送的消息
- 对消息进行封装
- 向服务器发送消息
//获取需要发送的消息
string strMsg = txtSendMsg.Text;
//填充数据结构
MessageBase mb = new MessageBase();
mb.UserName = txtName.Text; //用户名
mb.MessageType = MessageType.Message; //消息类型
mb.Messages = Encoding.Default.GetBytes(strMsg); //发送的消息转换为字节数组
mb.FileName = ""; //发送消息,文件名填空
//客户端向服务器发送消息
client.SendMessage(mb);
(3)文件的发送:
- 获取本地文件路径
- 通过FileStream读取文件,并将文件保存为byte数组
- 将消息进行封装
- 获取需要接收数据的客户端IP
- 发送文件
//获取文件路径
string filePath = txtSelectFile.Text;
//发送消息
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
byte[] arrFile = new byte[bufferSize];
int length = fs.Read(arrFile, , arrFile.Length);
byte[] arrFileSend = new byte[length];
Array.Copy(arrFile, , arrFileSend, , length); MessageBase mb = new MessageBase();
mb.UserName = txtName.Text; //用户名
mb.MessageType = MessageType.File; //消息类型
mb.Messages = arrFileSend; //文件转换为字节数组
mb.FileName = Path.GetFileName(filePath); //文件名 client.SendFile(mb);
}
(4)消息的接收:
- 获取消息的封装
- 获取消息并处理数据
string strMsg = Encoding.Default.GetString(mb.Messages);
Action Update = () =>
{
txtReceiveMsg.Text += string.Format("{0}[{1}]:\r\n{2}\r\n", mb.UserName, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), strMsg);
};
//Invoke(Update); //同步
BeginInvoke(Update); //异步
(5)文件的接收:
- 另存为对话框提示,获取保存的路径及文件名
- 提取消息并进行处理
Action Update = () =>
{
//弹出保存对话框
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = mb.FileName; ;
DialogResult dr = sfd.ShowDialog(); if (dr == DialogResult.OK)
{
string fileSavePath = sfd.FileName;//获取文件保存的路径
//创建文件流,然后根据路径创建文件
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
{
fs.Write(mb.Messages, , mb.Messages.Length);
MessageBox.Show("文件保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
}
};
Invoke(Update);
Socket通信(二)的更多相关文章
- java scoket Blocking 阻塞IO socket通信二
在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...
- 使用Socket通信(二)
这个socket有梗,主要是服务器端有梗,可能大家会碰到同样的问题,网上查了好久,这里分享一下解决办法.首先在第一个module建一个类SimpleServer,这个类就是服务端,建好之后在代码左边有 ...
- 网络编程、三要素、Socket通信、UDP传输、TCP协议、服务端(二十五)
1.网络编程概述 * A:计算机网络 * 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- Socket 通信(基础原理、实时聊天系统雏形)
什么是 Socket? Socket 英文直译为"孔或插座",也称为套接字.用于描述 IP 地址和端口号,是一种进程间的通信机制.你可以理解为 IP 地址确定了网内的唯一计算机,而 ...
随机推荐
- Python-12-MySQL & sqlalchemy ORM
MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...
- C#调用LUA函数
using UnityEngine; using System.Collections; using LuaInterface; public class testLUACALL : MonoBeha ...
- LeetCode "419. Battleships in a Board"
The follow-up question is fun: "Could you do it in one-pass, using only O(1) extra memory and w ...
- docfx daylybuild
参考:https://myget.org/gallery/docfx-dev 根据对应的vs或nuget版本中添加地址. PS:daylybuild可能包含很多错误哦.
- Asp.Net MVC<七>:Model
Model 指ViewModel ,其作用: 用于目标Action的参数绑定 用于View呈现 Model元数据则是对ViewModel数据类型的描述,其作用在于控制作为Model的数据对象在View ...
- UIDynamic(简单介绍)
一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现 ...
- Spinner
资源的方式添加 安卓中的下拉框 Spinner可以通过xml string中配置 <string-array name="spingarr"> <item> ...
- PHPExcel读取excel文件
<?php set_time_limit(0); $dir = dirname(__FILE__);//当前脚本所在路径 require $dir."/PHPExcel_1.8.0/C ...
- 怪物AI之发现玩家(视觉范围发现系列)
在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1 ...
- Linux多安全策略和动态安全策略框架演示验证方案及结果分析
3演示验证方案及结果分析3.1演示验证方案3.1.1验证目标该方案主要用于验证采用Flask体系结构实现的SELinux对系统的防护过程及相应的防护原理.3.1.2验证环境操作系统:启用了SELinu ...