Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

スレッドの使い方。

以下のUDPのサーバをスレッド化したいのですが、どのように考えればスレッド化することが可能なんでしょうか?ご教授よろしくお願いします。

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("filename.raw"))
        for(;;){
            biStream.read(buf,0,160*120*3);
            socket.send(sendPacket);
            Thread.sleep(x.timer);
            if(buf[0] < 0)break;
            socket.send(receivePacket);
        }
        biStream.close();
        }
    }
    catch(Exception e){
        System.out.println("Exception :" + e);
    }
  }
}

TCPの場合は親スレッドでサーバソケットの作成→accept()で接続待ち→ソケットの作成を処理し、クライアントからの接続要求と接続応答をさばき、子スレッドでソケットを用いた通信をクライアントごとに行うことによってスレッド化することができました。

5

回答

4070

閲覧

5件の回答

評価

0

>socket.receive(receivePacket);
ここで受け取ったパケットをスレッドに任せればいいのでは?

評価

0

mioさんご回答ありがとうございます。
>>socket.receive(receivePacket);
>ここで受け取ったパケットをスレッドに任せればいい>のでは?

スレッドに任せてみたのですがどうううまくいきません。

import java.io.*;
import java.net.*;

public class c_udp_server {
  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("filename.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);
      }
    }
}

コンパイルは正常に通りました。継承とかちょっとあやふやなんですが、文法・使い方がおかしければ指摘していただけないでしょうか?

クライアントからアクセスし配信動画が1フレーム表示したところで以下のエラーがでてとまってしまいます。(配信動画の1フレームも真っ黒でおかしいです。)なお、複数のクライアントからの接続要求もできませんでした。

フレーム:1
Exception2 :java.lang.NullPointerException
Exception2 :java.net.SocketTimeoutException: Receive timed out
Exception2 :java.net.SocketTimeoutException: Receive timed out
Exception2 :java.net.SocketTimeoutException: Receive timed out

引き続きご教授の方よろしくお願いいたします。

評価

0

まず、パケットバッファを使い回すと、次の要求が来たときに前回の要求が終わっていなければ、上書きされてしまいます。

クラス名も一般的なものに従いましょう。

評価

0

以下のTCPサーバをスレッド化したいのですが、どのようにすればスレッド化すれば用のでしょうか?
TCPの場合は親スレッドでサーバソケットの作成→accept()で接続待ち→ソケットの作成を処理し、クライアントからの接続要求と接続応答をさばき、子スレッドでソケットを用いた通信をクライアントごとに行うことによってスレッド化できるようにしたいのですが。

import java.io.*;
import java.net.*;

public class AnimServer0{
    public static void main(String args[]){
        try{
            byte buf[] = new byte[160*120];
            int i;
            BufferedInputStream biStream;
            int port = 8000;
            ServerSocket ss = new ServerSocket(port);
            System.out.println("Running...");

            while(true){
               Socket s = ss.accept();
               biStream=new BufferedInputStream(new FileInputStream("bane.raw"));
               DataOutputStream dos=new
DataOutputStream(s.getOutputStream());
               for(i = 0;i <= 200; i++){
              biStream.read(buf, 0, 160*120);
              dos.write(buf, 0, 160*120);
              }
              s.close();
             }
            }
            catch(Exception e){
            System.out.println("Exception : "+e);
            }
           }
          }

評価

0

他人のスレに自分の質問を追加で書くな。
改めて新規で質問しなさい。

ってか質問がちょっと中途半端な気がする。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。