お世話になります。
Javaでネットワークプログラミングを勉強したく、書籍やインターネットの情報を参考に簡単なWebサーバを作成しようとしています。
通信自体はなんとかうまく、送受信することができました。
ですが、ふと疑問に思ったのが、ファイルの入出力処理に関してSocketの挙動で不明な点があるのです。
自分が参考にしている本やページではSocket宣言->FileStream宣言という順番でインスタンスを準備していますが、特にこれらを紐付けている処理があるようには見えませんでした。なのにgetInputStream/getOutputStreamのようにインスタンスの情報を使用しているように見えます。
また、Socketを最初に作成したのに後から作成したFileStreamの情報をSocketインスタンスがどのようにして持っているのかがわからず、質問させていただきました。
以下にソースとテンプレートにあわせた質問事項を記載いたします。
ヒントだけでもいただければとっても助かります。よろしくお願いいたします。
前提・実現したいこと
・SocketクラスがどのようにしてFileInputStream/FileOutPutStreamのインスタンスの設定を取得しているのかを理解したい
疑問点
・SocketクラスがgetInputStream/getOutPutStreamメソッドを実行した際に、どのようにして対象のストリームを決定しているかがわからない
該当のソースコード
Java
1package httpServer.server; 2 3import java.io.FileInputStream; 4import java.io.FileOutputStream; 5import java.io.IOException; 6import java.io.InputStream; 7import java.io.OutputStream; 8import java.net.ServerSocket; 9import java.net.Socket; 10 11public class TcpServer { 12 13 public static void main(String[] args) throws Exception { 14 15 // ここでSocketインスタンス宣言->FileStreamインスタンス宣言 16 try(ServerSocket server = new ServerSocket(8111); 17 FileOutputStream fos = new FileOutputStream("server_recv.txt"); 18 FileInputStream fis = new FileInputStream("server_send.txt")){ 19 20 System.out.println("クライアントからの接続を待ちます。。。"); 21 Socket socket = server.accept(); 22 System.out.println("クライアント接続!"); 23 24 int ch; 25 InputStream input = socket.getInputStream(); 26 while((ch = input.read()) != 0){ 27 fos.write(ch); 28 } 29 OutputStream output = socket.getOutputStream(); 30 while((ch = fis.read()) != -1){ 31 output.write(ch); 32 } 33 34 socket.close(); 35 System.out.print("接続を終了しました。"); 36 37 }catch (Exception e) { 38 e.printStackTrace(); 39 } 40 41 } 42 43} 44
Java
1package httpServer.client; 2 3import java.io.FileInputStream; 4import java.io.FileOutputStream; 5import java.io.IOException; 6import java.io.InputStream; 7import java.io.OutputStream; 8import java.net.Socket; 9import java.net.UnknownHostException; 10 11public class TcpClient { 12 public static void main(String args[]) throws Exception { 13 14 // こちらも同様の宣言をしている。 15 try(Socket socket = new Socket("localhost",8111); 16 FileInputStream fis = new FileInputStream("client_send.txt"); 17 FileOutputStream fos = new FileOutputStream("client_recv.txt")){ 18 19 // 処理の中で、サーバ・クライアント共にsocket.getOutputStream()/socket.getInputStream()を 20 // 呼んでいる。 21 // しかしSocketとFileInputStream/FileOutputStreamはどのタイミングで情報を結びつけたのかが不明 22 int ch; 23 OutputStream output = socket.getOutputStream(); 24 while((ch = fis.read()) != -1){ 25 output.write(ch); 26 } 27 28 output.write(0); 29 30 InputStream input = socket.getInputStream(); 31 while((ch = input.read()) != -1){ 32 fos.write(ch); 33 } 34 35 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 40 41 } 42} 43
試したこと
・ためしにFileInputStreamのインスタンスを二つ以上宣言してみましたが、なぜか最初のStreamが使用されました。
・デバッガにて、getOutPutStreamの処理を追いかけ、
Socket->SocketImpl->PlainSocketImpl->AbstractPlainSocketImpl->return SocketOutputStream'
といったクラスの処理の移り変わりは見ることが出来ましたが、ソースにあるような具体的なファイルパス等を確認することが出来ず、追い方がそもそもあっているのかも不明です。
回答1件
あなたの回答
tips
プレビュー