ホームページ >バックエンド開発 >PHPチュートリアル >PHP とサーブレットは Socket_PHP を介して通信します チュートリアル
今回の実験では、PHPとサーブレット間の通信を実現するのに大変苦労しました。 。 。 。 。 。 。 。さらに、インターネット上の既製の情報は完全ではありません。この実験で発生したエラーと解決策を皆さんと共有できることを嬉しく思います。
PHPはクライアント側として機能し、サーブレットはサーバー側として機能しますサーバー側の一般的なアプローチは次のとおりです:
1. サーブレット クラスを作成し、サーバーの起動時にロードされるクラスとしてサーブレットを設定します。
<サーブレット>
<サーブレット名>ログインサーブレット名>
<サーブレットクラス>Servlet.LoginServletサーブレットクラス><起動時のロード>0起動時のロード>
サーブレット>
2.Serveltのinit()メソッドに別途サーバーサイドのコードを書いて監視する場合
while(true){
ソケット = サーバー.accept();
}
これにより、Tomcat の起動タイムアウトが発生します。
正しいアプローチは、個別の監視および処理スレッド クラス SocketServer を作成し、マルチスレッドを使用して init() でスレッドを開始することです。
public void init(ServletConfig config){
新しいスレッド(){
パブリック void run(){
試してみる{
ServerSocket サーバー = 新しい ServerSocket(4700);
ソケット ソケット = null;while(true){
socket=server.accept();
SocketServer sServer=新しい SocketServer(ソケット);
sServer.start();}
}catch(IOException e){System.out.println(e.getMessage());}
}
}.start();
}
public class SocketServer extends Thread{
プライベートソケットソケット
public SocketServer(ソケットソケット){
This.socket = ソケット
}
public void run(){
文字列出力 = "";
{を試してください
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter os=new PrintWriter(socket.getOutputStream());
文字列行 = null;行 = is.readLine();
System.out.println(行);出力 = "サーバー送信";
os.println(出力);os.flush();
は.close();os.close();
ソケット.クローズ();} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}}
}
クライアント側で、サーバー側から送信されたデータを受信できませんでした。コードを注意深く確認したところ、 os.flush(); がないことがわかりました。
init() メソッドで新しいスレッドを開始し、この新しいスレッドを通じてリクエストごとに新しいスレッドを開始して、クライアントからのソケットリクエストに応答します
クライアント側では、PHP で書かれています
クライアントはまずサーバーにデータを送信し、次にサーバーから返されたデータを受信して表示します
$userName = 'veverrr' ;
$パスワード = 'SWJTU';$write_str = '';
if ($userName == null || $password == null){// ログイン システムに戻ります
}
$socket_host ='ローカルホスト';
$ソケットポート = 4700;
$ソケット = ソケット作成(AF_INET、SOCK_STREAM、SOL_TCP);$connection = ソケット接続($socket, $socket_host,$socket_port);
$write_str .= $userName.$password.chr(13)
;
if (!socket_write($socket, $write_str,strlen($write_str))){
エコー「書き込み接続」
}
$return_str = ソケット読み取り($socket, 1024);
エコー $return_str;
ソケットクローズ($ソケット);
is.readline() を使用するとサーバーが停止しました。その後、海外の Web サイトでメソッドを見つけ、テストに合格しました。
主な目的は、クライアントから送信されたデータの後に chr(13).chr(10) (キャリッジリターンとラインフィードを意味します) を追加し、Java が認識できる形式に変換することです。
PHPとサーブレット間の通信の全体の流れと注意点は以上です。
veverrrさんのコラムより抜粋
http://www.bkjia.com/PHPjc/478482.html