月度归档:2012年04月

php与java通过socket通信demo

PHP通过socket与java进行通信与基本的sockent编程没什么区别,一个读,一个写,只是方便起见,用java写,PHP读。
demo实现的简单功能是,接受PHP端写入的字符串,然后原样返回给输出端。代码如下:

import java.io.*;
import java.net.*;

public class Server {
public static void main(String[] args) throws IOException{
  System.out.println("Server started !\n");
  ServerSocket server=new ServerSocket(5678);
  while (true){
                Socket client=server.accept();
                System.out.println("client coming!\n");
                PrintWriter printer = new PrintWriter(client.getOutputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String  m = reader.readLine();
                System.out.println("get infomation " + m + "\n from " + client.getInetAddress().toString());
                printer.println(m);
                printer.flush();
                printer.close();
                printer.close();
                client.close();
                System.out.println("client leaving!\n");
              }
        }
} 

运行起来,以后该java程序将监听5678端口,当接收到消息以后,将接收的消息原样返回给客户端……
PHP的代码如下:

<?php
	$socket = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP ) or die ( 'could not create socket' );
	$connect = socket_connect ( $socket, '127.0.0.1', 5678 );
	//向服务端发送数据
	socket_write ( $socket, 'Hello' . "\n" );
	//接受服务端返回数据
	$str = socket_read ( $socket, 1024, PHP_NORMAL_READ );
	
	echo $str;
	//关闭
	socket_close($socket);

PHP程序连接本机的5678端口,写入 Hello,然后读取返回的数据……将返回的数据,输出到浏览器……
先运行起java的服务端,然后用浏览器访问PHP页面,将看到从服务器端返回的Hello

tntnet C++ web pages

用C++写web应用程序,用到tntnet
安装tntnet:sudo apt-get install tntnet。
安装开发包:sudo apt-get install libtntnet-dev。

hello world:
然后运行tntnet-config –project=myfirstproject
产生一个文件夹,一个源代码文件,myfirstproject.ecpp,一个配置文件conf,一个属性文件,一个makefile。
进入目录,然后执行make。

然后运行tntnet -c tntnet.conf
通过url http://localhost:8000/myfirstproject 访问。

看到黑色的字体:
myfirstproject

更深的学习参考官网教程:http://www.tntnet.org/docs.html

codeigniter视图中调用控制器中的方法

学过asp.net的同学,一定会对在页面中直接调用this的方法有点儿情有独钟……
但是由那个迁移到CI框架发现在试图里的$this找不到对象了……今天解决这个问题。
首先分析CI的视图渲染原理,
每个控制器都有一个loader对象,名为load,调用loader的view方法,来渲染视图文件,同时向视图文件中传递变量……
我们找不到的变量$this应该也是这个时候被传进去,这样的话解决思路也就有了吧!
因为CI是支持重写核心类的,我们就重新loader的view方法,将当前的控制器传进去。
但是,查看一下loader对象的代码发现其中根本没有当前的控制器对象,恼人……
这样我们就得在初始化load对象的时候给他一个字段了,也就是代表当前的控制器吧!
我是把他放到控制器的构造函数中了,那个时候loader对象已经被初始化了,只要把当前的控制器对象传进去就好,
大概是这样的代码:
$this->load->controller = $this;
当时每个都这么写,感觉有点儿不爽吧!改动一下,写一个父控制器,构造函数中传递当前控制器,由子类传递吧!

class MY_Controller extends CI_Controller {
    public function __construct($controller) {
        $this->load->controller = $controller;
    }

}

这样每一个控制器的代码应该是这样的:

   class Sample extends MY_Controller {
       public function __construct(){
            parent::__construct($this);
       }
  }

重写的loader部分方法是这样的:

   class MY_Loader extends CI_Loader {
          public function view($view, $vars = array(), $return = FALSE) {
                        $view = $this->controllerName . '/' . $view;
                        $vars["cself"] = $this->controller;
                        return parent::view($view, $vars , $return);
         }
   }

这样在视图中就多了$cself对象,为了和self区分,所以用了这个名字……
在视图中$cself这个东西就代表了当前的控制器。