说明:本类作用:传入一个时间 time,返回和此时间有关的比如"time的今天上午","time的昨天","time的上个季度的第一天",
"time的去年的第二个季度的最后一天的上午的第二个小时",等等.
如果软件中有大量的涉及到时间的算法可以使用本类进行简化,
例:
[mw_shl_code=csharp,true] DateTime timenow = DateTime.Now();
DateTime time = new DateTime();
time = timenow.GetNextMonthBegin();
time = timenow.GetNextQuarterEnd().GetMorningEnd();[/mw_shl_code]
完整类:
[mw_shl_code=csharp,true]using System;
namespace ClassLibrary.UserClass
{
/// *本站禁止HTML标签噢*
/// *本站禁止HTML标签噢* 实现功能:获取指定时间的相对时间段</para>
/// *本站禁止HTML标签噢* 调用方法:直接通过类名调用静态方法</para>
/// *本站禁止HTML标签噢* .</para>
/// *本站禁止HTML标签噢* 创建人员:Clown</para>
/// *本站禁止HTML标签噢* 创建日期:2010-10-31</para>
/// *本站禁止HTML标签噢* 创建备注:</para>
/// *本站禁止HTML标签噢* .</para>
/// *本站禁止HTML标签噢* 修改人员:</para>
/// *本站禁止HTML标签噢* 修改日期:</para>
/// *本站禁止HTML标签噢* 修改备注:</para>
/// </summary>
public static class DateTimeHelper
{
#region 常量
#region 静态常量
#endregion
#endregion
#region 属性
#region 静态属性
#endregion
#endregion
#region 构造
#region 静态构造
#endregion
#endregion
#region 方法
#region 静态方法
/// *本站禁止HTML标签噢*
/// 获取上午起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上午起始时间</returns>
public static DateTime GetMorningBegin(this DateTime time)
{
DateTime timeMorningBegin = Convert.ToDateTime(time.ToString("yyyy-MM-dd 06:00:00"));
return (timeMorningBegin);
}
/// *本站禁止HTML标签噢*
/// 获取上午终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上午终止时间</returns>
public static DateTime GetMorningEnd(this DateTime time)
{
DateTime timeMorningEnd = Convert.ToDateTime(time.ToString("yyyy-MM-dd 12:00:00"));
return (timeMorningEnd);
}
/// *本站禁止HTML标签噢*
/// 获取下午起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下午起始时间</returns>
public static DateTime GetAfternoonBegin(this DateTime time)
{
DateTime timeAfternoonBegin = Convert.ToDateTime(time.ToString("yyyy-MM-dd 12:00:00"));
return (timeAfternoonBegin);
}
/// *本站禁止HTML标签噢*
/// 获取下午终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下午终止时间</returns>
public static DateTime GetAfternoonEnd(this DateTime time)
{
DateTime timeAfternoonEnd = Convert.ToDateTime(time.ToString("yyyy-MM-dd 18:00:00"));
return (timeAfternoonEnd);
}
/// *本站禁止HTML标签噢*
/// 获取晚上起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 晚上起始时间</returns>
public static DateTime GetEveningBegin(this DateTime time)
{
DateTime timeEveningBengin = Convert.ToDateTime(time.ToString("yyyy-MM-dd 18:00:00"));
return (timeEveningBengin);
}
/// *本站禁止HTML标签噢*
/// 获取晚上终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 晚上终止时间</returns>
public static DateTime GetEveningEnd(this DateTime time)
{
DateTime timeEveningEnd = Convert.ToDateTime(time.AddDays(1).ToString("yyyy-MM-dd 06:00:00"));
return (timeEveningEnd);
}
/// *本站禁止HTML标签噢*
/// 获取昨天起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 昨天起始时间</returns>
public static DateTime GetYesterdayBegin(this DateTime time)
{
DateTime timeYesterdayBegin = Convert.ToDateTime(time.AddDays(-1).ToString("yyyy-MM-dd"));
return (timeYesterdayBegin);
}
/// *本站禁止HTML标签噢*
/// 获取昨天终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 昨天终止时间</returns>
public static DateTime GetYesterdayEnd(this DateTime time)
{
DateTime timeYesterdayEnd = Convert.ToDateTime(time.ToString("yyyy-MM-dd"));
return (timeYesterdayEnd);
}
/// *本站禁止HTML标签噢*
/// 获取今天起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 今天起始时间</returns>
public static DateTime GetTodayBegin(this DateTime time)
{
DateTime timeTodayBegin = Convert.ToDateTime(time.ToString("yyyy-MM-dd"));
return (timeTodayBegin);
}
/// *本站禁止HTML标签噢*
/// 获取今天终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 今天终止时间</returns>
public static DateTime GetTodayEnd(this DateTime time)
{
DateTime timeTodayEnd = Convert.ToDateTime(time.AddDays(1).ToString("yyyy-MM-dd"));
return (timeTodayEnd);
}
/// *本站禁止HTML标签噢*
/// 获取明天起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 明天起始时间</returns>
public static DateTime GetTomorrowBegin(this DateTime time)
{
DateTime timeTorrowBegin = Convert.ToDateTime(time.AddDays(1).ToString("yyyy-MM-dd"));
return (timeTorrowBegin);
}
/// *本站禁止HTML标签噢*
/// 获取明天终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 明天终止时间</returns>
public static DateTime GetTorrowEnd(this DateTime time)
{
DateTime timeTorrowEnd = Convert.ToDateTime(time.AddDays(2).ToString("yyyy-MM-dd"));
return (timeTorrowEnd);
}
/// *本站禁止HTML标签噢*
/// 获取上月起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上月起始时间</returns>
public static DateTime GetLastMonthBegin(this DateTime time)
{
DateTime timeLastMonthBegin = Convert.ToDateTime(time.AddMonths(-1).ToString("yyyy-MM-01"));
return (timeLastMonthBegin);
}
/// *本站禁止HTML标签噢*
/// 获取上月终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上月终止时间</returns>
public static DateTime GetLastMonthEnd(this DateTime time)
{
DateTime timeLastMonthEnd = Convert.ToDateTime(time.ToString("yyyy-MM-01"));
return (timeLastMonthEnd);
}
/// *本站禁止HTML标签噢*
/// 获取本月起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 本月起始时间</returns>
public static DateTime GetThisMonthBegin(this DateTime time)
{
DateTime timeThisMonthBegin = Convert.ToDateTime(time.ToString("yyyy-MM-01"));
return (timeThisMonthBegin);
}
/// *本站禁止HTML标签噢*
/// 获取本月终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 本月终止时间</returns>
public static DateTime GetThisMonthEnd(this DateTime time)
{
DateTime timeThisMonthEnd = Convert.ToDateTime(time.AddMonths(1).ToString("yyyy-MM-01"));
return (timeThisMonthEnd);
}
/// *本站禁止HTML标签噢*
/// 获取下月起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下月起始时间</returns>
public static DateTime GetNextMonthBegin(this DateTime time)
{
DateTime timeNextMonthBeign = Convert.ToDateTime(time.AddMonths(1).ToString("yyyy-MM-01"));
return (timeNextMonthBeign);
}
/// *本站禁止HTML标签噢*
/// 获取下月结束时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下月结束时间</returns>
public static DateTime GetNextMonthEnd(this DateTime time)
{
DateTime timeNextMonthEnd = Convert.ToDateTime(time.AddMonths(2).ToString("yyyy-MM-01"));
return (timeNextMonthEnd);
}
/// *本站禁止HTML标签噢*
/// 获取一季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 一季度起始时间</returns>
public static DateTime GetFirstQuarterBegin(this DateTime time)
{
DateTime timeFirstQuarterBegin = Convert.ToDateTime(time.ToString("yyyy-01-01"));
return (timeFirstQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取一季度结束时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 一季度结束时间</returns>
public static DateTime GetFirstQuarterEnd(this DateTime time)
{
DateTime timeFirstQuarterEnd = Convert.ToDateTime(time.ToString("yyyy-04-01"));
return (timeFirstQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取二季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 二季度起始时间</returns>
public static DateTime GetSecondQuarterBegin(this DateTime time)
{
DateTime timeSecondQuarterBegin = Convert.ToDateTime(time.ToString("yyyy-04-01"));
return (timeSecondQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取二季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 二季度终止是假</returns>
public static DateTime GetSecondQuarterEnd(this DateTime time)
{
DateTime timeSecondQuarterEnd = Convert.ToDateTime(time.ToString("yyyy-07-01"));
return (timeSecondQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取三季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 三季度起始时间</returns>
public static DateTime GetThirdQuarterBegin(this DateTime time)
{
DateTime timeThirdQuarterBegin = Convert.ToDateTime(time.ToString("yyyy-07-01"));
return (timeThirdQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取三季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 三季度终止时间</returns>
public static DateTime GetThirdQuarterEnd(this DateTime time)
{
DateTime timeThirdQuarterEnd = Convert.ToDateTime(time.ToString("yyyy-10-01"));
return (timeThirdQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取四季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 四季度起始时间</returns>
public static DateTime GetFourthQuarterBegin(this DateTime time)
{
DateTime timeFourthQuarterBegin = Convert.ToDateTime(time.ToString("yyyy-10-01"));
return (timeFourthQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取四季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 四季度终止时间</returns>
public static DateTime GetFourthQuarterEnd(this DateTime time)
{
DateTime timeFourthQuarterEnd = Convert.ToDateTime(time.AddYears(1).ToString("yyyy-01-01"));
return (timeFourthQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取上季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上季度起始时间</returns>
public static DateTime GetLastQuarterBegin(this DateTime time)
{
DateTime timeLastQuarterBegin = Convert.ToDateTime(time.AddMonths(-3 - (time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeLastQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取上季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 上季度终止时间</returns>
public static DateTime GetLastQuarterEnd(this DateTime time)
{
DateTime timeLastQuarterEnd = Convert.ToDateTime(time.AddMonths(-(time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeLastQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取本季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 本季度起始时间</returns>
public static DateTime GetThisQuarterBegin(this DateTime time)
{
DateTime timeThisQuarterBegin = Convert.ToDateTime(time.AddMonths(-(time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeThisQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取本季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 本季度终止时间</returns>
public static DateTime GetThisQuarterEnd(this DateTime time)
{
DateTime timeThisQuarterEnd = Convert.ToDateTime(time.AddMonths(3 - (time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeThisQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取下季度起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下季度起始时间</returns>
public static DateTime GetNextQuarterBegin(this DateTime time)
{
DateTime timeNextQuarterBegin = Convert.ToDateTime(time.AddMonths(3 - (time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeNextQuarterBegin);
}
/// *本站禁止HTML标签噢*
/// 获取下季度终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下季度终止时间</returns>
public static DateTime GetNextQuarterEnd(this DateTime time)
{
DateTime timeNextQuarterEnd = Convert.ToDateTime(time.AddMonths(6 - (time.Month - 1) % 3).ToString("yyyy-MM-01"));
return (timeNextQuarterEnd);
}
/// *本站禁止HTML标签噢*
/// 获取去年起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 去年起始时间</returns>
public static DateTime GetLastYearBegin(this DateTime time)
{
DateTime timeLastYearBegin = Convert.ToDateTime(time.AddYears(-1).ToString("yyyy-01-01"));
return (timeLastYearBegin);
}
/// *本站禁止HTML标签噢*
/// 获取去年终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 去年终止时间</returns>
public static DateTime GetLastYearEnd(this DateTime time)
{
DateTime timeLastYearEnd = Convert.ToDateTime(time.ToString("yyyy-01-01"));
return (timeLastYearEnd);
}
/// *本站禁止HTML标签噢*
/// 获取今年起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 今年起始时间</returns>
public static DateTime GetThisYearBegin(this DateTime time)
{
DateTime timeThisYearBegin = Convert.ToDateTime(time.ToString("yyyy-01-01"));
return (timeThisYearBegin);
}
/// *本站禁止HTML标签噢*
/// 获取今年终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 今年终止时间</returns>
public static DateTime GetThisYearEnd(this DateTime time)
{
DateTime timeThisYearEnd = Convert.ToDateTime(time.AddYears(1).ToString("yyyy-01-01"));
return (timeThisYearEnd);
}
/// *本站禁止HTML标签噢*
/// 获取下年起始时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下年起始时间</returns>
public static DateTime GetNextYearBegin(this DateTime time)
{
DateTime timeNextYearBegin = Convert.ToDateTime(time.AddYears(1).ToString("yyyy-01-01"));
return (timeNextYearBegin);
}
/// *本站禁止HTML标签噢*
/// 获取下年终止时间
/// </summary>
/// <param name="time">输入时间</param>
/// *本站禁止HTML标签噢* 下年终止时间</returns>
public static DateTime GetNextYearEnd(this DateTime time)
{
DateTime timeNextYearEnd = Convert.ToDateTime(time.AddYears(2).ToString("yyyy-01-01"));
return (timeNextYearEnd);
}
#endregion
#endregion
}
}
[/mw_shl_code]
最后,lz想说的是,当初学者你们爱上了类的时候,回过头来想想自己有没有忘记数据库连接怎么写,
码农和程序员的区别在于前者只知道写代码,后者可以兼任软件开发的任何一个职位
另外,lz只有在极个别情况才会出现在这里.....抱歉了...
[查看全文]
本帖最后由 秋声赋 于 2012-6-10 14:44 编辑
简单易懂的现代魔法:C#编程教程(七)Bilibili小工具② 下载地址的解析这次先说视频下载地址的解析.
关于下载地址的获取,我用的方法主要参考了http://9ch.co/t13951,1-1.html这个帖子,当然还是有区别的,毕竟我们是要用程序获取,而不是手动获取.先说明一点,只支持新浪,优酷和土豆,因为我找不到其他的视频源了,毕竟是演示作用…本帖主要会用到AddressResolution和 BilibiliVideo类,当用到相应函数的代码,我也会发出来,详细的请自己看源代码.整体思路是这样的先用BilibiliVideo .GetVideoObject函数开始构造BilibiliVideo对象,代码如下[mw_shl_code=csharp,true] /// *本站禁止HTML标签噢*
/// 用来创建Video对象
/// </summary>
/// <param name="VideoUri">视频地址</param>
/// *本站禁止HTML标签噢* </returns>
public static BilibiliVideo GetVideoObject(string VideoUri)
{
return GetVideoObject(AddressResolution.GetVideoAid(VideoUri).Item1,
AddressResolution.GetVideoAid(VideoUri).Item2);
}
/// *本站禁止HTML标签噢*
/// 用来创建Video对象
/// </summary>
/// <param name="aid">视频AID号,无av</param>
/// <param name="page">视频所在页数</param>
/// *本站禁止HTML标签噢* BilibiliVideo对象</returns>
public static BilibiliVideo GetVideoObject(string aid, int page = 1)
{
//http://api.bilibili.tv/view?type=xml&appkey=03fc8eb101b091fb&id=270656&page=1
const string appkey="03fc8eb101b091fb";
string api = string.Format("http://api.bilibili.tv/view?type={0}&appkey={1}&id={2}&page={3}", "xml", appkey, aid, page.ToString());
WebClient wc = new WebClient();
byte[] result = wc.DownloadData(api);
MemoryStream ms = new MemoryStream(result);
XmlTextReader xr = new XmlTextReader(ms);
xr.ReadStartElement("info");
BilibiliVideo vd = new BilibiliVideo();
vd.index = page;
while (xr.Read())
{
switch (xr.Name)
{
case "play": vd.play = int.Parse(xr.ReadString()); break;
case "review": vd.revie = int.Parse(xr.ReadString()); break;
case "video_review": vd.video_review = int.Parse(xr.ReadString()); break;
case "favorites": vd.favorites = int.Parse(xr.ReadString()); break;
case "title": vd.title = xr.ReadString(); break;
case "description": vd.description = xr.ReadString(); break;
case "tag": vd.tag = xr.ReadString(); break;
case "pic": vd.pic = xr.ReadString(); break;
case "pages": vd.pages = int.Parse(xr.ReadString()); break;
case "from": vd.from = xr.ReadString(); break;
case "author": vd.author = xr.ReadString(); break;
case "mid": vd.mid = xr.ReadString(); break;
case "vid": vd.vid = xr.ReadString(); break;
case "offsite": vd.offsite = xr.ReadString(); break;
default: break;
}
}
return vd;
}[/mw_shl_code]
因为正常情况下,传进来的是视频的地址,所以先会获取视频的Aid号和所在页数||=========================================================
通过AddressResolution.GetVideoAid函数解析视频的Aid号和所在页数,[mw_shl_code=csharp,true] /// *本站禁止HTML标签噢*
/// 获取视频的Aid
/// </summary>
/// <param name="uri">视频的完整地址</param>
/// *本站禁止HTML标签噢* 视频的AID号,视频所在页数</returns>
public static Tuple<string, int> GetVideoAid(string uri)
{
//http://www.bilibili.tv/video/av280915/ index_3.html
string Aid = string.Empty; ;
int Page = 1;
if (uri.Contains("http") | uri.Contains("bilibili"))
{
string[] uriGroup = uri.Split('/');
foreach (var s in uriGroup)
{
if (s.Contains("av"))
{
Aid = s.Substring(2);
}
if (s.Contains("index_"))
{
Page = int.Parse(s.Substring(s.IndexOf('_'), s.IndexOf('.') - s.IndexOf('_')));
}
}
}
else
{
if (uri.Contains("av"))
{
Aid = uri.Substring(2);
}
else
{
Aid = uri;
}
}
try
{
if (int.Parse(Aid) <= 0 | Aid == string.Empty)
{
throw new Exception();
}
}
catch
{
return null;
}
return new Tuple<string, int>(Aid,Page);
}[/mw_shl_code]
其中Tuple<string,int>是二元组,就是包括一个string和一个int的变量,前面代表了Aid号,后面的代表了视频所在页数.整体来说,这段代码应该很容易理解,用户的输入正常情况下就2种一种类似 http://www.bilibili.tv/video/av280915/ 和http://www.bilibili.tv/video/av280915/ index_3.html,一种类似 av280915这样,这2种很容易区分开来,只要判断字符串是否含有”http”或者” bilibili”就行了.if (uri.Contains("http") | uri.Contains("bilibili")) 完成了这项工作.string[] uriGroup =uri.Split('/'); 的作用是以’/’位分隔符将字符串分解成一个字符串数组.我们只要检测每个字符串就能获得Aid号和Page了.应该很好懂,我就不详细说了.||===============================================
然后返回到BilibiliVideo .GetVideoObject函数中来.这里就会用到B站公布给我们的API中的读取视频信息API,B站的文档给出的解释如下:[mw_shl_code=xml,true]http://api.bilibili.tv/view?type=<类型>&appkey= *本站禁止HTML标签噢* &id= *本站禁止HTML标签噢* &page=<页数>
参数:
type: 可选xml/json
id: aid
page: page
appkey 输入获得的APPKey
返回内容:
play 播放次数
review 评论数
video_review 弹幕数
favorites 收藏
title 标题
description 描述
tag 关键字
pic 封面
pages 页数
from 视频来源
author 作者
mid 作者mid
vid 视频源编码
offsite Flash播放调用地址(如果沒有则此视频无法在站外播放)
[/mw_shl_code]
其中appkey是要向B站申请的,代码中那个是我的,你们有兴趣的话可以自己去申请个,很简单, 在http://www.bilibili.tv/html/help.html申请.关于WebAPI的使用,其实就是填好相应参数后,直接访问那个地址就行了,是一个xml文件(我们选的)大概是这样子:[mw_shl_code=xml,true] *本站禁止HTML标签噢*
*本站禁止HTML标签噢* 15881</play>
*本站禁止HTML标签噢* 54</review>
*本站禁止HTML标签噢* 679</video_review>
*本站禁止HTML标签噢* 308</favorites>
*本站禁止HTML标签噢* 【发呆用】良曲10首——请把那眼泪变成温柔的回忆</title>
*本站禁止HTML标签噢*
渣浪 发呆用、作业用、游戏用都可以,up再次精心挑选的图片和歌曲,附带字幕,觉得可以的话记得顶一个啊,能全程盯着视频发呆的将成为超越up主的存在
</description>
*本站禁止HTML标签噢* 发呆、作业、游戏用,好听</tag>
*本站禁止HTML标签噢*
http://i0.loli.my/user/3016/301631/133751612893b754d500338c25.jpg
</pic>
*本站禁止HTML标签噢* 欣の迷失</author>
*本站禁止HTML标签噢* 301631</mid>
*本站禁止HTML标签噢* 1</pages>
<partname/>
*本站禁止HTML标签噢* sina</from>
*本站禁止HTML标签噢* 77392481</vid>
*本站禁止HTML标签噢*
http://static.loli.my/miniloader.swf?aid=270656&page=1
</offsite>
</info>
[/mw_shl_code]
当然我们肯定不能用浏览器访问再手动把获得的信息填到对象中,所以我们要把这个xml文件下载下来,这里就要用到WebClient类了,使用起来非常简单,直接给他个uri就行了,他会自动帮我们下载,并返回一个byte数组,当然也可以直接返回字符串,但是字符串可能会有编码问题,所以这里没有用.然后是xml文件的解析,这里用到XmlTextReader,简单的讲下,先用ReadStartElement函数设定开始读取的元素,这里是到”info”,再用Read函数一个一个的读取,并判断元素的Name属性,并用ReadString函数获取元素的值填入相应的BilibiliVideo对象属性中.到这里创建BilibiliVideo对象的工作就完成了.||============================================
然后主线程会直接调用AddressResolution. ResolutionVideo函数,用来获取视频的下载地址列表,[mw_shl_code=csharp,true] /// *本站禁止HTML标签噢*
/// 解析视频下载地址
/// </summary>
/// <param name="vd">所需解析的视频</param>
/// *本站禁止HTML标签噢* 视频的下载地址列表</returns>
public static string[] ResolutionVideo(BilibiliVideo vd)
{
string[] lstResult = null;
switch (vd.from)
{
case "youku": lstResult = GetVideoSource_Youku(vd); break;
case "sina": lstResult = GetVideoSource_Sina(vd); break;
case "tudou": lstResult = GetVideoSource_Tudou(vd); break;
default: break;
}
return lstResult;
}
[/mw_shl_code]
因为每个视频源的获取地址的方式都不一样,所以先判断是哪个视频源,幸运的是,在刚刚B站返回给我们的信息中有视频源以及视频源所对应的vid号这里只分新浪,优酷,土豆三种,其他的懒得做了.如果看了上面我给的网址,应该就很好理解了,我们分开来说.先说新浪[mw_shl_code=csharp,true]public static string[] GetVideoSource_Sina(BilibiliVideo vd)
{
List *本站禁止HTML标签噢* result=new List *本站禁止HTML标签噢* ();
WebClient wc = new WebClient();
string SinaUrl = string.Format(@"http://v.iask.com/v_play.php?vid={0}",vd.vid);
byte[] askbyte = wc.DownloadData(SinaUrl);
string[] askresults = Encoding.UTF8.GetString(askbyte).Split('\n');
foreach (var s in askresults)
{
if (s.IndexOf(@"http://") >= 0)
{
var a = s.IndexOf(@"http://");
var b = s.IndexOf(@"]]><");
var uri = s.Substring(s.IndexOf(@"http://"), s.IndexOf(@"]]><") - s.IndexOf(@"http://"));
result.Add(uri);
}
}
return result.ToArray();
}[/mw_shl_code]
新浪的很简单,只要按照http://v.iask.com/v_play.php?vid= <vid> 这种格式去访问就能获得下载地址的xml文件,这个xml有点长我就不发出来了,大家可以去http://v.iask.com/v_play.php?vid=77392481这里看看这里面形如:<![CDATA[http://flv.sina.lxdns.com/201206101347/d41040c2e78319b08ac7e0c044f0e8a6/77392529.hlv]]>就是下载地址了,这里用xml文件解析也许有些麻烦,我们直接通过字符串处理来获取下载地址.先下载下来,再用Encoding.UTF8.GetString转换成字符串,分成一行一行的,注意,上面那句话只是一行不是多行.我们发现只有下载地址中会包含” http:// “这样的字符,我们以这个为依据搜索每行,只要有这个就是我们需要的下载地址,然后通过处理获得正确格式的下载地址.然后的优酷和土豆
优酷和土豆的稍微麻烦点,要通过www.flvcd.com来获取,这个网站可以输入优酷或者土豆的地址就直接获得相应的下载地址,当然不是返回xml文件的,所以我们要通过解析网页的源代码获得这些下载地址.[mw_shl_code=csharp,true] public static string[] GetVideoSource_Youku(BilibiliVideo vd)
{
List *本站禁止HTML标签噢* result=new List *本站禁止HTML标签噢* ();
WebClient wc = new WebClient();
string YoukuUrl = string.Format(@"http://v.youku.com/v_show/id_{0}.html", vd.vid);
string AskUrl = @"http://www.flvcd.com/parse.php?kw=" + YoukuUrl + "&format=super";
byte[] askbyte = wc.DownloadData(AskUrl);
string pattern = "<a href *= *\\\"(http://f\\.youku\\.com/player/getFlvPath/[^\\\"]+)";
MatchCollection mas = Regex.Matches(Encoding.UTF8.GetString(askbyte), pattern);
foreach (Match ss in mas)
{
string te = ss.Value;
int i = te.IndexOf('"');
te = te.Substring(i + 1);
result.Add(te);
}
return result.ToArray();
}[/mw_shl_code]
下载网页什么的我就不重复说了.很幸运的是我在网上找到了关于这个网页抓取优酷地址的正则表达式,我并不会正则表达式…但是C#里面用起来还是很方便的, 调用Regex.Matches就行了,相信大家看代码都能看懂.然后是土豆的[mw_shl_code=csharp,true] public static string[] GetVideoSource_Tudou(BilibiliVideo vd)
{
List *本站禁止HTML标签噢* result = new List *本站禁止HTML标签噢* ();
WebClient wc = new WebClient();
string TudouUrl = string.Format(@"http://www.tudou.com/programs/view/{0}/", vd.vid);
string AskUrl = @"http://www.flvcd.com/parse.php?kw=" + TudouUrl + "&format=super";
byte[] askbyte = wc.DownloadData(AskUrl);
string[] askresults = Encoding.UTF8.GetString(askbyte).Split('\n');
foreach (var s in askresults)
{
if (s.IndexOf(@" *本站禁止HTML标签噢* http") >= 0)
{
var uri = s.Substring(s.IndexOf("http"));
result.Add(uri);
}
}
return result.ToArray();
}[/mw_shl_code]
因为没有现成的正则表达式,我也不会写,所以我们先分析下网页的源文件.会发现所有的下载地址前面是一部分都是” *本站禁止HTML标签噢* http”这样的,我们就用这个搜索每行字符串,就能抽取相应的地址了.||===================================================
最后将获得的下载地址列表保存到BilibiliVideo对象的DownAdressLst属性中.
并更新界面的对应的DataGrid控件dg_DownAdress
[mw_shl_code=csharp,true] this.dg_DownAdress.ItemsSource =((BilibiliVideo)sender2).DownAdressLst.Select(x => new { 下载地址 = x }).ToList();[/mw_shl_code]
这里说下不要直接把String[]绑定到DataGrid的ItemsSource上,那样只会显示字符串的长度
[查看全文]
本帖最后由 UnknowName 于 2012-6-19 12:53 编辑
一个原创类,分享.
原来:
string A = Convert.ToString(100);
现在:
string A = 100.ToString();
原来:
DateTime dt = Convert.ToDateTime("2012-05-15 00:01:00");
现在:
DateTime dt = "2012-05-15 00:01:00".ToDateTime();
.Toint32()
.Tostring()
.ToBoolean()
.ToDbDateTime()
..............
以下为完整类:
[mw_shl_code=csharp,true]
using System;
using System.Drawing;
namespace ClassLibrary.UserClass
{
/// *本站禁止HTML标签噢*
/// *本站禁止HTML标签噢* 实现功能:类型转换器</para>
/// *本站禁止HTML标签噢* 调用方法:实例化后通过实例名调用实例方法,直接通过类名调用静态方法</para>
/// *本站禁止HTML标签噢* .</para>
/// *本站禁止HTML标签噢* 创建人员:Clown</para>
/// *本站禁止HTML标签噢* 创建日期:2011-09-22</para>
/// *本站禁止HTML标签噢* 创建备注:</para>
/// *本站禁止HTML标签噢* .</para>
/// *本站禁止HTML标签噢* 修改人员:</para>
/// *本站禁止HTML标签噢* 修改日期:</para>
/// *本站禁止HTML标签噢* 修改备注:</para>
/// </summary>
public static class ConvertHelper
{
#region 常量
#region 静态常量
/// *本站禁止HTML标签噢*
/// 数据库日期时间类型的默认值
/// </summary>
public static DateTime DefaultDbDateTime = new DateTime(1753, 1, 1);
#endregion
#endregion
#region 属性
#region 静态属性
#endregion
#endregion
#region 构造
#region 静态构造
#endregion
#endregion
#region 方法
#region 静态方法
/// *本站禁止HTML标签噢*
/// 是否为null
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsNull(this Object value)
{
return value == null;
}
/// *本站禁止HTML标签噢*
/// 是否为DBNull.Value
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDBNull(this Object value)
{
return value == DBNull.Value;
}
/// *本站禁止HTML标签噢*
/// 是否为null或String.Empty
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否返回false</returns>
public static bool IsNullOrEmpty(this Object value)
{
if (value != null)
return value.ToString().Length == 0;
return true;
}
/// *本站禁止HTML标签噢*
/// 是否为null或DBNull.Value
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsNullOrDBNull(this Object value)
{
return value == null || value == DBNull.Value;
}
/// *本站禁止HTML标签噢*
/// 是否为默认值.(null或DBNull.Value为任意类型默认值,String类型时null或DBNull.Value或String.Empty均返回true,引用类型默认值为null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDefaultValue(this Object value)
{
if (value.IsNullOrDBNull())
return true;
Type type = value.GetType();
if (type.IsValueType)
{
return value == Activator.CreateInstance(type);
}
else
{
if (type == typeof(string) || type.IsSubclassOf(typeof(string)))
return string.IsNullOrEmpty(Convert.ToString(value));
else
return false;
}
}
/// *本站禁止HTML标签噢*
/// 获取指定类型的默认值.引用类型(包含String)的默认值为null
/// </summary>
/// *本站禁止HTML标签噢* 默认值</returns>
public static T DefaultValue *本站禁止HTML标签噢* ()
{
return default(T);
}
/// *本站禁止HTML标签噢*
/// 获取指定类型的默认值.引用类型(包含String)的默认值为null
/// </summary>
/// <param name="type">类型</param>
/// *本站禁止HTML标签噢* 默认值</returns>
public static Object DefaultValue(this Type type)
{
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
/// *本站禁止HTML标签噢*
/// 转换到指定类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 目标类型的值</returns>
public static T ChangeType *本站禁止HTML标签噢* (this Object value)
{
return value.IsNullOrDBNull() ? default(T) : (T)Convert.ChangeType(value, typeof(T));
}
/// *本站禁止HTML标签噢*
/// 转换到指定类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// <param name="type">目标类型</param>
/// *本站禁止HTML标签噢* 目标类型的值</returns>
public static Object ChangeType(this Object value, Type type)
{
return value.IsNullOrDBNull() ? type.DefaultValue() : Convert.ChangeType(value, type);
}
/// *本站禁止HTML标签噢*
/// 如果value为null或DBNull.Value则返回默认值,否则返回原值.默认值:Object.DefaultValue()
/// </summary>
/// <param name="value">Object对象</param>
/// *本站禁止HTML标签噢* 处理后值</returns>
public static T ToDefaultableValue *本站禁止HTML标签噢* (this Object value)
{
return value.IsNullOrDBNull() ? default(T) : (T)value;
}
/// *本站禁止HTML标签噢*
/// 如果value为null或DBNull.Value则返回默认值,否则返回原值.默认值:Object.DefaultValue()
/// </summary>
/// <param name="value">Object对象</param>
/// <param name="type">Object类型</param>
/// *本站禁止HTML标签噢* 处理后值</returns>
public static Object ToDefaultableValue(this Object value, Type type)
{
return value.IsNullOrDBNull() ? type.DefaultValue() : value;
}
/// *本站禁止HTML标签噢*
/// 转换为枚举类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 枚举值</returns>
public static T ToEnum *本站禁止HTML标签噢* (this Object value)
{
return value.IsNullOrDBNull() ? default(T) : (T)Enum.Parse(typeof(T), Convert.ToString(value));
}
/// *本站禁止HTML标签噢*
/// 转换为枚举类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// <param name="type">具体枚举类型</param>
/// *本站禁止HTML标签噢* 枚举值</returns>
public static Object ToEnum(this Object value, Type type)
{
return value.IsNullOrDBNull() ? type.DefaultValue() : Enum.Parse(type, Convert.ToString(value));
}
/// *本站禁止HTML标签噢*
/// 如果value为DBNull.Value则返回null.否则返回原值
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 处理后值</returns>
public static Object ToNullableValue(this Object value)
{
return value.IsDBNull() ? null : value;
}
/// *本站禁止HTML标签噢*
/// 如果value为null,则返回DBNull.Value.否则返回原值
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 处理后值</returns>
public static Object ToDBNullableValue(this Object value)
{
return value.IsNull() ? DBNull.Value : value;
}
/// *本站禁止HTML标签噢*
/// 转换为可逆转换为颜色的字符串.逆转换请使用Object.ToColor()方法.(null,DbNull.Value时返回null,转换失败抛出异常)
/// </summary>
/// <param name="color">颜色</param>
/// *本站禁止HTML标签噢* 可逆转换为颜色的字符串</returns>
public static String ToStringEx(this Color color)
{
return color.IsNullOrDBNull() ? null : ColorTranslator.ToHtml(color);
}
/// *本站禁止HTML标签噢*
/// 转换为颜色,颜色转字符串请使用Color.ToStringEx()方法.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">可逆转换为颜色的字符串</param>
/// *本站禁止HTML标签噢* 颜色</returns>
public static Color ToColor(this Object value)
{
return value.IsNullOrDBNull() ? default(Color) : ColorTranslator.FromHtml(Convert.ToString(value));
}
/// *本站禁止HTML标签噢*
/// 转换为可逆转换位字体的字符串,逆转换请使用Object.ToFont()方法.(null,DbNull.Value时返回null,转换失败抛出异常)
/// </summary>
/// <param name="font">字体</param>
/// *本站禁止HTML标签噢* 可逆转换为字体的字符串</returns>
public static String ToStringEx(this Font font)
{
return font.IsNullOrDBNull() ? null : new FontConverter().ConvertToInvariantString(font);
}
/// *本站禁止HTML标签噢*
/// 转换为字体,字体转字符串请使用Font.ToStringEx()方法.(null,DbNull.Value时返回null,转换失败抛出异常)
/// </summary>
/// <param name="value">可逆转换为字体的字符串</param>
/// *本站禁止HTML标签噢* 字体</returns>
public static Font ToFont(this Object value)
{
return value.IsNullOrDBNull() ? null : (Font)new FontConverter().ConvertFromInvariantString(Convert.ToString(value));
}
/// *本站禁止HTML标签噢*
/// 是否为布尔类型,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsBoolean(this Object value)
{
try { Boolean.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为布尔类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Boolean ToBoolean(this Object value)
{
return value.IsNullOrDBNull() ? default(Boolean) : Convert.ToBoolean(value);
}
/// *本站禁止HTML标签噢*
/// 转换为布尔类型,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Boolean ToDefaultableBoolean(this Object value)
{
try { return value.ToBoolean(); }
catch { return default(Boolean); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空布尔类型,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Boolean? ToNullableBoolean(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Boolean.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 8 位有符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsSByte(this Object value)
{
try { SByte.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 8 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static SByte ToSByte(this Object value)
{
return value.IsNullOrDBNull() ? default(SByte) : Convert.ToSByte(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 8 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static SByte ToDefaultableSByte(this Object value)
{
try { return value.ToSByte(); }
catch { return default(SByte); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 8 位有符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static SByte? ToNullableSByte(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return SByte.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 16 位有符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsInt16(this Object value)
{
try { Int16.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 16 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int16 ToInt16(this Object value)
{
return value.IsNullOrDBNull() ? default(Int16) : Convert.ToInt16(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 16 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int16 ToDefaultableInt16(this Object value)
{
try { return value.ToInt16(); }
catch { return default(Int16); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 16 位有符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int16? ToNullableInt16(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Int16.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 32 位有符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsInt32(this Object value)
{
try { Int32.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 32 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int32 ToInt32(this Object value)
{
return value.IsNullOrDBNull() ? default(Int32) : Convert.ToInt32(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 32 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int32 ToDefaultableInt32(this Object value)
{
try { return value.ToInt32(); }
catch { return default(Int32); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 32 位有符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int32? ToNullableInt32(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Int32.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 64 位有符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsInt64(this Object value)
{
try { Int64.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 64 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int64 ToInt64(this Object value)
{
return value.IsNullOrDBNull() ? default(Int64) : Convert.ToInt64(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 64 位有符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int64 ToDefaultableInt64(this Object value)
{
try { return value.ToInt64(); }
catch { return default(Int64); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 64 位有符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Int64? ToNullableInt64(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Int64.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 8 位无符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsByte(this Object value)
{
try { Byte.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 8 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Byte ToByte(this Object value)
{
return value.IsNullOrDBNull() ? default(Byte) : Convert.ToByte(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 8 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Byte ToDefaultableByte(this Object value)
{
try { return value.ToByte(); }
catch { return default(Byte); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 8 位无符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Byte? ToNullableByte(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Byte.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 16 位无符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsUInt16(this Object value)
{
try { UInt16.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 16 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt16 ToUInt16(this Object value)
{
return value.IsNullOrDBNull() ? default(UInt16) : Convert.ToUInt16(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 16 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt16 ToDefaultableUInt16(this Object value)
{
try { return value.ToUInt16(); }
catch { return default(UInt16); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 16 位无符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt16? ToNullableUInt16(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return UInt16.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 32 位无符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsUInt32(this Object value)
{
try { UInt32.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 32 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt32 ToUInt32(this Object value)
{
return value.IsNullOrDBNull() ? default(UInt32) : Convert.ToUInt32(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 32 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt32 ToDefaultableUInt32(this Object value)
{
try { return value.ToUInt32(); }
catch { return default(UInt32); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 32 位无符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt32? ToNullableUInt32(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return UInt32.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为 64 位无符号整数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsUInt64(this Object value)
{
try { UInt64.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为 64 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt64 ToUInt64(this Object value)
{
return value.IsNullOrDBNull() ? default(UInt64) : Convert.ToUInt64(value);
}
/// *本站禁止HTML标签噢*
/// 转换为 64 位无符号整数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt64 ToDefaultableUInt64(this Object value)
{
try { return value.ToUInt64(); }
catch { return default(UInt64); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空 64 位无符号整数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static UInt64? ToNullableUInt64(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return UInt64.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为十进制数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDecimal(this Object value)
{
try { Decimal.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为十进制数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Decimal ToDecimal(this Object value)
{
return value.IsNullOrDBNull() ? default(Decimal) : Convert.ToDecimal(value);
}
/// *本站禁止HTML标签噢*
/// 转换为十进制数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Decimal ToDefaultableDecimal(this Object value)
{
try { return value.ToDecimal(); }
catch { return default(Decimal); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空十进制数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Decimal? ToNullableDecimal(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Decimal.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为单精度浮点数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsSingle(this Object value)
{
try { Single.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为单精度浮点数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Single ToSingle(this Object value)
{
return value.IsNullOrDBNull() ? default(Single) : Convert.ToSingle(value);
}
/// *本站禁止HTML标签噢*
/// 转换为单精度浮点数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Single ToDefaultableSingle(this Object value)
{
try { return value.ToSingle(); }
catch { return default(Single); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空单精度浮点数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Single? ToNullableSingle(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Single.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为双精度浮点数,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDouble(this Object value)
{
try { Double.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为双精度浮点数,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Double ToDouble(this Object value)
{
return value.IsNullOrDBNull() ? default(Double) : Convert.ToDouble(value);
}
/// *本站禁止HTML标签噢*
/// 转换为双精度浮点数,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Double ToDefaultableDouble(this Object value)
{
try { return value.ToDouble(); }
catch { return default(Double); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空双精度浮点数,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Double? ToNullableDouble(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Double.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为日期时间类型,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDateTime(this Object value)
{
try { DateTime.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为日期时间类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime ToDateTime(this Object value)
{
return value.IsNullOrDBNull() ? default(DateTime) : Convert.ToDateTime(value);
}
/// *本站禁止HTML标签噢*
/// 转换为日期时间类型,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime ToDefaultableDateTime(this Object value)
{
try { return value.ToDateTime(); }
catch { return default(DateTime); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空日期时间类型,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime? ToNullableDateTime(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return DateTime.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为数据库日期时间类型,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsDbDateTime(this Object value)
{
try { DateTime dateTime = DateTime.Parse(value.ToString()); return dateTime >= DefaultDbDateTime; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为数据库日期时间类型,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime ToDbDateTime(this Object value)
{
if (value.IsNullOrDBNull())
return DefaultDbDateTime;
else
{
DateTime dateTime = Convert.ToDateTime(value);
return dateTime >= DefaultDbDateTime ? dateTime : DefaultDbDateTime;
}
}
/// *本站禁止HTML标签噢*
/// 转换为数据库日期时间类型,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime ToDefaultableDbDateTime(this Object value)
{
try { return value.ToDbDateTime(); }
catch { return DefaultDbDateTime; }
}
/// *本站禁止HTML标签噢*
/// 转换为可空数据库日期时间类型,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static DateTime? ToNullableDbDateTime(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { DateTime dateTime = DateTime.Parse(value.ToString()); return dateTime >= DefaultDbDateTime ? dateTime : DefaultDbDateTime; }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 是否为一个 Unicode 字符,弱转换
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 是返回true,否则返回false</returns>
public static bool IsChar(this Object value)
{
try { Char.Parse(value.ToString()); return true; }
catch { return false; }
}
/// *本站禁止HTML标签噢*
/// 转换为一个 Unicode 字符,强转换.(null,DbNull.Value时返回默认值,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Char ToChar(this Object value)
{
return value.IsNullOrDBNull() ? default(Char) : Convert.ToChar(value);
}
/// *本站禁止HTML标签噢*
/// 转换为一个 Unicode 字符,强转换.(null,DbNull.Value时返回默认值,转换失败返回默认值)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Char ToDefaultableChar(this Object value)
{
try { return value.ToChar(); }
catch { return default(Char); }
}
/// *本站禁止HTML标签噢*
/// 转换为可空一个 Unicode 字符,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static Char? ToNullableChar(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return Char.Parse(value.ToString()); }
catch { return null; }
}
/// *本站禁止HTML标签噢*
/// 转换为一系列 Unicode 字符,强转换.(null,DbNull.Value时返回String.Empty,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static String ToStringEx(this Object value)
{
return value.IsNullOrDBNull() ? String.Empty : Convert.ToString(value);
}
/// *本站禁止HTML标签噢*
/// 转换为一系列 Unicode 字符,强转换.(null,DbNull.Value时返回String.Empty,转换失败抛出异常)
/// </summary>
/// <param name="value">值</param>
/// <param name="format">格式</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static String ToStringEx(this DateTime? value, string format)
{
return value.IsNullOrDBNull() ? String.Empty : value.Value.ToString(format);
}
/// *本站禁止HTML标签噢*
/// 转换为一个 Unicode 字符,强转换.(null,DbNull.Value时返回String.Empty,转换失败返回String.Empty)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static String ToDefaultableString(this Object value)
{
try { return value.ToStringEx(); }
catch { return String.Empty; }
}
/// *本站禁止HTML标签噢*
/// 转换为一系列 Unicode 字符,弱转换.(null,DbNull.Value时返回null,转换失败返回null)
/// </summary>
/// <param name="value">值</param>
/// *本站禁止HTML标签噢* 转换后的值</returns>
public static String ToNullableString(this Object value)
{
if (value.IsNullOrDBNull())
return null;
else
try { return value.ToString(); }
catch { return null; }
}
#endregion
#endregion
}
}
[/mw_shl_code]
[查看全文]
本帖最后由 秋声赋 于 2012-4-18 13:15 编辑
简单易懂的现代魔法:C#编程教程(四)图片与文字上次介绍了控件和事件的概念,并通过使用按钮控件加深了了解.这次我们要学会怎么在程序中显示图片和文字.同样的,一般情况下显示图片和文字都是通过控件完成的.图片是(PictureBox控件),文字是(Label控件)首先介绍PictureBox控件还是新建一个WinForm工程,并在工具栏中找到PictureBox控件,把他拖到窗口上.
这时候PictureBox控件是没有图像的,同样的,我们先来看下PictureBox控件的属性栏.
发现这个Image属性就是指定显示哪个图像.点开后面的…按钮,进入选择图片的界面.
我们选择上面的本地资源,点击导入.然后选择一个图片,点击确定.就能发现现在PictureBox控件里面显示了我们选择的那张图片了.
但是你可能会发现,这张图片显示的并不完全,是因为PictureBox控件默认的显示模式是平铺的,所以图片比控件大的时候就只会显示一部分.我们来修改Picture控件的SizeMode属性成Zoom(应该是对应的设置桌面时候的 适应)
然后就可以发现图片显示正常了,当然我们可以根据实际的需要来调整SizeMode.
可能你会问,一个Galgame不可能从头到尾就一张图片吧?要怎么在不同的时候显示多张图片呢?不可能放很多的PictureBox控件吧这里你就要记住一点,所有在属性栏里面能修改的属性都是可以在程序中修改的.让我们先看一下怎么在代码中为PictureBox控件指定显示的图片.在我们的窗体上在拖出一个按钮(Button)控件,并为他的Click事件添加响应函数.我们这里要用到一个新的类,Bitmap,他封装了一个位图(或者说代表了一个位图.位图是啥?可以理解为图片,详细的自己去百度吧).Bitmap是个很方便的类,在定义的时候我们只要在构造函数里面指定图片的文件路径就可以自动读取图片了.如下所示:
Bitmap 图片1 = new Bitmap(@"D:\动漫杂项\图包(秋之回忆)\秋之回忆1-7全CG\秋之回忆雨后Vol3卒业cg\01-02:上面没有啦!.jpg");
这时候,图片1这个变量就代表了上面文件路径所指定的图片.(这里注意文件路径前面有个@,这表示我们不需要在这个字符串里面用转义字符.什么是转义字符呢?一些用\+字母表示的字符,例如\n就表示换行,\t表示制表符,因为我们这里不需要这些,但是文件路径里面又有\,所以要在前面加个@).然后就是修改PictureBox控件(这里对应的变量是pictureBox1)的Image属性了,直接赋值即可.
[mw_shl_code=csharp,true] pictureBox1.Image = 图片1;[/mw_shl_code]
运行程序,单击下按钮,就会发现图片变成了我们指定的图片.可以看出C#里面显示图片还是很简单的吧?接下来是文字,相对于图片,显示文字就简单多了.首先在窗体中拖入一个Label控件,
这里我们发现Label控件是不能修改大小的,要修改大小就需要修改他显示的文字的字体.
修改成自己喜欢的,然后看到下面这个Text属性,这里就是我们要显示的文字.
修改下.我们就能从窗口看到效果.
同样的,我们也能在代码中改变这些文字.
label1.Text = "真心跪求,104228916@qq.com";
运行,单击按钮后效果如下:
上面就是这次的内容.这次学习了用PictureBox控件和Label控件显示图片和文字.
作业:1. 当鼠标点击PictureBox控件是时候切换图片,一共要有5张,并且是循环播放的,例如第5张显示出来后,再点击就显示第一张.2. 尝试用OpenFileDialog控件做一个简单的图片查看器.
OpenFileDialog op = new OpenFileDialog();
op.ShowDialog();
这之后, op.FileName里面就代表了用户选择的图片的路径.[查看全文]
为了升级偶不要节操了。。。放上以前做的俄罗斯方块一枚#13t
内容极其简单。。。。画面极其简陋。。。。做工极差。。。@125#
附图一枚。。。
算是新手向的东西。。。而且当时制作时脑子不够用。。。。转向做的很麻烦。。
现在一想可以直接事先设定好。。。用一个4*4的数组。。。甚至可以用一个short或者两个char共2字节,16位的2进制来记录方块状态。。。然后利用掩码来进行判定是否能转向及下降
有兴趣的同学可以改改吧。。。
真的只是为了升级。。。。现在还不能下附件。。。。求速。。。
另放上未完成工程图
自制QQ。。。。用多线程的服务器端基本构造完成。。。但是客户端。。。由于为了完善。。还需数据库。。现在苦逼学习数据库中。。。。
附件是俄罗斯方块。。。做的极差。。。捂脸。。。@27#
WindowsFormsApplication1.rar
http://kuai.xunlei.com/d/NWLBJDUWECSC
[查看全文]
本帖最后由 ApfelZaft 于 2012-8-23 01:38 编辑
RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。由于JRMP是专为Java对象制定的,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信,而且在您需要时可扩展Java在这些服务器上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。
总之RMI很好的解决的纯JAVA环境中对象远程调用的问题~下面我们就利用RMI的思想来实现一个最最简单的聊天室功能…其实将服务端配置到一个网站服务器中之后完全可以用作小范围的聊天室~
我们开始吧~
首先,我们来定义一个远程接口。这里说点题外话…本来聊天室什么的没啥必要用RMI去实现…TCP就可以了…这里只是RMI一个比较全面应用的例子。
由于自己程序结构的问题,我们需要定义两个接口。先是定义服务端对象的接口,我们把它保存为IChatServer.java:
[mw_shl_code=java,true]import java.rmi.*;
public interface IChatServer extends Remote {
public void addClient(IChatClient client,String msg) throws RemoteException;
public void removeClient(IChatClient client,String msg) throws RemoteException;
public void sendMessage(IChatClient client,String msg) throws RemoteException;
}[/mw_shl_code]
接下来我们实现这个服务端的远程接口里的方法,我们保存为ChatServerImpl.java:
[mw_shl_code=java,true]import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
public class ChatServerImpl extends UnicastRemoteObject implements IChatServer{
ArrayList list;
public ChatServerImpl() throws RemoteException{
super();
list=new ArrayList();
}
public void addClient(IChatClient client,String msg) throws RemoteException{
if(!list.contains(client)){
for(int i=0;i<list.size();i++){
sendMessage((IChatClient)list.get(i),msg);
}
list.add(client);
}
}
public void removeClient(IChatClient client,String msg) throws RemoteException{
if (list.contains(client)){
for(int i=0;i<list.size();i++){
sendMessage((IChatClient)list.get(i),msg);
}
list.remove(client);
}
}
public void sendMessage(IChatClient client,String msg) throws RemoteException{
if(!list.contains(client))
return;
for(int i=0;i<list.size();i++){
String user=client.getName();
//String message=msg;
if(user==null ||user==""){
user="Anonymous";
}
((IChatClient)list.get(i)).sendMessage(user+": "+msg);
}
}
}[/mw_shl_code]
接下来的任务是写一个注册服务端程序,可以命名为ChatServer.java:
[mw_shl_code=java,true]import java.rmi.*;
import java.rmi.registry.*;
public class ChatServer{
public static void main(String[] args){
try{
ChatServerImpl server=new ChatServerImpl();
Naming.bind("IChatServer",server);
System.out.println("Server Start!!");
}
catch(Exception e){
System.out.println("IChatServer: "+e.getMessage());
e.printStackTrace();
}
}
}[/mw_shl_code]
OK,到此我们服务端就算是完成了,下面进行客户端的编写。
由于我们要用到用户界面,聊天室也需要一个面向所有用户的广播,
我们还需要一个客户端的对象接口,命名为IChatClient.java:
[mw_shl_code=java,true]import java.rmi.*;
public interface IChatClient extends Remote{
public String getName() throws RemoteException;
public void sendMessage(String msg) throws RemoteException;
}[/mw_shl_code]
最后一步就是编写聊天室的客户端,别看代码很长,大部分代码都是用来编写聊天室的界面了=。=
其实在聊天室实际运用中,界面设计一般都是交由其它软件完成的,我们只需要把核心的方法调用掌握一般就可以了。
下面是客户端的实现代码 SwingChatClient.java:
[mw_shl_code=java,true]import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.*;
public class SwingChatClient extends UnicastRemoteObject implements IChatClient,ActionListener{
IChatServer server=null;
boolean connected=false;
String title="ChatClient";
JFrame f;
String username="";
JTextArea area;
JTextField inName;
JButton connect;
JButton disconnect;
JButton send;
JTextField contentIn;
public SwingChatClient() throws RemoteException{
super();
//System.setSecurityManager(new RMISecurityManager());
}
public void init(){
//setLayout(new BorderLayout());
f=new JFrame(title);
f.setBounds(250,250,500,500);
f.setVisible(true);
JPanel pNorth,pSouth,pText;
pNorth=new JPanel();
pSouth=new JPanel();
pText=new JPanel();
inName=new JTextField(6);
contentIn=new JTextField(22);
area=new JTextArea(15,35);
connect=new JButton("connet");
disconnect=new JButton("Disconnect");
send=new JButton("send");
/////////////////////////////
pNorth.add(new JLabel("Enter your Name: "));
pNorth.add(inName);
pNorth.add(connect);
pNorth.add(disconnect);
pSouth.add(new JLabel("Enter Message: "));
pSouth.add(contentIn);
pSouth.add(send);
pText.add(new JScrollPane(area));
connect.addActionListener(this);
disconnect.addActionListener(this);
send.addActionListener(this);
contentIn.addActionListener(this);
f.add(pNorth,BorderLayout.NORTH);
f.add(pSouth,BorderLayout.SOUTH);
f.add(pText,BorderLayout.CENTER);
f.validate();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
/*try{
UnicastRemoteObject.export(this);
}
catch(Exception e){
}*/
}
public static void main(String args[])throws RemoteException{
SwingChatClient client=new SwingChatClient();
client.init();
}
public void connect(){
try{
server=(IChatServer)Naming.lookup("rmi://localhost/IChatServer");
//此处localhost可改为服务端所在主机IP
System.out.println("Client Start!");
connected=true;
setStatus();
username=inName.getText().trim();
server.addClient(this,username+" Entered!");
}
catch(Exception e){
area.append("Connection fault!");
connected=false;
setStatus();
server=null;
System.out.println(e);
}
}
public void disconnect(){
try{
if(server==null)
return;
server.removeClient(this,username+" Has Quited!");
server=null;
}
catch(Exception e){
area.append("Connection Error!"+"/n");
int length = area.getText().length();
area.setCaretPosition(length);
}
finally{
connected=false;
setStatus();
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==connect){
connect();
}
else if(e.getSource()==disconnect){
disconnect();
}
else if(e.getSource()==contentIn){
if(server==null)
return;
try{
server.sendMessage(this,contentIn.getText());
contentIn.setText("");
}
catch(Exception ee){
area.append("Connection Error!"+"\n");
int length = area.getText().length();
area.setCaretPosition(length);
}
}
else{
if (server==null)
return;
try{
server.sendMessage(this,contentIn.getText());
contentIn.setText("");
}
catch(Exception ex){
area.append("Connection Error!"+"\n");
int length = area.getText().length();
area.setCaretPosition(length);
}
}
}
public void setStatus(){
if(connected)
f.setTitle(title+"connected");
else
f.setTitle(title+"disconnected");
}
public String getName() throws RemoteException{
return username;
}
public void sendMessage(String msg) throws RemoteException{
area.append(msg+"\n");
int length = area.getText().length();
area.setCaretPosition(length);
}
}[/mw_shl_code]
看着挺恶心吧~这里面包含了客户端对于远程对象的调用,还有接口方法的实现和我们的SWING界面。
之后我们编译运行就大功告成了!
首先用javac命令编译刚才所有的 .java文件;
(这里建议大家编号程序之后的编译运行调试命令最好都写成一个个batch文件,对于之后debug比较方便…根据个人喜好不同,方法也不同=。=)
之后用rmic生成stub和skeleton文件;这步才是RMI的核心啊!~
rmic ChatServerImpl SwingChatClient
成功执行之后会发现有一些ChatServerImpl_Stub.class 类似这样有stub字样的class文件,如果服务端程序与客户端程序在同一台机器上并在同一目录中,则可以省略掉接口实现类生成的桩和框架文件,但这就失去了使用RMI的意义,而如果要在不同的JVM上运行时,客户端程序就必须得依靠服务端运程方法实现的桩和框架文件以及接口类。
接下来运行注册程序RMIRegistry,必须在包含刚写的类的目录下运行这个注册程序。
命令是start rmiregistry 同样推荐用bat文件执行比较方便。注册程序开始运行了,
不要关闭那个窗口哟,不然注册程序就被关闭了。
之后我们运行服务端!!
java -Djava.rmi.server.codebase=file:/你文件的绝对路径,注意用“/”(中间空格) ChatServer
Pause
最后我们运行编译好的服务端!
java -Djava.rmi.codebase=file:/你文件的绝对路径,注意用“/”(中间空格) SwingChatClient
Pause
到此,要是你的人品没什么问题应该已经看到这类似这样的情境:
要是throw了exception~不要紧~慢慢debug就好~~
做一个project的时候,刚编译好一个程序一遍运行通过可是很不容易的~
小东西自己做着玩玩还是很有趣的。
RMI配合好的服务器的话完全可以提供很多远程服务和不错的方法调用,非常灵活。
[查看全文]
[mw_shl_code=bash,true]cd
ls
cat
cp
cut
date
df
echo
gzip
tar
mkdir
more
……待续[/mw_shl_code]
[查看全文]

本帖最后由 秋声赋 于 2013-1-21 00:27 编辑
简单易懂的现代魔法:C#编程教程 系列汇总
简单易懂的现代魔法 : C#编程教程(一) C#与.Net与VS
简单易懂的现代魔法:C#编程教程(六) Bilibili小工具①
简单易懂的现代魔法:C#编程教程(七) Bilibili小工具② 下载地址的解析
简单易懂的现代魔法:C#编程教程(八) Bilibili小工具③ 弹幕文件的获取和解析
修复了链接
========下方高能===========
========================
[查看全文]









