このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

ふたたびHTTPのjava通信について

発言者:えぐさjun
( Date Thursday, May 22, 1997 23:31:39 )


どうも、えぐさです。
質問に対して色々教えていただき、ありがとうございました。
で、それでいろいろやってみたんですが、
どうにもうまくいきません。
基本的にjavaには詳しくないんです。(MacHTTPもですけど)
で、以下に長々とプログラムを書いてみたんですが、
これはないんじゃない?って方いらっしゃいましたら、
教えていただけないでしょうか。
ちなみにサーバーのアプリケーションは
MRJ SDKのJBinderyで動かしています。
サーバーマシンのホスト名はserver.majokkoです。(変な名前!)

以下サーバー側アプリケーション
import java.net.*;
import java.io.*;

public class TcpServer{

    public static void main(String args[]){
        ServerSocket ss = null;
        Socket s;
        String sendString = "Hello Net World! via TCP\n";
        int slength;
        OutputStream sout;

        try{
            ss = new ServerSocket(4321,300);
            while(true){
                s = ss.accept();
                sout = s.getOutputStream();
                slength = sendString.length();
                for(int i = 0;i < slength;i++){
                    sout.write((int)sendString.charAt(i));
                }
                sout.close();
                s.close();
            }
        }
        catch(IOException e){
            System.out.println("Caugut IOException");
            System.exit(1);
        }
    }
}
-------------------------------
以下クライアント側アプレット
import java.net.*;
import java.io.*;
import java.applet.Applet;
import java.awt.*;

public class tcpClient extends Applet{

    Socket s;
    InputStream sIn;
    int c;
    String host;
    String comment = "";

    public void init(){
        host = "server.majokko";
                 
        try{
            s = new Socket(host,4321);

            sIn = s.getInputStream();
            while((c = sIn.read()) != -1){
                comment = comment + c;
            }
            repaint();
            sIn.close();
            s.close();
        }
        catch(IOException e){
            comment = "ERROR";
            repaint();
        }
    }

    public void paint(Graphics g){

        g.setFont(new Font("TimesRoman",Font.BOLD,18));
        g.drawString("From Server",10,25);
        g.drawString(comment,10,150);
    }
}

で、これを実行するとERRORの文字が出るんです。
            えぐさjun

田中求之 さんからのコメント
( Friday, May 23, 1997 15:43:11 )

Java のことはわかりませんが、ようは、単純に Socekt でサーバーとクライアントが
つながって、クライアント側にサーバーから送られてくる sendString が表示される
もののようですね。

Error の文字がクライアント側ででているということは、Socket でストリームを
開くところか、データ待ちの状態になっている while ループの部分なのでしょうが、
この場合、IOException で、どういうエラーが起きているのか、エラー内容を
捕まえることはできないのでしょうか?

エラーが出ているのなら、エラーの内容を確定することが、解決への第1歩なんですが。


それと、実験はどのような状態で行っていますか? 1台のマックで両方のアプレット
を動かそうとしているのでしょうか?

えぐさjun さんからのコメント
( Saturday, May 24, 1997 09:35:25 )

残念ながらエラーの内容を捕まえることはできてません。(というより、
捕まえ方がよくわかんないんです)
エラーの表示はjavaやブラウザがだしてるんじゃなくて、
IOExceptionが起きたときは
ERRORの文字がpaintされるようにしてあるだけなものですから。

なんとなくですが、一番最初の接続される部分でエラーが起こってるのではないかと
思ってはいます。
実験は2台のMacで行っています。
ローカルトークで2台をつなぎ、1台をサーバーとして動かして、
もう1台のMacに入れてあるネスケで接続するという形です。

       えぐさjun

田中求之 さんからのコメント
( Saturday, May 24, 1997 14:14:03 )

>残念ながらエラーの内容を捕まえることはできてません。(というより、
>捕まえ方がよくわかんないんです)

えぐささんの Java の場合だと、e.getMessage() でエラー内容が捉えられる
ような気がするんですが( comment = e.getMessage();  てな感じかな?)
エラーが起きて、IOException に分岐した際に、エラーの内容を getMessage()
で得られるのではなかったでしょうか?> Java に詳しい方


 …Java はよくわからないけど、AppleScript からの推量で考えてます (^_^;;

前薗 健一 さんからのコメント
( Saturday, May 24, 1997 23:53:28 )

> comment = e.getMessage();  てな感じかな?

僕も C++ からの推測ですけど、そういう method があるはずです。

えぐさjun さんからのコメント
( Tuesday, May 27, 1997 11:56:49 )

なんとかエラーを捕えることができるようになりまして、
あっちゃ、こっちゃにそれを配置した結果、
どうもストリーミングの最後に-1を返すことになってる部分が
何も返してないらしく、そのためデータの最後を検知できなくって
ループが永遠に続いてエラーを起こしたみたいです。
ものの本には、readメソッドがストリームの最後を判断し、-1を返すと書いてあったんですが…。
で、色々やってみて、結局その部分は不明となりました。
しかし、それならと、データを送り出すほうに、最後に-1をくっつけて
送り出すことにしましたら、うまくいきました。
(完全な解決ではないですけど)
でも、これでなんとかいきそうです。
どうもありがとうございました。
                   えぐさ