質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Java

    13481questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • UDP

    57questions

    UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

  • ソケット

    24questions

    TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

UDPソケット通信について

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,225

nan

score 2

ソケットとスレッドを使ったチャットプログラムを作ろうとしています。
とりあえずUDP通信を行おうとしているのですが、自分のパソコンでは実行できるのですが、他の別パソコンとは実行できず通信ができません。

package semi;
/**
 * udpechoサーバ
 * udpechoServer.java
 * 
 * 用法例
 * >java udpechoServer
 */

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

public class udpechoServer {
    static final int echo_PORT = 10007;
    static final int BUFSIZE = 1024; //受信バッファサイズ

    public static void main(String[] args) throws IOException{
        int port = echo_PORT; //ポート番号
        int cliport; //クライアントポート番号
        int len; //データ長
        int i; //キーインバッファクリアインデックス
        DatagramSocket sock = null; //データグラムソケット宣言,初期化
        byte[] buf = new byte[BUFSIZE]; //送受信バッファ
        byte[] wbuf = new byte[BUFSIZE]; //ワークバッファ
        String recvdata; //受信データ
        try{
            sock = new DatagramSocket(port);
            DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE);
            DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE);
            System.out.println("Connected to echo server");
            while(true){
                sock.receive(recvpacket); //データ受信
                recvdata = new String(recvpacket.getData(),0,recvpacket.getLength());
                recvdata = recvdata.trim(); //トリミング(CRLF)
                wbuf = recvdata.getBytes(); //文字列→バイト配列変換
                i = 0;
                len = wbuf.length;
                buf = new byte[BUFSIZE];
                while(wbuf[i] != 0x0d){ //途中のCR検出
                    buf[i] = wbuf[i]; //データコピー
                    i++;
                    if(i >= len){
                        break;
                    }
                }
                recvdata = new String(buf,0,i); //バイト配列→文字列変換
                System.out.println(recvdata); //画面出力
                InetAddress ipadr = recvpacket.getAddress();
                cliport = recvpacket.getPort();
                buf = recvdata.getBytes(); //文字列→バイト配列変換
                len = buf.length;
                sendpacket = new DatagramPacket(buf,len,ipadr,cliport);
                sock.send(sendpacket); //データ送信
                recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット
            }
        }catch(SocketException e){
            e.printStackTrace();
        }
    }
}
package semi;

/**
 * udpechoクライアント
 * udpechoClient.java
 * 
 * 用法例
 * >java udpechoClient 192.168.1.1
 */

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

public class udpechoClient {
    static final int echo_PORT = 10007;
    static final int BUFSIZE = 1024; //受信バッファサイズ

    public static void main(String[] args) throws IOException{
        int port = echo_PORT; //ポート番号
        byte[] buf = new byte[BUFSIZE]; //送受信バッファ
        int k; //バイト数
        DatagramSocket sock = null; //データグラムソケット宣言,初期化
        if(args.length != 1){
            throw new IllegalArgumentException("usage: >java udpechoClient <IP_Address>");
        }
        while(true){
            try{
                InetAddress adr = InetAddress.getByName(args[0]); //サーバIPアドレス
                System.out.print("cli>"); //プロンプト出力
                k = System.in.read(buf); //キー入力
                if(k == -1){
                    break;
                }
                sock = new DatagramSocket();
                DatagramPacket packet = new DatagramPacket(buf,buf.length,adr,port);
                sock.send(packet); //入力データ送信
                buf = new byte[BUFSIZE];
                packet = new DatagramPacket(buf,buf.length);
                sock.receive(packet); //エコーデータ受信
                String data = new String(packet.getData(),0,packet.getLength());
                System.out.println(data); //画面出力
            }catch(SocketException e){
                e.printStackTrace();
            }
        }
        sock.close(); //ソケットクローズ
    }
}

どうすれば他のパソコンとUDPソケット通信ができるようになるのか教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

他の別パソコンとは実行できず通信ができません。

通信できないといっても色々なエラーが考えられると思います。どんなエラーがでたのかなどを質問に記載することが大切ではないでしょうか?

ちなみに自PCどうしでは通信できるとのことなので問題はポートにあると思います。UDPポートが利用可能な状態かどうかの確認が必要ではないでしょうか?昨今はセキュリティー上の配慮から「ネットワークの他のノードからの通信をなんでもかんでも通す」設定にはなっていないと思いますので。

通信しようとしているそれぞれのOSが何かやどんな回線を通じて通信しようとしているのかによって具体的な確認方法は違ってくると思います。LANケーブルで直結しているならOS・セキュリティーソフトの設定のみが関係すると思いますが、ルーターを通じて接続しているならルーター設定にもからんでくる等々が考えられると思います。


補足:Javaコードについて1つコメントします。
通信データの文字コードが曖昧になってしまっている問題があると思います。クライアントとサーバーのコードをみるとそれぞれ自PCのデフォルトの文字セット用のエンコード・デコードを前提にしています。同一の文字セット設定のPCどうしでの通信、あるいは通信対象の文字をASCIIに限定するなら問題ないですがそうでないなら期待通りの通信ができなくなると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/10 22:05

    youta1119さんのコメントみて気づきました。サーバー側でソケットをローカルポートへバインドするのは正しいように思えますが、クライアント側でソケットを生成する場合はサーバーのアドレスとポートに対してソケットをバインドすべきではないでしょうか?クライアント側からサーバーへ送信するパケットは届きそうですがその後レシーブしてもローカルポートからレシーブしようとしているのでサーバーからの応答が届かないように思えます…はっきり自身ないですが…

    キャンセル

0

    DatagramSocket(int port) //ローカルホスト上でサーバーが起動する
     DatagramSocket(int port, InetAddress laddr) // 指定したIPアドレスとポート上でサーバーが起動する


DatagramSocketのコンスとラクタを上のものから下のものに変えてみて下さい。
上のものだとローカルホスト上でサーバーが起動するようです。なので他のパソコンから接続できないのだと思われます。
DatagramSocketのリファレンス

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaで文字コードの変換をしたい

    前提・実現したいこと 今Javaで文字コードの扱いについて勉強しています。 発生している問題・エラーメッセージ 一度UTF-8からShift_JISに変換したあともう一度

  • 解決済

    System.out.printからSystem.out.writeへの書き換え

    単純な足し算プログラムの書き換えができません。 System.out.printではなく、System.out.writeを使用するプログラムに書き換えたいのですが、 うま

  • 解決済

    Unicodeに変換できない

    Unicodeにうまく変換できません。文字コードの指定の仕方が悪いのかもしれませんが… private EditText unicodeText; p

  • 解決済

    フォルダの中にあるファイルを1つずつ読み込む

    最近Javaで開発を始めました。 複数のファイルが入っているフォルダがあります。 このフォルダから1ファイルずつ開き中身をバッファか配列に読み込むコードを書きたいです。

  • 解決済

    日にちと曜日の場所の合わせ方

    カレンダーを作るときに、曜日と日にちの場所を合わせるコードの書き方が分かりません。 インターネットで調べたのですが、どれを参考にしたらいいのか、どれがあっているのか分からなかった

  • 解決済

    [java]10進数を文字に変換したい

    javaで 実現したいこと javaで10進数を文字に変換したいです 文字コードはUTF-8で 72 -> 'H' のような変換をする方法を教えてください

  • 解決済

    Javaでの文字コード値取得について

    Javaでutf-8のコード値からunicodeに変換するにはどうすればいいでしょうか? public static void main(String[] args) {

  • 解決済

    javaでのTCP/IP通信について

    前提・実現したいこと javaでTCP/IPを使って通信するためのプログラムを作りたいです 受信する側(サーバー側?)のプログラムは一応接続待ちになるところまでは動かせたの

同じタグがついた質問を見る

  • Java

    13481questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • UDP

    57questions

    UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

  • ソケット

    24questions

    TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。