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 地址确定了网内的唯一计算机,而 ...
随机推荐
- C#怎么遍历一个对象里面的全部属性?
比如我现在有一个Student的对象,里面有属性stuName,stuAge,stuGender,我现在该怎么写循环才能遍历这几个属性? Student s=new...... foreach (Sy ...
- 初学C#和MVC的一些心得,弯路,总结,还有教训(2)--关于Entity Framework
看了一堆视频教程后,感觉基本了解的差不多了,可以动手.....因为最好的学习方法就是实践嘛.... 所以打算从网站做起,在WebForm和MVC之间选了MVC,因为感觉高大上...也比较灵活 于是买了 ...
- 当Table中td内容为空时,显示边框的办法
1. 在 table的css里面加: border-collapse:collapse;在 td 的css里面加: empty-cells:show; 2 .最简单的就是 在TD里写个 说明: ...
- jquery获取父元素及祖先元素
parent是找当前元素的第一个父节点,parents是找当前元素的所有父节点 先说一下parent和parents的区别 从字面上不难看出 parent是指取得一个包含着所有匹配元素的唯一父元素的元 ...
- 给大家分享一个jQuery TAB插件演示
jquery tab选项卡插件示例页面代码,使用jquery.tabs.js轻量级的tab选项卡插件来实现,并支持鼠标滑过.点击.自动切换.数据回调等功能,有的是点击切换,有的是鼠标滑过切换,自带了多 ...
- Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案(转)
前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件 ...
- ubuntu搭建shad(-_-)owscoks(影梭)
准备步骤 apt-get updateapt-get install python-gevent python-pippip install shadowsocks 新建一个json文件内容如下,文件 ...
- Neural Style学习2——环境安装
neural-style Installation This guide will walk you through the setup for neural-style on Ubuntu. Ste ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
- Maven代理教程
明确代理服务器地址及端口,比如proxy.supremehover.com:8080 找到maven目录下的conf\settings.xml并打开,在proxies节点下添加proxy <pr ...