欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP 和 Servlet 通过Socket通信

程序员文章站 2022-04-08 13:01:37
  本实验为了实现php 和servlet 进行通信,费了不少周折。。。。。。。。而且网上现成的资料都不完整,怀着激动的心情将本实验遇到的错误和解决方法和大...

 

本实验为了实现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的专栏