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

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

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

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

ソケット

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

Q&A

解決済

1回答

3272閲覧

Javaの自作クラスを使ったSocket通信のエラーについて

wageshII

総合スコア4

Java

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

ソケット

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

0グッド

0クリップ

投稿2020/04/26 05:49

編集2020/04/26 06:12

このクラスを使って送受信をするとエラーが吐かれます
server側でObjectを受信しているのですが、nullを受信してしまいます
socket通信は一つのソケットで送受信両方とも行うのは問題になるのでしょうか?

コンソールではこのような文章が繰り返し表示されます。
server側で発生することもあればclient側で発生することもあります

start readObject java.io.EOFException at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3117) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1597) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) at PaffeLibrary_Type_GameBase/Server.Communication.run(Communication.java:57) at java.base/java.lang.Thread.run(Thread.java:830)

以下ソースコードです
ServerCommandクラスはSerializableを実装しています。
BaseSettingManagerはフラグや名前などの管理をしています。

public class Communication implements Runnable{ private boolean close_flg = false; private String issuer_name = ""; private List<ServerCommand> inputs = new ArrayList<>(); private ObjectInputStream in = null; private ObjectOutputStream out = null; private Socket sock = null; public Communication(Socket sock,String name) { this.issuer_name = name; try { if(sock != null) { this.sock = sock; new Thread(new InputStreamHelper()).start(); new Thread(new OutputStreamHelper()).start(); Thread.sleep(10000); new Thread(this).start(); } }catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { while(!close_flg) { if(in != null) { try { System.out.println("start readObject"); // ここのreadObjectでエラーが出るjava.io.EOFException ServerCommand input = (ServerCommand)in.readObject(); System.out.println("end readObject"); inputs.add(input); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } public List<ServerCommand> hereInputsCommand(){ List<ServerCommand> return_list = this.inputs; this.inputs = new ArrayList<>(); if(return_list.size() > 0) { return return_list; }else { return null; } } public void sendServerCommand(List<Command> send_commands) { try { ServerCommand send_command = new ServerCommand(issuer_name,null,null); for(Command i : send_commands) { send_command.setSubCommand(i); } this.out.writeObject(send_command); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void close() { try { in.close(); out.close(); sock.close(); this.close_flg = true; BaseSettingManager.changeSettings("communication_flg", false); System.out.println("socket close"); } catch (IOException e) { e.printStackTrace(); } } public void closeAndSendCloseCommand() { try { ServerCommand send_command = new ServerCommand( issuer_name, null, null ); send_command.setSubCommand( new ServerCommand( "close", null, null) ); this.out.writeObject(send_command); System.out.println("send to close_command"); } catch (IOException e) { e.printStackTrace(); } this.close(); } public class InputStreamHelper implements Runnable{ @Override public void run() { try { in = new ObjectInputStream(sock.getInputStream()); } catch (IOException e1) { e1.printStackTrace(); } } } public class OutputStreamHelper implements Runnable{ @Override public void run() { try { out = new ObjectOutputStream(sock.getOutputStream()); } catch (IOException e1) { e1.printStackTrace(); } } } public String getName() { return issuer_name; } public void setName(String name) { this.issuer_name = name; } public boolean getCloseFlg() { return this.close_flg; } }

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

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

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

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

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

y_waiwai

2020/04/26 05:59

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
wageshII

2020/04/26 06:02

使い方がわかっておらずすみません 了解です編集してきます
m.ts10806

2020/04/26 06:10

エラーの方も出来れば。 本文とそれ以外はなるべくわけてあったほうが読みやすいです。
wageshII

2020/04/26 06:11

了解です、編集してきます
退会済みユーザー

退会済みユーザー

2020/04/26 06:20

In と outを設定しているコードは?
退会済みユーザー

退会済みユーザー

2020/04/26 06:22

言い方が悪いか、設定しているコードで例外発生しても継続してますが
wageshII

2020/04/26 06:30

設定ってことはインスタンスを代入することですか? それであれば、一番下のメソッド3つの上にin,outそれぞれ専用のクラスを用意してます それ以外の意味でしたら、ごめんなさい、よく分からないです
wageshII

2020/04/26 12:13

ごめんなさいサーバー、クライアント両方でclose()メソッドを呼ぶのをやめたら エラーは吐かれなくなりました、 しかし、Objectは受信できず受け取れるのはnullのままでした
wageshII

2020/04/26 13:03

ごめんなさい、全く関係ないところでの、型変換ミスでした お騒がせしてすみませんでした 皆様ありがとうございました 一応解決したのでその時のソースを置いときます
退会済みユーザー

退会済みユーザー

2020/04/26 13:05

自己解決の回答してあげてあげてね
wageshII

2020/04/26 13:20

あ、了解です、ありがとうございました
guest

回答1

0

自己解決

以下解決時のコードです、それぞれ、原因は、
受け取ったObjectがnullだったのは、
List<ServerCommand>にしてもらってたのをServerCommand型に変換していたせいでした
エラーが吐かれてたのは、
もうすでに閉じられていた、socketで通信していたからでした
お騒がせしてすみませんでした
助けていただいた皆様ありがとうございました

public class Communication implements Runnable{ private boolean close_flg = false; private String issuer_name = ""; private List<ServerCommand> inputs = new ArrayList<>(); private ObjectInputStream in = null; private ObjectOutputStream out = null; private Socket sock = null; public Communication(Socket sock,String name) { this.issuer_name = name; try { if(sock != null) { this.sock = sock; new Thread(new InputStreamHelper()).start(); new Thread(new OutputStreamHelper()).start(); Thread.sleep(10000); new Thread(this).start(); } }catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { while(!close_flg) { //変更箇所1 close_flg = true; if(in != null) { try { System.out.println("start readObject"); // ここのreadObjectでエラーが出るjava.io.EOFException、原因もうsocketが閉じていたため ServerCommand input = (ServerCommand)in.readObject(); System.out.println("end readObject"); inputs.add(input); //変更箇所2 close_flg = false; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } this.close(); } public List<ServerCommand> hereInputsCommand(){ List<ServerCommand> return_list = this.inputs; this.inputs = new ArrayList<>(); if(return_list.size() > 0) { return return_list; }else { return null; } } public void sendServerCommand(List<Command> send_commands) { try { ServerCommand send_command = new ServerCommand(issuer_name,null,null); for(Command i : send_commands) { send_command.setSubCommand(i); } this.out.writeObject(send_command); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void close() { try { in.close(); out.close(); sock.close(); this.close_flg = true; BaseSettingManager.changeSettings("communication_flg", false); System.out.println("socket close"); } catch (IOException e) { e.printStackTrace(); } } public void closeAndSendCloseCommand() { try { ServerCommand send_command = new ServerCommand( issuer_name, null, null ); send_command.setSubCommand( new ServerCommand( "close", null, null) ); this.out.writeObject(send_command); System.out.println("send to close_command"); } catch (IOException e) { e.printStackTrace(); } this.close(); } public class InputStreamHelper implements Runnable{ @Override public void run() { try { in = new ObjectInputStream(sock.getInputStream()); } catch (IOException e1) { e1.printStackTrace(); } } } public class OutputStreamHelper implements Runnable{ @Override public void run() { try { out = new ObjectOutputStream(sock.getOutputStream()); } catch (IOException e1) { e1.printStackTrace(); } } } public String getName() { return issuer_name; } public void setName(String name) { this.issuer_name = name; } public boolean getCloseFlg() { return this.close_flg; } }

投稿2020/04/26 13:12

wageshII

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問