首页 > 程序开发 > Web开发 > php >

PHP 和 Servlet 通过Socket通信

2011-12-20

本实验为了实现PHP 和Servlet 进行通信,费了不少周折。。。。。。。。而且网上现成的资料都不完整,怀着激动的心情将本实验遇到的错误和解决方法和大家分享:PHP 作为Client端,Servlet 作为Server 端在Se...

本实验为了实现PHP 和Servlet 进行通信,费了不少周折。。。。。。。。而且网上现成的资料都不完整,怀着激动的心情将本实验遇到的错误和解决方法和大家分享:

PHP 作为Client端,Servlet 作为Server 端

在Server端,一般的做法是:

1. 写一个Servlet 类,并将该Servlet 设置为服务器启动时就加载的类。

<servlet>

<servlet-name>login</servlet-name>

<servlet-class>Servlet.LoginServlet</servlet-class>

<load-on-startup>0</load-on-startup>

</servlet>

2. 如果单独在该Servelt的init() 方法中编写Server端代码,并进行监听

while(true){

socket = server.accept();

}

则会造成Tomcat 启动超时。

正确的做法应该是单独写一个 监听处理线程类SocketServer ,然后再init() 中,用多线程的方式来启动该线程:

public void init(ServletConfig config){

new Thread(){

public void run(){

try{

ServerSocket server =new ServerSocket(4700);

Socket socket = null;

while(true){

socket=server.accept();

SocketServer sServer=new SocketServer(socket);

sServer.start();

}

}catch(IOException e){

System.out.println(e.getMessage());}

}

}.start();

}

public class SocketServer extends Thread{

private Socket socket;

public SocketServer(Socket socket){

this.socket = socket;

}

public void run(){

String output = "";

try {

BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter os=new PrintWriter(socket.getOutputStream());

String line = null;

line = is.readLine();

System.out.println(line);

output = "server send";

os.println(output);

os.flush();

is.close();

os.close();

socket.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

曾经一度在Client端,接收不到Server端发送过去的数据,认真检查了下代码,发现没有os.flush();

通过在init() 方法中,起一个新的线程,然后通过这个新的线程对每一个请求启动一个新线程来响应来自Client 端的Socket请求

在Client端,采用PHP编写,

Client端先发送数据给Server端,然后接收Server端的返回数据,进行显示

$userName = &#39;veverrr&#39;;

$password = &#39;SWJTU&#39;;

$write_str = &#39;&#39;;

if ($userName == null || $password == null){

// 跳转回登录系统

}

$socket_host =&#39;localhost&#39;;

$socket_port = 4700;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$connection = socket_connect($socket, $socket_host,$socket_port);

$write_str .= $userName.$password.chr(13) . chr(10);

if (!socket_write($socket, $write_str,strlen($write_str))){

echo "connect write";

}

$return_str = socket_read($socket, 1024);

echo $return_str;

socket_close($socket);

Server在使用is.readline() 时,就直接卡住了,后来在外文网站上找到了方法,一试验就通过了。

主要是在Client端发送的数据后面加上 chr(13).chr(10) 表示先回车再换行,将其转换成java能够识别的格式。

PHP 和Servlet 通信的全部过程和注意点就那么多了。

摘自 veverrr的专栏

相关文章
最新文章
热点推荐