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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

ソケット

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

UDP

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

Q&A

2回答

5670閲覧

UDPソケット通信について

nan

総合スコア10

Java

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

ソケット

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

UDP

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

0グッド

1クリップ

投稿2017/01/10 09:54

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

Java

1package semi; 2/** 3 * udpechoサーバ 4 * udpechoServer.java 5 * 6 * 用法例 7 * >java udpechoServer 8 */ 9 10import java.net.*; 11import java.io.*; 12 13public class udpechoServer { 14 static final int echo_PORT = 10007; 15 static final int BUFSIZE = 1024; //受信バッファサイズ 16 17 public static void main(String[] args) throws IOException{ 18 int port = echo_PORT; //ポート番号 19 int cliport; //クライアントポート番号 20 int len; //データ長 21 int i; //キーインバッファクリアインデックス 22 DatagramSocket sock = null; //データグラムソケット宣言,初期化 23 byte[] buf = new byte[BUFSIZE]; //送受信バッファ 24 byte[] wbuf = new byte[BUFSIZE]; //ワークバッファ 25 String recvdata; //受信データ 26 try{ 27 sock = new DatagramSocket(port); 28 DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); 29 DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); 30 System.out.println("Connected to echo server"); 31 while(true){ 32 sock.receive(recvpacket); //データ受信 33 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); 34 recvdata = recvdata.trim(); //トリミング(CRLF) 35 wbuf = recvdata.getBytes(); //文字列→バイト配列変換 36 i = 0; 37 len = wbuf.length; 38 buf = new byte[BUFSIZE]; 39 while(wbuf[i] != 0x0d){ //途中のCR検出 40 buf[i] = wbuf[i]; //データコピー 41 i++; 42 if(i >= len){ 43 break; 44 } 45 } 46 recvdata = new String(buf,0,i); //バイト配列→文字列変換 47 System.out.println(recvdata); //画面出力 48 InetAddress ipadr = recvpacket.getAddress(); 49 cliport = recvpacket.getPort(); 50 buf = recvdata.getBytes(); //文字列→バイト配列変換 51 len = buf.length; 52 sendpacket = new DatagramPacket(buf,len,ipadr,cliport); 53 sock.send(sendpacket); //データ送信 54 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット 55 } 56 }catch(SocketException e){ 57 e.printStackTrace(); 58 } 59 } 60} 61

Java

1package semi; 2 3/** 4 * udpechoクライアント 5 * udpechoClient.java 6 * 7 * 用法例 8 * >java udpechoClient 192.168.1.1 9 */ 10 11import java.net.*; 12import java.io.*; 13 14public class udpechoClient { 15 static final int echo_PORT = 10007; 16 static final int BUFSIZE = 1024; //受信バッファサイズ 17 18 public static void main(String[] args) throws IOException{ 19 int port = echo_PORT; //ポート番号 20 byte[] buf = new byte[BUFSIZE]; //送受信バッファ 21 int k; //バイト数 22 DatagramSocket sock = null; //データグラムソケット宣言,初期化 23 if(args.length != 1){ 24 throw new IllegalArgumentException("usage: >java udpechoClient <IP_Address>"); 25 } 26 while(true){ 27 try{ 28 InetAddress adr = InetAddress.getByName(args[0]); //サーバIPアドレス 29 System.out.print("cli>"); //プロンプト出力 30 k = System.in.read(buf); //キー入力 31 if(k == -1){ 32 break; 33 } 34 sock = new DatagramSocket(); 35 DatagramPacket packet = new DatagramPacket(buf,buf.length,adr,port); 36 sock.send(packet); //入力データ送信 37 buf = new byte[BUFSIZE]; 38 packet = new DatagramPacket(buf,buf.length); 39 sock.receive(packet); //エコーデータ受信 40 String data = new String(packet.getData(),0,packet.getLength()); 41 System.out.println(data); //画面出力 42 }catch(SocketException e){ 43 e.printStackTrace(); 44 } 45 } 46 sock.close(); //ソケットクローズ 47 } 48} 49

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Java

1 DatagramSocket(int port) //ローカルホスト上でサーバーが起動する

Java

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

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

投稿2017/01/10 11:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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


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

投稿2017/01/10 10:45

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/01/10 13:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問