この例では、ソケットを使用して 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);
}