程序下载地址:

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通信(二)的更多相关文章

  1. java scoket Blocking 阻塞IO socket通信二

    在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...

  2. 使用Socket通信(二)

    这个socket有梗,主要是服务器端有梗,可能大家会碰到同样的问题,网上查了好久,这里分享一下解决办法.首先在第一个module建一个类SimpleServer,这个类就是服务端,建好之后在代码左边有 ...

  3. 网络编程、三要素、Socket通信、UDP传输、TCP协议、服务端(二十五)

    1.网络编程概述 * A:计算机网络 * 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传 ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  6. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  7. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  8. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  10. Socket 通信(基础原理、实时聊天系统雏形)

    什么是 Socket? Socket 英文直译为"孔或插座",也称为套接字.用于描述 IP 地址和端口号,是一种进程间的通信机制.你可以理解为 IP 地址确定了网内的唯一计算机,而 ...

随机推荐

  1. edge 浏览器中数字显示为链接

    在win10 中的Edge浏览器中部分格式的数字显示链接.经过各种搜索找到一篇文章 How to remove phone number link on Iphone? ,通过这篇文章了解 edge ...

  2. tensorflow学习笔记三:实例数据下载与读取

    一.mnist数据 深度学习的入门实例,一般就是mnist手写数字分类识别,因此我们应该先下载这个数据集. tensorflow提供一个input_data.py文件,专门用于下载mnist数据,我们 ...

  3. ubuntu12.04 安装CS:APP Y86模拟器

    下的第一UBUNTU12.04下Y86模拟器的安装:(參考http://archive.cnblogs.com/a/1865627/ 作适当改动) 1.安装bison和flex词法分析工具 sudo ...

  4. 关于Linux与Windows的区别的文章

    你从来只用过Windows,从来没接触过UNIX,只知道把一个文件拽来拽去,只知道硬盘就是C: D: E:却从来没有研究过分区表,也许 会用VC编个程序,很习惯它的集成环境.... 有一天,不管什么原 ...

  5. testng 6.8.6 eclipse plugin

    http://files.cnblogs.com/mikelij/testng.zip

  6. 对称矩阵、Hermite矩阵、正交矩阵、酉矩阵、奇异矩阵、正规矩阵、幂等矩阵

    2016-01-27 21:03 524人阅读 评论(0) 收藏 举报 分类: 理论/笔记(20) 版权声明:本文为博主原创文章,转载请注明出处,谢谢! 题目:对称矩阵.Hermite矩阵.正交矩阵. ...

  7. linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题

    linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...

  8. github-windows本地安装

    Step1 准备工作 msysgit,下载地址为 http://msysgit.github.io/ . Eclipse IDE for Java EE Developers(必须是这个,自带Egit ...

  9. java String 中用"+"拼接字符串的原理

    之前看<thinkinjava>时记得书上分析国这个问题,然后面试的时候问道了,结果面试官说时的很含糊说是new了一个对象,我说底层用的Stringbuild.他还是说我说错了.谨以此文的 ...

  10. BZOJ3505 [Cqoi2014]数三角形

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...