Open hiramekun opened 6 years ago
https://codezine.jp/article/detail/193
今回、クライアントは一つしか使わないので、基本的にシングルトンで実装します。 シングルトンとは、インスタンスを一つしか作らない実装方針のことです。 このサイトを見ると、シングルトンってなに?ってことがわかりやすいかと思います。 http://www.techscore.com/tech/DesignPattern/Singleton.html/
Socketを用いて、クライアントとサーバーは通信を行います。
ChatSender
に渡す。ChatReceiver
からの入力を受け取り、コンソール上に標準出力する。
サーバー側からのメッセージを受け取る。
サーバー側にメッセージを送信する。
ChatReceiver
, ChatSender
のIOExceptionの処理はどのクラスが持つか.import java.io.IOException;
import java.net.Socket;
class ChatSender {
private static ChatSender singleton = new ChatSender();
private ChatSender() {
}
static ChatSender getSender() {
return singleton;
}
// TODO: 2018/05/13 実装
void sendMessage(Socket socket, String message) throws IOException {
}
}
//送信するメッセージは以下の行に記述されているもの。
String message = "チャット接続送信テスト。";
PrintWriter writer = new PrintWriter(socket.getOutputStream());
System.out.println("送信メッセージ: " + message);
writer.println(message);
writer.close();
import java.io.IOException;
import java.net.Socket;
class ChatReceiver {
private static ChatReceiver singleton = new ChatReceiver();
private ChatReceiver() {
}
static ChatReceiver getReceiver() {
return singleton;
}
// TODO: 2018/05/13 実装
void waiteForMessage(Socket socket) throws IOException {
}
}
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
while (!socket.isClosed()) {
String line = reader.readLine();
System.out.println(line);
}
Yes, closing any Writer/Reader will close all other Writers and Readers that they wrap. Don't close it until you are ready to close the underlying socket.
以下は #1 からのコピペ
機能実装(クライアント)
chatlogin -to <ipaddress:port> -as <username>
コマンドで, クライアントはホストとのsocket通信を確立する. 現在のスレッドでは, stdinで入力を待つようにし, 別スレッドでsocketからのinputstreamを待ち, stdoutに出力するようにする.login <username>
という書式で, socketのoutputstreamに書き込む.send <message>
(他の人にメッセージをブロードキャストする)logout
(streamへの書き込みをしたのち, socket通信を終了する)