网上经常有关于Socket的问题~教程~可是都非常官方,其实代码我们都知道(F1帮助文档里就有),只是由于没有可测试用的Socket服务器..一直不能做测试跟进一步的研究。
今天打开已经很久没用的《易语言》,了一个简单的socket服务器..其实我不知道算不算是socket服务器,只是监听端口,接收来自客户端的数据,发送数据到客户端等等。不过在flash的socket例程下连接并发送接收成功,所以应该也算是吧..(ps:易语言,一个中文的编程软件,别笑我,hehe,我不是理科出身的,没什么文化,不过我觉得这个软件对于像我这种只是需要辅助学习flash的前提前下,已经足够了,在这里也当作给易语言做个广告,怎么说也是国人开发的东西)
这个小东东很简单,启动的时候自动监听8080端口,当flash连接上的时候就会显示客户端的ip,当flash发送数据到服务器的时候,就会把接收到的数据广播给所有的客户端(可以做简单的聊天室)
这边随便上传一个Flash的实例..只由Flash的例程修改来的..运行以后会直接连接本机的8080端口,连接成功后给服务器发送一条文本..然后服务器会返回该文本..在"输出"窗口可以看到。
<?php
/*
* 长文章分页类
* @package cutpage
* @author yytcpt(无影)
* @version 2008-03-27
* @copyrigth http://www.d5s.cn/
*/
class cutpage{
var $pagestr; //被切分的内容
var $pagearr; //被切分文字的数组格式
var $sum_word; //总字数(UTF-8格式的中文字符也包括)
var $sum_page; //总页数
var $page_word; //一页多少字
var $cut_tag; //自动分页符
var $cut_custom; //手动分页符
var $ipage; //当前切分的页数,第几页
var $url;
function __construct(){
$this->page_word = 1000;
$this->cut_tag = array("</table>", "</div>", "</p>", "<br/>", "”。", "。", ".", "!", "……", "?", ",");
$this->cut_custom = "{nextpage}";
$tmp_page = intval(trim($_GET["ipage"]));
$this->ipage = $tmp_page>1?$tmp_page:1;
}
//统计总字数
function get_page_word(){
$this->sum_word = $this->strlen_utf8($this->pagestr);
return $this->sum_word;
}
/* 统计UTF-8编码的字符长度
* 一个中文,一个英文都为一个字
*/
function strlen_utf8($str){
$i = 0;
$count = 0;
$len = strlen ($str);
while ($i < $len){
$chr = ord ($str[$i]);
$count++;
$i++;
if ($i >= $len)
break;
if ($chr & 0x80){
$chr <<= 1;
while ($chr & 0x80) {
$i++;
$chr <<= 1;
}
}
}
return $count;
}
//设置自动分页符号
function set_cut_tag($tag_arr=array()){
$this->cut_tag = $tag_arr;
}
//设置手动分页符
function set_cut_custom($cut_str){
$this->cut_custom = $cut_str;
}
function show_cpage($ipage=0){
$this->cut_str();
$ipage = $ipage ? $ipage:$this->ipage;
return $this->pagearr[$ipage];
}
function cut_str(){
$str_len_word = strlen($this->pagestr); //获取使用strlen得到的字符总数
$i = 0;
if ($str_len_word<=$this->page_word){ //如果总字数小于一页显示字数
$page_arr[$i] = $this->pagestr;
}else{
if (strpos($this->pagestr, $this->cut_custom)){
$page_arr = explode($this->cut_custom, $this->pagestr);
}else{
$str_first = substr($this->pagestr, 0, $this->page_word); //0-page_word个文字 cutStr为func.global中的函数
foreach ($this->cut_tag as $v){
$cut_start = strrpos($str_first, $v); //逆向查找第一个分页符的位置
if ($cut_start){
$page_arr[$i++] = substr($this->pagestr, 0, $cut_start).$v;
$cut_start = $cut_start + strlen($v);
break;
}
}
if (($cut_start+$this->page_word)>=$str_len_word){ //如果超过总字数
$page_arr[$i++] = substr($this->pagestr, $cut_start, $this->page_word);
}else{
while (($cut_start+$this->page_word)<$str_len_word){
foreach ($this->cut_tag as $v){
$str_tmp = substr($this->pagestr, $cut_start, $this->page_word); //取第cut_start个字后的page_word个字符
$cut_tmp = strrpos($str_tmp, $v); //找出从第cut_start个字之后,page_word个字之间,逆向查找第一个分页符的位置
if ($cut_tmp){
$page_arr[$i++] = substr($str_tmp, 0, $cut_tmp).$v;
$cut_start = $cut_start + $cut_tmp + strlen($v);
break;
}
}
}
if (($cut_start+$this->page_word)>$str_len_word){
$page_arr[$i++] = substr($this->pagestr, $cut_start, $this->page_word);
}
}
}
}
$this->sum_page = count($page_arr); //总页数
$this->pagearr = $page_arr;
}
//显示上一条,下一条
function show_prv_next(){
$this->set_url();
if ($this->sum_page>1 and $this->ipage<$this->sum_page){
$str = "<a href='".$this->url.($this->ipage+1)."'>下一页</a> ";
}
if ($this->sum_page>1 and $this->ipage>1){
$str.= "<a href='".$this->url.($this->ipage-1)."'>上一页</a>";
}
return $str;
}
function show_page_select(){
if ($this->sum_page>1){
$str = " <select onchange=\"location.href=this.options[this.selectedIndex].value\">";
for ($i=1; $i<=$this->sum_page; $i++){
$str.= "<option value='".$this->url.$i."' ".(($this->ipage)==$i ? " selected='selected'":"").">第".$i."页</option>";
}
$str.= "</select>";
}
return $str;
}
function show_page_select_wap(){
if ($this->sum_page>1){
$str = "<select ivalue='".($this->ipage-1)."'>";
for ($i=1; $i<=$this->sum_page; $i++){
$str.= "<option onpick='".$this->url.$i."'>第".$i."节</option>";
}
$str.= "</select>";
}
return $str;
}
function set_url(){
parse_str($_SERVER["QUERY_STRING"], $arr_url);
unset($arr_url["ipage"]);
if (empty($arr_url)){
$str = "ipage=";
}else{
$str = http_build_query($arr_url)."&ipage=";
}
$this->url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$str;
}
}
?>
如果您加了新功能,或者是有改进,请与大家一起分享。
长文章分页类,可以手工指定分页符,也可以让程序自动分页。
实例代码:请以UTF-8的文件编码进行测试。
代码:
<?php
include('cutpage.php');
header("content-type:text/html;charset=utf-8");//设置页面编码
//自定义的长文章字符串,可以包含 html 代码,若字符串中有手动分页符 {nextpage} 则优先按手动分页符进行分页
$content = file_get_contents('text.txt');
$ipage = $_GET["ipage"]? intval($_GET["ipage"]):1;
$CP = new cutpage();
$CP->pagestr = $content;
$CP->cut_str();
echo $CP->pagearr[$ipage-1]."<hr/>";
echo $CP->show_prv_next();
?>
很多seoer都说把文件做成静态这样对搜索引擎是最好的了,但是像我们这些买别人的虚拟空间,是有限的但是又想以静态形式,如果生成真正的静态如果你的网站有1000000篇文件生成静态就要占很大的空间,这样的话增加了我们的费用,所以就出现了伪静态这个名词,伪静态有很多种做法,下面我们来一一讲解一下吧.
第一种就是以aa.php/aaaa_1_.htm这种形式,这种做法的好处就是在我们没有足够的权限时做的,下面看看代码.
$html_id=isset($_SERVER['PATH_INFO'])?$_SERVER['PATH_INFO']:'';//取得地参数
$url =@explode('_',$html_id);//进行处理
$id =@$url[1];//得到我们所要的数据
例:http://www.111cn.net/show.php/id_3_cn.html
使用上面的方法后$url[1]的值就为3,不过说一个得到值后最好判断处理一下啦,
第二种方法:Apache 伪静态
一 打开 Apache 的配置文件 httpd.conf 。
二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉
三 在 httpd.conf中添加:
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+\.html
RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+)\.html$ $1.php?__is_apache_rewrite=1&__rewrite_arg=$2
</IfModule>
四 要实现asp帖子URL到php帖子的映射,在 第三步的<IfModule mod_rewrite.c>和</IfModule>之间添加:
RewriteMap tolowercase int:tolower
RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)\=\d+ [NC]
RewriteRule ^(.*(?:index|dispbbs))\.asp$ $1.php?${tolowercase:%{QUERY_STRING}}&__is_apache_rewrite=1
五 保存httpd.conf并重启Apache。
关键字:asp 伪静态 什么是伪静态 iis 伪静态 asp.net 伪静态 php 伪静态 discuz 伪静态 apache 伪静态 phpwind 伪静态 伪静态规则 虚拟主机 伪静态
哈哈,很开心,做了好些时候的留言本总算可以发表了...
阿,希望能大家喜欢,不喜欢也不要紧,但是,一定有不喜欢的理由,,烦请一定告知!!!
谢谢!!!
本留言本从一开始的目标就是""挑战最棒的留言本""!!!我想"没有做不到的,只是看有没有必要"!!!
假如你的建议很好,我一定做到你的要求为止,我的目标:"做一个很棒的程序员".
此留言本的优点和缺点:
-------------------------------------------------------------------
这可能是最重要的了.哈哈!!!
优点:
该留言本最大的优点是,换行.实现了用户换行,(保持原形,中国人的同学录的换行是安一定字数的,也就是说不管你的换行,统统都他给你换行.这样要是想贴文本图形的话,就存在问题了.)而现在大部分的留言本都没有实现自动换行,也就是说它不管你一句写多少个字符,它都会在一行显示,这样要是有一个留言没换行的话,留言本就会变的很难看,窗口下面的行条就会好长,,破坏了叶面的美观!!!.
到今天为止,我还没发现能同时解决这两个问题的留言,这也是我写这留言本的原因所在.
包括oso的论坛,也是不换行的,不信你去留言试试,写一条很长的不回车的字符,这样它的叶面马上就出现问题了.(我和oso提过这问题,不知道改了没有!)
我写了个computer_message($msg);的函数解决了这问题,可以看config.php文件中的源玛.
还有分页:通过两种方式来察看,一是:往前,往后显示留言,另一种是:安页数显示.
还有现在版主可以方便的通过下面的连接来删除和恢复,当然要输入密码.
缺点:
当然有了,要实事求是,就是页面的美化工作做的还不是很够,虽然觉的很必要,但由于时间的关系总觉的这是外面的东西,可以先拖一下,当然只要有一点HTML知识的都可以很方便的修改.
还有就是未知的BUG了!哈哈!!!
下载点,和样本在http://little.oso.com.cn中可以找到!!!
因为说明档是在linux下写的,所以要用写字板打开readme.txt
不要用记事本,要不然会乱码!!!
下面是配置说明:
--------------------------------------------------------------------
为了配置的方便,重新整理了代码,现在已经把全部的需要设置的参数都放在
config.php文件里了,配置起来应该很简单,里面有详悉的说明.
目标:在十分种内搞定你的留言本!!!
1: 建立一个数据库(要主页提供数据库空间)
一般象oso的有phpMyAdmin开放源玛的前端.创建以来很简单的.
取好名字后,记得把config.php 的$db_name改成这个名字
2: 建立留言表(等下把config.php的$table_name改成这里你起的名字).
结构为:
key_liuyan int(11) auto_increment primary key, //主建,自动增加
nikename varchar(20) null // 昵称
subject varchar(100) null // 留言主题
date_created varchar(19) // 留言时间
ip_address varchar(15) // 留言人的IP地址
message mediumtext null // 留言信息
email_address varchar(50) null // 留言人的e-mail地址
zhuye_address varchar(50) null // 留言人的主页地址
huifu_biaozi int(1) default 0 // 版主回复标志
huifu mediumtext null // 版主回复内容
oicq varchar(20) null // 留言人的OICQ号码
可以用如下的SQL来完成!!!(本人测试通过,记得把yourtable_name改成好记点的,
当然不改也行阿)
create table your_liuyan_table(
key_liuyan int(11) auto_increment primary key,
nikename varchar(20) null,
subject varchar(100) null,
date_created varchar(19) ,
ip_address varchar(15),
message mediumtext null,
email_address varchar(50) null,
zhuye_address varchar(50) null,
huifu_biaozi int(1) default 0 ,
huifu mediumtext null,
oicq varchar(20) null
)
3: 建立控制表:(同样要把这里起的名字放到config.php的$table_name_control里去)
结构如下:
leibie varchar(20) primary key,
value varchar(20) null
也可以用下面的SQL语句:
create table your_control_table(
leibie varchar(20) primary key,
value varchar(20) null
)
因为这是你的控制表,所以要自己加入控制记录两条;
SQL语句为:
插入删除密码:
insert into your_control_tble(
leibie,
value)
values
(delete,'1332');
插入回复密码:
insert into your_control_tble(
leibie,
value)
values
(huifu,'1332');
这样放进去的密码为:123,用户名为空!
怎么计算密码和插入的值的关系呢?
是这样的,你的密码 ,如123 把三位数上的各位加起来,等于6,然后把6乘以222就是密码值!!!
6*222=1332.
知道了这关系,当然你可以改成其它的密码了.
不过用户名要为空,,,
这实行的简单加密的原理可以参照主页 http://cxg168.126.com 的三位数.
4: 一切完成,然后只要把除了readme.txt外的文件上传就行了.
5. 其他杂项
5.1 生成图像
PHP可以操作处理图像。假如你已经安装了GD库,你甚至可以利用PHP生成图像。
<?
Header("Content-type: image/gif");
$string=implode($argv," ");
$im = imagecreatefromgif("images/button1.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImageGif($im);
ImageDestroy($im);
?>
(译者注:以上代码段缺少注释,请读者参考PHP Manual的图像处理函数部分)
这段代码在其他页面中通过以下标记<img" width=100% src="button.php3?text">调用,然后以上的那段button.php3代码取得text值并在另外取得的图像文件中加上该值--在以上的代码中该图像文件是images/button1.gif--最后输出到浏览器。假如你想在表单域中使用图像按钮,但是又不希望在每次按钮上的文字改变后不得不重新生成新的图像,就可以利用这样简单的方法动态生成图像文件。
5.2 Cookies
PHP支持基于HTTP的cookies。在需要时你可以像使用一般变量一样方便的使用cookie。Cookies是浏览器保存于客户端的一些信息片段,由此你可以知道是否一台特定PC上的任何人都访问过你的站点,浏览者者在你的站点上的踪迹等等。使用cookies的典型例子就是对浏览者偏好的甄别。Cookies由函数setcookie()设定。与输出HTTP标头的函数header()一样,setcookie()必须在任何实际内容杯输出到浏览器之前调用。以下是一个简单例子:
<?
if (empty($VisitedBefore))
{
// 假如没有设定cookie,为cookie赋上当前时间值
// 函数中的最后一个参数声明了该cookie保存的时间
// 在这个例子中是1年
// time()函数返回自1970年1月1日以来的以秒数计的时间
SetCookie("VisitedBefore",time(), time() (60*60*24*365));
}
else
{
// 欢迎浏览者再次光临
echo "Hello there, welcome back<BR>";
// 读取cookie并判定
if ( (time() - $VisitedBefore) >= "(60*60*24*7)" )
echo "Why did you take a week to come back. You should be here more often!? ";
}
?>
5.3 基于HTTP验证
基于HTTP验证当PHP以CGI模式运行时不能实现。我们可以使用函数header()发送HTTP标头强制验证,客户端浏览器则弹出供输入用户名和密码的对话框。这两个变量被储存在$PHP_AUTH_USER和$PHP_AUTH_PW中,你可以使用这两个变量验证合法并答应进入。以下的例子通过用户名称/密码对为tnc/nature的验证一名用户的登录:
<?
if(!isset($PHP_AUTH_USER))
{
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button ";
exit;
}
else
{
if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") )
{
// 假如是错误的用户名称/密码对,强制再验证
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.";
exit;
}
else
{
echo "Welcome tnc!";
}
?>
事实上再实际引用中不大可能如上面使用代码段明显的用户名称/密码对,而是利用数据库或者加密的密码文件存取它们。
5.4 文件上传
你可以利用PHP实现文件的功能,注重客户端的浏览器应该是Netscape3以上或者IE3以上。以下就是该功能的简单演示:
( upload.html ):
<HTML>
<HEAD>
<TITLE>Upload Your File</TITLE>
</HEAD>
<BODY>
<FORM ACTION="receiver.php3"
ENCTYPE="multipart/form-data" METHOD=POST>
<INPUT TYPE="HIDDEN"
NAME="MAX_FILE_SIZE" VALUE="2000000">
<INPUT TYPE="FILE"
NAME="uploadfile" SIZE="24" MAXLENGTH="80">
<BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Upload File!"
NAME="sendit">
<INPUT TYPE="SUBMIT" VALUE="Cancel"
NAME="cancelit"><BR>
</FORM>
<I><FONT SIZE="2">(You may notice a slight
delay while we upload your file.)</FONT></I>
</BODY>
</HTML>
下面是处理上传的文件:
( receiver.php3 ):
<?
function do_upload ()
{
global $uploadfile, $uploadfile_size;
global $local_file, $error_msg;
if ( $uploadfile == "none" )
{
$error_msg = "You did not specify a file for uploading.";
return;
}
if ( $uploadfile_size > 2000000 )
{
$error_msg = "Sorry, your file is too large.";
return;
}
$the_time = time ();
// 你需要对以下目录有写权限
$upload_dir = "/local/uploads";
$local_file = "$upload_dir/$the_time";
if ( file_exists ( '$local_file' ) )
{
$seq = 1;
while ( file_exists ( "$upload_dir/$the_time$seq" ) ) { $seq ; }
$local_file = "$upload_dir/$the_time$seq";
};
rename ( $uploadfile, $local_file );
display_page ();
}
function display_page ()
{
// 这里是你的页面内容
}
<HTML>
<HEAD>
<TITLE>php3 Receiving Script</TITLE>
</HEAD>
<BODY>
<?
if ( $error_msg ) { echo "<B>$error_msg</B><BR><BR>"; }
if ( $sendit )
{
do_upload ();
}
elseif ( $cancelit )
{
header ( "Location: $some_other_script" );
exit;
}
else
{
some_other_func ();
}
?>
</BODY>
</HTML>
5.5 常用函数
我们简单来看看一些常用的函数。
数组
array - 生成数组
count - 数组元素个数
sort - 数组排序,另有其他几种排序函数可供使用