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 地址确定了网内的唯一计算机,而 ...
随机推荐
- edge 浏览器中数字显示为链接
在win10 中的Edge浏览器中部分格式的数字显示链接.经过各种搜索找到一篇文章 How to remove phone number link on Iphone? ,通过这篇文章了解 edge ...
- tensorflow学习笔记三:实例数据下载与读取
一.mnist数据 深度学习的入门实例,一般就是mnist手写数字分类识别,因此我们应该先下载这个数据集. tensorflow提供一个input_data.py文件,专门用于下载mnist数据,我们 ...
- ubuntu12.04 安装CS:APP Y86模拟器
下的第一UBUNTU12.04下Y86模拟器的安装:(參考http://archive.cnblogs.com/a/1865627/ 作适当改动) 1.安装bison和flex词法分析工具 sudo ...
- 关于Linux与Windows的区别的文章
你从来只用过Windows,从来没接触过UNIX,只知道把一个文件拽来拽去,只知道硬盘就是C: D: E:却从来没有研究过分区表,也许 会用VC编个程序,很习惯它的集成环境.... 有一天,不管什么原 ...
- testng 6.8.6 eclipse plugin
http://files.cnblogs.com/mikelij/testng.zip
- 对称矩阵、Hermite矩阵、正交矩阵、酉矩阵、奇异矩阵、正规矩阵、幂等矩阵
2016-01-27 21:03 524人阅读 评论(0) 收藏 举报 分类: 理论/笔记(20) 版权声明:本文为博主原创文章,转载请注明出处,谢谢! 题目:对称矩阵.Hermite矩阵.正交矩阵. ...
- linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题
linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...
- github-windows本地安装
Step1 准备工作 msysgit,下载地址为 http://msysgit.github.io/ . Eclipse IDE for Java EE Developers(必须是这个,自带Egit ...
- java String 中用"+"拼接字符串的原理
之前看<thinkinjava>时记得书上分析国这个问题,然后面试的时候问道了,结果面试官说时的很含糊说是new了一个对象,我说底层用的Stringbuild.他还是说我说错了.谨以此文的 ...
- BZOJ3505 [Cqoi2014]数三角形
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...