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 通信的全部过程和注意点就那么多了。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值