• 締切済み

UDPサーバのスレッド化

JavaでUDPのサーバを作っているのですが、スレッド化ができません。] 以下の二つがキーワードだと思うのですが、どうかいていけばいいのかわかりません。お分かりになる方ご教授お願いいたします。 public class c_udp_server extends public void run() //サーバソース import java.io.*; import java.net.*; public class c_udp_server { public static void main(String args[]){ int port = 8000; BufferedInputStream biStream; InetAddress clientAddress; int clientPort; byte buf[]= new byte[160*120*3]; DatagramPacket sendPacket = new DatagramPacket(buf,buf.length); byte req[] = new byte[32]; DatagramPacket receivePacket = new DatagramPacket(req,req.length); try { DatagramSocket socket = new DatagramSocket(port); System.out.println("Running..."); while(true){ socket.receive(receivePacket); clientAddress = receivePacket.getAddress(); clientPort = receivePacket.getPort(); socket.send(receivePacket); sendPacket.setAddress(clientAddress); sendPacket.setPort(clientPort); sendPacket.setLength(160*120*3); biStream = new BufferedInputStream(new FileInputStream(s.raw)); for(;;){ biStream.read(buf,0,160*120*3); socket.send(sendPacket); if(buf[0] < 0)break; } biStream.close(); } } catch(Exception e){ System.out.println("Exception :" + e); } } } 環境 Windows XP Pro java version "1.5.0_10"

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

確認したわけではありませんが。。。 c_udp_serverSocket のコンストラクタでstart()メソッドを起動していますが、これが問題の気がします。 それから、全部見ていませんが、 サーバーはrecieveメソッドを抜けたらすぐにスレッドを生成し、 セッションの設定などはスレッドに任せてしまったほうが、 サーバーが開放される時間が早くなりますし、ソースコードの 可読性もあがると思います。 枠組みはこんな感じ(概略イメージ)。 while(){ socket.receive(receivePacket); thread = new XXXThraed(socket, sndPkt, rcvPkt); thread.start(); }

noname#106424
質問者

お礼

ご回答ありがとうございます!! ngsvxさんの意見を参考に頑張ってみます。 また何か分かりましたら、ご教授よろしくお願いいたします。

noname#106424
質問者

補足

TCPの感じと一緒のように考えればいいのでしょうか?以下のソースはスレッド化してあるTCPのサーバアです。枠組みの所と似ているので、このソースが参考になるのでしょうか!? import java.io.*; import java.net.*; import java.util.*;//連想配列を使用するために必要 public class thread_server extends Thread{//Threadクラスの継承 private Socket s; //ソケットの変数 static int count = 0; //同時接続数の初期化 //インスタンスでコンストラクタの設定 public thread_server(Socket s){ this.s = s; } //接続待ちまでの処理 public static void main(String[] args) { try{ InetAddress ipaddr = null; //アドレスの初期化 int port = 8000; //ポートの指定 ServerSocket ss = new ServerSocket(port);//ポート番号を指定してサーバソケットの作成 HashMap seMap = new HashMap();//クライアントごとの接続数のための連想配列 System.out.println("Running...\n"); while (true){ Socket s = ss.accept(); //クライアントからの接続待ち InetAddress addr = s.getInetAddress(); //ソケットの接続先のアドレスを返す String ad = addr.getHostName(); //ホスト名の保持 Integer value; count++; //同時接続の加算カウンタ System.out.println("現在接続中のクライアント数:" + count +"\n"); //連想配列にホスト名はあるかのチェック if (!seMap.containsKey(ad)) { seMap.put(ad, new Integer(1));//ないなら初期値に1 } //あるのならそれぞれのホストごとにカウント else { value = (Integer) seMap.get(ad); value = new Integer(value.intValue()+1); seMap.put(ad, value); } System.out.println("クライアント情報"); System.out.println("ホスト名:"+ ad); System.out.println("IPアドレス:"+ addr.getHostAddress()); System.out.println("ポート番号:"+ s.getPort()); System.out.println("接続回数:"+ seMap.get(ad)+"\n");    //sを初期値としたインスタンスを作成し //start()メソッドを呼び出してrun()メソッドを実行 new thread_server(s).start(); } } catch(Exception e){ System.err.println("Exception :" + e); } } //スレッドごとに実行する処理 public void run(){ try{ byte buf[] = new byte[160*120];//1フレームの配列 BufferedInputStream biStream; //spring.rawの中身をバッファの中に格納する biStream = new BufferedInputStream(new FileInputStream("spring.raw")); //バッファの中身をソケットに受け渡す DataOutputStream dos = new DataOutputStream(s.getOutputStream()); for(;;){ biStream.read(buf,0,160*120);//フレームとして読み込む dos.write(buf,0,160*120);//フレームとして書き込む if(buf[0] < 0)break;//フレームの最初の左端が0未満の時、終了 } count--; //同時接続の減算カウンタ //接続がない時と全ての接続が終了した時の表示 if(count==0){ System.out.println("現在接続中のクライアントはありません"+"\n"); } s.close(); } catch(Exception e){ System.err.println("Exception :" + e); } } }

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

あなたのソースの中に、Thread クラスも Runnableインタフェースも 存在しないのですが、マルチスレッドアプリの仕組みはご存知でしょうか? [Java マルチスレッド プログラム]あたりをキーワードにして、 勉強されるほうがよろしいでしょう。 http://msugai.fc2web.com/java/thread/create.html このURLを参考にしていただいてもよろしいかと思います。

noname#106424
質問者

お礼

ご回答ありがとうございます!! 色々なサイトを拝見して継承などをしてみました。 コンパイルはとおったのですが、クライアントでアクセスすると動画の表示が始まりません。何か文法がおかしいのでしょうか? やりたいことはクライアントからアクセスがあった場合、クライアントごとに動画を配信したいのです。

noname#106424
質問者

補足

<pre><code> import java.io.*; import java.net.*; import java.util.*; public class c_udp_server2 { public static void main(String args[]){ int port = 8000; //ポート番号8000指定 InetAddress clientAddress;//クライアントのIPアドレス BufferedInputStream biStream; int clientPort; //クライアントのポート番号 //送信用のDatagramPacket byte buf[]= new byte[160*120*3]; DatagramPacket sendPacket = new DatagramPacket(buf,buf.length); //受信用のDatagramPacket byte req[] = new byte[32]; DatagramPacket receivePacket = new DatagramPacket(req,req.length); try { //指定したポートでソケットの作成 DatagramSocket socket = new DatagramSocket(port); System.out.println("Running..."); while(true){ socket.receive(receivePacket); clientAddress = receivePacket.getAddress(); clientPort = receivePacket.getPort(); socket.send(receivePacket); sendPacket.setAddress(clientAddress); sendPacket.setPort(clientPort); sendPacket.setLength(160*120*3); new c_udp_serverSocket(socket, sendPacket, receivePacket); } } catch(Exception e){ System.out.println("Exception :" + e); } } } class c_udp_serverSocket extends Thread{ BufferedInputStream biStream; DatagramSocket socket2; byte buf2[] = new byte[160*120*3]; DatagramPacket sendPacket2 = new DatagramPacket(buf2, buf2.length); byte req2[] = new byte[32]; DatagramPacket receivePacket2 = new DatagramPacket(req2, req2.length); c_udp_serverSocket(DatagramSocket socket, DatagramPacket sendPacket, DatagramPacket receivePacket) { socket2 = socket; sendPacket2 = sendPacket; receivePacket2 = receivePacket; try { biStream = new BufferedInputStream(new FileInputStream("file.raw")); } catch (Exception e) { System.err.println("Exception : " + e); } this.start(); } public void run() { try { for(;;){ biStream.read(buf2,0,160*120*3); socket2.send(sendPacket2); if(buf2[0] < 0)break; socket2.receive(receivePacket2); } biStream.close(); socket2.close(); } catch(Exception e){ System.out.println("Exception :" + e); } } } </code></pre>

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

サーバーでスレッドを使う以前に、単純なスレッドの使い方は知っているのですか?

noname#106424
質問者

お礼

ご回答ありがとうございます!! 上記にスレッド化(できているかわかりませんが)させたソースを添付しましたので、文法とうおかしな点があればご教授よろしくお願いいたします。

noname#106424
質問者

補足

詳しくはわかりませんが、サイトや書籍をみながら勉強しています。

関連するQ&A