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

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

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

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Q&A

解決済

1回答

2419閲覧

ポートを変更しても アドレスはすでに使用中です となってしまう

yukkuri

総合スコア624

Java

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

0グッド

0クリップ

投稿2019/03/09 14:21

前提・実現したいこと

現在、Java で ServerSocket のラッパークラスを作っていて、
その接続テストを行う場合にエラーが発生してしまいました。

発生している問題・エラーメッセージ

Exception in thread "main" java.net.BindException: アドレスは既に使用中です at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)

該当のソースコード

Java

1package org.jyl.base.io.socket; 2 3import java.io.IOException; 4 5import java.net.InetSocketAddress; 6import java.net.ServerSocket; 7import java.net.Socket; 8 9import java.util.ArrayList; 10 11/** 12 * クライアントソケットが接続されるサーバーを実装します。 13 * 仕様上、切断されたかの判断は {@code isClosed()} を用いて行うため、 14 * 通信を終了する際確実にクローズしてください。 15 */ 16public class JylServer extends ServerSocket implements Runnable 17{ 18 private ArrayList<Socket> sockets = new ArrayList<Socket>( 0 ); 19 20 private ServerCheckOption option; 21 22 /** 23 * クライアントソケットが接続するサーバーを構築します。 24 * 25 * @param port ポート番号 0 から 65535 までである必要があります。 26 * @param maxque 受信する接続要求の最大数 27 * @param timeout タイムアウトまでにかかる時間(ms) 28 * 29 * @throws IOException 30 */ 31 public JylServer( int port, int maxque, int timeout ) throws IOException 32 { 33 new ServerSocket( port, maxque ); 34 setSoTimeout( timeout ); 35 36 setServerCheckOption( new DefaultServerCheckOption() ); 37 38 bind( new InetSocketAddress( port ), maxque ); 39 40 Thread th = new Thread( this ); 41 th.start(); 42 } 43 44 /** 45 * サーバーに対しての接続要求を受け取ります。 46 * 47 * @throws IOException 48 */ 49 public synchronized void waitConnect() throws IOException 50 { 51// WHILE: 52 while( true ){ 53 Socket sc = accept(); 54// System.out.println( "scPort:" + sc.getLocalPort() ); 55// System.out.println( sc ); 56 if( sc != null ){ 57 sockets.add( sc ); 58 System.out.println( "added" ); 59// break WHILE; 60 } 61 System.out.println( "noBreak" ); 62 try{ 63 Thread.sleep( 1 ); 64 break; 65 }catch( Exception e ){} 66 } 67 } 68 69 /** 70 * 現在サーバーに接続しているメンバーを接続された順番に格納された配列で返します。 71 * 新しいクライアントソケットが接続、または切断されたかは、この関数の戻り値の 72 * 長さで取得することができます。 73 * 74 * @return 接続されているメンバーを示すソケット 75 */ 76 public synchronized Socket[] getAccessNembers() 77 { 78 Socket[] scs = new Socket[ sockets.size() ]; 79 return sockets.toArray( scs ); 80 } 81 82 /** 83 * 指定された順番で入ってきたプレイヤーを強制的に切断させます。 84 * 85 * @param joinNumber 接続された順番 getAccessNembers() での配列内位置 86 * 87 * @see #getAccessNembers() 88 * 89 * @throws IOException 90 */ 91 public synchronized void kick( int joinNumber ) throws IOException 92 { 93 sockets.get( joinNumber ).close(); 94 } 95 96 /** 97 * ソケットが接続されているかなどの管理方法を設定します。 98 * 99 * @param option 管理方法 100 * 101 * @see org.jyl.base.io.socket.ServerCheckOption 102 */ 103 public synchronized void setServerCheckOption( ServerCheckOption option ) 104 { 105 this.option = option; 106 } 107 108 /** 109 * ここでは、接続の確認などを行います。 110 */ 111 @Override public final void run() 112 { 113 while( true ){ 114 int[] kicklist; 115 116 // 接続されたかなどをチェック 117 try{ 118 waitConnect(); 119 }catch( IOException ie ){ 120 ie.printStackTrace(); 121 } 122 123 synchronized( this ){ 124 Socket[] scs = new Socket[ sockets.size() ]; 125 kicklist = option.check( sockets.toArray( scs ) ); 126 127 System.out.println( "length:" + kicklist.length ); 128 129 if( kicklist != null ){ 130 for( int l = 0; l < kicklist.length; l++ ){ 131 System.out.println( "for:" + l ); 132 sockets.remove( l ); 133 for( int m = 0; m < kicklist.length; m++ ) kicklist[ m ]--; 134 } 135 } 136 } 137 138 try{ 139 Thread.sleep( option.wait ); 140 }catch( Exception e ){} 141 } 142 } 143} 144

Java

1import org.jyl.base.io.socket.*; 2 3public class TestServer 4{ 5 public static void main( String... a ) throws Exception 6 { 7 JylServer server = new JylServer( 14000, 10, 17713 ); 8// int size = server.getAccessNembers().length; 9 10/* Thread th = new Thread( new Runnable(){ 11 @Override public void run() 12 { 13 while( true ){ 14 server.waitConnect(); 15 try{ 16 Thread.sleep( 3 ); 17 }catch() 18 } 19 } 20 }); 21 th.start();*/ 22 23// if( size < server.getAccessNembers().length ) 24// System.out.println( "誰かログインしたようですよ!" ); 25 26 27 System.out.println( "while" ); 28 while( true ){ 29 int member = server.getAccessNembers().length; 30 31 System.out.println( "member:" + member ); 32 33 try{ 34 Thread.sleep( 3 ); 35 }catch( Exception e ){} 36 37 if( member > server.getAccessNembers().length ) System.out.println( "誰か切断したようです" ); 38 if( member < server.getAccessNembers().length ) System.out.println( "誰かログインしたようです" ); 39 40 if( member == 0 ){ 41 try{ 42 server.close(); 43 System.exit( 0 ); 44 }catch( Exception e ){} 45 } 46 } 47 } 48} 49

Java

1import org.jyl.base.*; 2import org.jyl.base.io.*; 3 4import java.io.*; 5import java.net.*; 6 7public class Test 8{ 9 public static void main( String[] args ) throws Exception 10 { 11/* long ms = System.currentTimeMillis(); 12 13 System.out.println( "timer start" ); 14 15 JylFileInput fileinput = new JylFileInput( "text.txt", CharCode.EUCJP ); 16 System.out.println( fileinput.getFileString() ); 17 18 System.out.println( "timer stop" ); 19 System.out.println( "time is " + ( System.currentTimeMillis() - ms ) + " ms" );*/ 20 21 Socket sc = new Socket( "localhost", 17713 ); 22 23 try{ 24 Thread.sleep( 15000 ); 25 }catch( Exception e ){} 26 27 sc.close(); 28 System.out.println( "closed:" + sc.isClosed() ); 29 } 30} 31

試したこと

JylServer のコンストラクタで bind を呼び出してみた(コメントアウト箇所)
->エラーが変わった

java.net.SocketException: Socket is not bound yet at java.net.ServerSocket.accept(ServerSocket.java:511) at org.jyl.base.io.socket.JylServer.waitConnect(JylServer.java:53) at org.jyl.base.io.socket.JylServer.run(JylServer.java:118) at java.lang.Thread.run(Thread.java:745)

ポート番号の変更
->変更後実行するも変わらず

netstat を使用してみた
->そのポートが使用されている様子はない

補足情報(FW/ツールのバージョンなど)

linux(Raspberry Pi)を用いています
また、一台のPCに二つのコマンドラインを用意し、それぞれサーバー(ServerTest)、クライアント(Test)で実行しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JylServer extends ServerSocket

ですのに,

new ServerSocket( port, maxque );

というのは変なはずですけれど...

super(port, maxque);

ではないかと思うのですが, 如何でしょうか.

投稿2019/03/09 14:30

jimbe

総合スコア12632

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

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

yukkuri

2019/03/09 14:34

確かに見落としていました... 基は継承してなかったので、その名残みたいなものでした。 直したところ、エラーが変わりました。 新しく出たエラーについて、調べたいと思います!
jimbe

2019/03/09 14:43

なぜわざわざ継承に変えられたのかが不思議に思います. ServerSocket の何かを変えているようにも見えません.
yukkuri

2019/03/09 14:45

たしかにそうですね... エラーは解決しましたが、もう少し構成を考えてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問