This experiment took a lot of trouble to achieve communication between PHP and Servlet. . . . . . . . Moreover, the ready-made information on the Internet is not complete. I am excited to share with you the errors and solutions encountered in this experiment:
PHP serves as the client and Servlet serves as the server
On the server side, the general approach is:
1. Write a Servlet class and set the Servlet as a class that is loaded when the server starts.
2. If you write server-side code separately in the init() method of the Servelt and monitor it
while(true){
socket = server.accept();
}
This will cause Tomcat startup timeout.
The correct approach should be to write a separate monitoring and processing thread class SocketServer, and then use multi-threading to start the thread in 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();
}
}
}
Once on the client side, I could not receive the data sent by the server side. I carefully checked the code and found that there was no os.flush();
By starting a new thread in the init() method, and then starting a new thread for each request through this new thread to respond to the Socket request from the Client
On the client side, written in PHP,
The client first sends data to the server, then receives the return data from the server and displays it
$userName = 'veverrr';
$password = 'SWJTU';
$write_str = '';
if ($userName == null || $password == null){
// Jump back to login system
}
$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);
The server got stuck when using is.readline(). Later, I found a method on a foreign website and passed the test.
The main purpose is to add chr(13).chr(10) after the data sent by the client, which means carriage return and then line feed, and convert it into a format that can be recognized by java.
That's all there is to the entire process and attention points of communication between PHP and Servlet.
Excerpted from veverrr’s column