发表时间:2014-09-05来源:网络
本实验为了实现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加载慢的一个办法
下一篇:php乱码原因分析
CI框架连接数据库配置操作以及多数据库操作
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
C语言关键字及其解释介绍 C语言32个关键字详解
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
PHP中的(++i)前缀自增 和 (i++)后缀自增
将视频设置为Android手机开机动画的教程
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
常用dos命令及语法
PHP中include和require区别之我见
优居优住房产中介app官方版(优居找房)下载v4.3.2 安卓最新版
107.07MB |生活服务
纷享销客app官方版(更名纷享销客CRM)下载v9.7.6 安卓最新版
172.08MB |商务办公
虹蚁智控最新版下载v1.5.2 安卓版
57.93MB |生活服务
中鸽网赛事直播平台下载v2.5.09 安卓版
57.66MB |系统工具
四川政务服务一体化平台手机版(更名为天府通办)下载v5.1.2 安卓最新版
154.15MB |生活服务
钢之梦最新版本下载v5.8.5 安卓官方版
27.92MB |生活服务
合气网app下载v3.3.20 安卓版
36.64MB |商务办公
雷克萨斯elexusclub下载v3.96 安卓版
163.87MB |系统工具
2014-09-05
2022-03-20
2022-03-21
2022-03-24
2014-09-05
2014-09-05
2015-07-05
2014-09-05
2022-03-21
2014-09-05