- PR -

クライアント(VB)サーバ(JAVA)について

投稿者投稿内容
puri
常連さん
会議室デビュー日: 2003/09/08
投稿数: 28
お住まい・勤務地: 東京都
投稿日時: 2003-11-09 23:06
サーバーのOS:AS400
クライアントのOS:WondowsXP

クライアントからSQLをサーバーになげて
サーバー側でSQLを受け取りDB検索を行い、結果をクライアントに返す
ようにしたいのですが・・・。
SQLの結果は、サーバーのコンソール上に表示させると要求通りなのですが、
クライアントの画面に表示させることができません。
SQLをJAVAで認識できているので、文字コードの関係ないとは思うのですが、
その逆は無理なのかもしれませんね。

一応、両方のPGMを抜粋して載せてみますので、
どなたか意見を頂けると幸いです。

因みにクライアントがJAVAの場合は、意図した通り結果が返されます。
したがって、変更するとしたらクライアントのVBのプログラムを
変更する方向で考えています。

よろしくお願い致します。

*** サーバー(JAVA) ***
//JDBCによるDB検索
public void execute() {

try {

// JDBCドライバのロード
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
// DB接続の作成
con = DriverManager.getConnection(url + system, user,password);

// SQLコンテナの作成
Statement stmt = con.createStatement();
// SQL文の実行
ResultSet rs = stmt.executeQuery(in.readLine());

//方法1:表中のデータを特定のフィールドのみ取得する
while(rs.next()) {
item1 = rs.getString("IICONO");
item2 = rs.getString("IISUCL");
item3 = rs.getString("IIBUYE");
System.out.println("IICONO : " + item1 + " IISUCL:" + item2 + " IIBUYE:" + item3);
result = "IICONO :" + item1 + " IISUCL:" + item2 + " IIBUYE:" + item3;
//クライアントの画面に表示する場合
out.println(result);
out.flush();
}

*** クライアント(VB) ***
Private Sub cmdSend_Click()
Dim lngRet As Long '戻り値
Dim strSend As String '送信データ
Dim strErrMsg As String 'エラーメッセージ
Dim strRecv As String * 100 '受信データ
Dim strRecvBuf As String '受信バッファ

'送信
cmdSend.Enabled = False
strErrMsg = ""
strSend = txtSend.Text
lngRet = send(mlngSock, ByVal strSend, Len(strSend), 0)
If lngRet = SOCKET_ERROR Then
strErrMsg = "send:" & strWSAErrorGet(WSAGetLastError())
closesocket mlngSock
lngRet = WSACleanup()
GoTo exitSend:
End If

'受信
strRecvBuf = ""
Do While True
DoEvents
lngRet = recv(mlngSock, ByVal strRecv, 2000, 1)
If (lngRet > 0) Then
strRecvBuf = strRecvBuf & Left$(strRecv, lngRet)
Exit Do
ElseIf lngRet = SOCKET_ERROR Then
If WSAGetLastError() > 0 Then
strRecvBuf = ""
strErrMsg = "send:" & strWSAErrorGet(WSAGetLastError())
closesocket mlngSock
lngRet = WSACleanup()
GoTo exitSend:
Else
Exit Do
End If
Else
Exit Do
End If
Loop
lstRecv.AddItem strRecvBuf

cmdSend.Enabled = True

exitSend:
On Error Resume Next
If strErrMsg <> "" Then
MsgBox strErrMsg, vbOKOnly + vbExclamation, App.Title
cmdConnect.Enabled = True
End If
Exit Sub
End Sub
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-09 23:54
コードからはよくわかりませんが、Struts の Action に書かれたロジックをソケットプログラミングで呼び出すようなイメージでしょうか?それとも CGI でプロセスをキックしているのでしょうか?
VB はちとわかりませんが、切り分けのために DB を触らないシンプルなプログラムで試してみてはいかがでしょうか?
#本質的には Java は関係なく、「VB からソケットより読み出した文字列を表示できない」、という問題のようにも見えます。

また、Statement/ResultSet/Connection オブジェクトを明示的にクローズすることをお勧めいたします。
#Connection オブジェクトは省略されている finally ブロックでクローズされているのかもしれませんが。


[ メッセージ編集済み 編集者: インギ 編集日時 2003-11-10 01:08 ]
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-11-10 09:29
文字コードを変更しても、何も表示されないのでしょうか?JAVAの時は表示されているのに、JAVAでないときに表示されないなんて、疑問です・・・・。データがクライアントにいっているようなので、何かしら表示されるような気もするのですが・・・。
puri
常連さん
会議室デビュー日: 2003/09/08
投稿数: 28
お住まい・勤務地: 東京都
投稿日時: 2003-11-10 10:24
インギさん、begoodさん、ご意見有難うございます。

インギさんへ
Struts の Action に書かれたロジックをソケットプログラミングで呼び出すようなイメージでしょうか?それとも CGI でプロセスをキックしているのでしょうか?
この質問に関しては、まだまだ勉強不足で、質問の意味がよく分かりません。
申し訳ないです。
とりあえずは、DBを触らないシンプルなプログラムを試す方向で頑張ってみます。
Statement/ResultSet/Connection オブジェクトを明示的にクローズするのは、このロジックの記載したロジックの直後で行っています。
区切りの悪いところで切ってしまって、誤解を招いてしまいますよね・・・。
ご指摘有難うございます。

begoodさんへ
文字コードを変更するというのは、ロジック上のことでしょうか?
それともクライアント側の画面を表示する場合に操作上で
キーボードを使ってなにか行う必要があるのでしょうか?
今まで汎用系ばかりで、この1,2ヶ月でJAVAやVBやスレッドなどを
触ることになったので、見当違いな質問をしているかもしれませんが、
ご指摘よろしくお願いします。

begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-11-10 12:28
ロジック上でです。クライアント側で、キーボードやビューアー等で文字コード等を変更してみてもいいかとは思われますが、どこかで、データが文字コードによって完全にこけてしまっていた場合、あまり原因を探るのには良くないので・・・。VB側でなんかしら、文字コードをいじることできませんか?
puri
常連さん
会議室デビュー日: 2003/09/08
投稿数: 28
お住まい・勤務地: 東京都
投稿日時: 2003-11-11 10:46
引用:

begoodさんの書き込み (2003-11-10 12:28) より:
ロジック上でです。クライアント側で、キーボードやビューアー等で文字コード等を変更してみてもいいかとは思われますが、どこかで、データが文字コードによって完全にこけてしまっていた場合、あまり原因を探るのには良くないので・・・。VB側でなんかしら、文字コードをいじることできませんか?




begoodさん、ご意見有難うございました。
就職の方もおめでとうございます。

その後、VB側で文字コードを変換して表示するように四苦八苦してみましたが、
まだまだ時間がかかりそうです。
この方法でもできるとは思うのですが、私のプログラミング能力が低くて・・・。
で、上司とも話し合った結果、
JAVA側でunicode→ShiftJisに変換してから結果を返す方法を探ることにしました。
ネット上で、逆のパターンのサンプルはよく見つけるのですが、
このパターンの文字コード変換サンプルはなかなか見つかりません。
どなたかご存知の方ご教授願います。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-11-11 11:42
引用:

JAVA側でunicode→ShiftJisに変換してから結果を返す方法を探ることにしました。
ネット上で、逆のパターンのサンプルはよく見つけるのですが、
このパターンの文字コード変換サンプルはなかなか見つかりません。


逆のパターンとは、String#String(byte[] bytes, String charsetName) を使っていると思います。ということは、この逆は変換後のchar-set名を与えてbyte配列を取り出すということは予想できると思います。
この予想を元にAPIリファレンスのStringのページを探すと、String#getByte(String charsetName)というのが見つかると思います。

この2つのメソッドを使用することで、変換ルールさえ存在すれば、Unicodeを介した文字コード変換を実行することが可能になります。

文字コード変換に関して1つ注意点があります。
間発環境のバージョンが書かれていないため、どのバージョンを使用しているのかは分からないですが、1.4.0 -> 1.4.1でShift-JISの扱い方が変わったので、注意が必要です。
詳しくはこのへんが参考になるかな
puri
常連さん
会議室デビュー日: 2003/09/08
投稿数: 28
お住まい・勤務地: 東京都
投稿日時: 2003-11-11 12:16
かずくんさん、丁寧に説明して頂き有難うございます。
この説明ですんなり出来るかどうかは微妙ですが、挑戦はしてみます。

引用:


文字コード変換に関して1つ注意点があります。
間発環境のバージョンが書かれていないため、どのバージョンを使用しているのかは分からないですが、1.4.0 -> 1.4.1でShift-JISの扱い方が変わったので、注意が必要です。
詳しくはこのへんが参考になるかな



ちなみに、バージョン1.3です。多分、影響ないと思いますけど・・・。

スキルアップ/キャリアアップ(JOB@IT)