php使用servlet,PHP 和 Servlet 通过Socket通信_PHP教程

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

PHP 作为Client端,Servlet 作为Server 端

在Server端,一般的做法是:

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

login

Servlet.LoginServlet

0

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的专栏

http://www.bkjia.com/PHPjc/478482.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478482.htmlTechArticle本实验为了实现PHP 和Servlet 进行通信,费了不少周折。。。。。。。。而且网上现成的资料都不完整,怀着激动的心情将本实验遇到的错误...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值