例: プロセス間通信のためにソケットを使用する

この例では、ソケットを使用して Java™ プログラムと C プログラムとの間で通信します。

最初に、ソケット上で聴取する C プログラムを開始してください。 Java プログラムがソケットに接続された後は、ソケット接続を使用して C プログラムがそれにストリングを送ります。 C プログラムから送られるストリングは、コード・ページ 819 の ASCII コードのストリングです。

Qshell インタープリターのコマンド行か、または他の Java プラットフォームで、コマンド java TalkToC xxxxx nnnn を使用して Java プログラムを開始しなくてはなりません。 または IBM® i コマンド行に JAVA TALKTOC PARM(xxxxx nnnn) を入力することにより、Java プログラムを開始します。 xxxxx は、C プログラムが実行されているシステムのドメイン・ネームまたはインターネット・プロトコル (IP) アドレスです。 nnnn は、C プログラムが使用するソケットのポート番号です。 このポート番号は、C プログラムを呼び出すときに最初に渡すパラメーターとして指定する必要があります。

TalkToC クライアント Java クラスのソース・コード

注: サンプル・コードをご使用の場合は、コードに関するライセンス情報および特記事項に同意していただいているものとします。
import java.net.*;
import java.io.*;
 
class TalkToC
{
   private String host = null;
   private int port = -999;
   private Socket socket = null;
   private BufferedReader inStream = null;
 
   public static void main(String[] args)
   {
      TalkToC caller = new TalkToC();
      caller.host = args[0];
      caller.port = new Integer(args[1]).intValue();
      caller.setUp();
      caller.converse();
      caller.cleanUp();
   } 
 
   public void setUp()
   {
      System.out.println("TalkToC.setUp() invoked");
 
      try
      {
         socket = new Socket(host, port);
         inStream = new BufferedReader(new InputStreamReader(
                                       socket.getInputStream()));
      }
      catch(UnknownHostException e)
      {
         System.err.println("Cannot find host called: " + host);
         e.printStackTrace();
         System.exit(-1);
      }
      catch(IOException e)
      {
         System.err.println("Could not establish connection for " + host);
         e.printStackTrace();
         System.exit(-1);
      }
   } 
 
   public void converse()
   {
      System.out.println("TalkToC.converse() invoked");
 
      if (socket != null && inStream != null)
      {
         try
         {
            System.out.println(inStream.readLine());
         }
         catch(IOException e)
         {
            System.err.println("Conversation error with host " + host);
            e.printStackTrace();
         }
      } 
   } 
 
   public void cleanUp()
   {
      try
      {
         if (inStream != null)
            inStream.close();
         if (socket != null)
            socket.close();
      } 
      catch(IOException e)
      {
         System.err.println("Error in cleanup");
         e.printStackTrace();
         System.exit(-1);
      }
   } 
}

SockServ.C は、ポート番号のパラメーターを渡すことによって開始します。 たとえば、CALL SockServ '2001' とします。

SockServ.C サーバー・プログラムのソース・コード

注: 法律上の重要な情報に関しては、コードの特記事項情報をお読みください。
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <sys/time.h>
 
void main(int argc, char* argv[])
{
   int    portNum = atoi(argv[1]);
   int    server;
   int    client;
   int    address_len;
   int    sendrc;
   int    bndrc;
   char*  greeting;
   struct sockaddr_in  local_Address;
   address_len = sizeof(local_Address);
 
   memset(&local_Address,0x00,sizeof(local_Address));
   local_Address.sin_family = AF_INET;
   local_Address.sin_port = htons(portNum);
   local_Address.sin_addr.s_addr = htonl(INADDR_ANY);
 
   #pragma convert (819)
   greeting = "This is a message from the C socket server.";
   #pragma convert (0)
 
   /*  allocate socket    */
   if((server = socket(AF_INET, SOCK_STREAM, 0))<0)
   {
      printf("failure on socket allocation¥n");
      perror(NULL);
      exit(-1);
   }
 
   /* do bind   */
   if((bndrc=bind(server,(struct sockaddr*)&local_Address, address_len))<0)
   {
     printf("Bind failed¥n");
     perror(NULL);
     exit(-1);
   }
 
   /* invoke listen   */
   listen(server, 1);
 
   /* wait for client request */
   if((client = accept(server,(struct sockaddr*)NULL, 0))<0)
   {
     printf("accept failed¥n");
     perror(NULL);
     exit(-1);
   }
 
   /* send greeting to client    */
   if((sendrc = send(client, greeting, strlen(greeting),0))<0)
   {
      printf("Send failed¥n");
      perror(NULL);
      exit(-1);
   }
 
   close(client);
   close(server);
}