程序下载地址:

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. 【Chrome】新建Chrome插件,新建,事件行为,本地存储

    源:walkingq 1,新建:静态网站+manifest.json:[注:mainifest_version是chrome 18以后新增key] manifest.json 截图 2,事件行为: 3 ...

  2. bzoj4458: GTY的OJ

    题目大意:给定一棵带点权的有根树,同时给定L,R,要求找M条链,每条链满足以下条件的情况下,要求所有链权和最大: 1.两两不相同(可以包含/相交等) 2.节点数在[L,R]间 3.其中一个端点的深度必 ...

  3. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  4. java中Integer,String判断相等与integer的比较大小

    package sfk.bbs.test.springjsbctempletTest; import static org.junit.Assert.*; import org.junit.Test; ...

  5. 防DDOS攻击SHELL脚本

    最近一段时间服务器频繁遭到DDOS攻击,目前只能通过封IP来源来暂时解决.IP不源变化多端,光靠手工来添加简直是恶梦,想了个方法,用SHELL来做. 比较简单,但很实用:) 以下内容根据作者原文进行适 ...

  6. Makefile 规则的使用

    1.Makefile格式 //最终目标 all: led.o //依赖 arm-linux-ld -Tled.lds -o led.elf led.o //命令 arm-linux-objcopy - ...

  7. Socket异步通讯

    1.可以通过多线程来解决(一会补上) 2.Socket在tcp/udp两种通信协议下的异步通信: 基于TCP的异步通信: BeginAccept方法和endeaccept方法 包含在System.Ne ...

  8. ypzl药品质量不合格数据库-excel自动排版

    原创: qq:231469242 import xlrdimport pandas,numpyimport matplotlib.pyplot as pltimport pandas as pd #参 ...

  9. DirectX SDK

    http://blog.csdn.net/c4501srsy/article/details/17403927 http://blog.csdn.net/yy649487394/article/det ...

  10. seajs源码分析

    seajs主要做了2件事 1.定义什么是模块,如何声明模块:id.deps.factory.exports ----define=function(id,deps,factory){return ex ...