PHP 和 Servlet 通过Socket通信
本实验为了实现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 = 'veverrr';
$password = 'swjtu';
$write_str = '';
if ($username == null || $password == null){
// 跳转回登录
}
$socket_host ='localhost';
$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的专栏
上一篇: PHP简单的MVC框架实现方法
下一篇: 微博处罚6198个违规涨粉账号