GithubHelp home page GithubHelp logo

cli_chat's People

Contributors

hiramekun avatar sanogit avatar sykwer avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

cli_chat's Issues

Specification

同一ネットワーク内で簡単なchatができるコマンドラインツール.

2018-05-10 16 56 52

Check possibility of communication via utokyo wifi

Client

//ChatClient.java
//チャットクライアントサンプルプログラム
//チャットサーバーが動いているコンピュータに対して
//接続を行う。
//コマンドラインパラメータとして接続先アドレスとポート番号を
//指定する。

class ChatClient {
    public static void main(String[] args) {
        try {
            InetSocketAddress socketAddress =
                    new InetSocketAddress(args[0], Integer.parseInt(args[1]));
            Socket socket = new Socket();
            socket.connect(socketAddress, 10000);

            InetAddress inetadrs;
            if ((inetadrs = socket.getInetAddress()) != null) {
                System.out.println("接続先: " + inetadrs);
            } else {
                System.out.println("接続失敗");
                return;
            }

            //送信するメッセージは以下の行に記述されているもの。
            String message = "チャット接続送信テスト。";
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            System.out.println("送信メッセージ: " + message);
            writer.println(message);

            writer.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Server

//ChatServer.java
//チャットサーバープログラム
//チャットクライアントプログラムからの接続を待つ。
//接続後は1行の文字列読み取りを行い、接続終了する。

class ChatServer {
    public static void main(String[] args) {
        try {
            // サーバーソケット作成
            //起動時パラメータからポートを読み取り、
            //そのポートで接続要求を待つ
            //ServerSocketクラスはクライアントからの接続を待ち、
            //srvSock.accept();によって接続したSocketオブジェクト
            //を返す。
            //その後の通信には、このSocketオブジェクトを使用する。

            System.out.println(InetAddress.getLocalHost().getHostAddress());

            int port = Integer.parseInt(args[0]);
            ServerSocket srvSock = new ServerSocket(port);

            // 接続待機。接続完了後、次行命令に移る。
            Socket socket = srvSock.accept();
            //接続先アドレスを表示
            System.out.println("接続先: " + socket.getInetAddress());

            //通信処理 
            //ソケットの入力ストリームから文字列を1行読み取る。
            BufferedReader reader = new BufferedReader
                    (new InputStreamReader(socket.getInputStream()));
            String line = reader.readLine();
            //読み取った文字列を表示
            System.out.println("受信メッセージ:" + line);

            //終了処理 このプログラムは1行読み取ったら終了する。
            //通信を続けるのであれば、reader.readLine();を
            //ループするが、終了コマンドをチェックする等の処理を
            //記述する。
            reader.close();
            socket.close();
            srvSock.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Additional specification

  • ログインした時に、ログインしているメンバー一覧がわかる
  • listでもわかる
  • send hogehoge n timesとか送るとn回送られる
  • send message to usernameでダイレクトメッセージを送れる
  • fire 炎が100個送られる
  • sushi 寿司がいっぱい送られる
  • username[time]: message
  • ログインしたらconsoleを新しくする
  • client側の色を含めたデザインととのえる
  • コマンドのexception handling(とくにoption)
  • optionも含めた, コマンドのhelp
  • logout, exitしたときの挙動が正しくない気がする
  • VM上でも動作するようにする

Client Specification

以下は #1 からのコピペ

機能実装(クライアント)

  • chatlogin -to <ipaddress:port> -as <username> コマンドで, クライアントはホストとのsocket通信を確立する. 現在のスレッドでは, stdinで入力を待つようにし, 別スレッドでsocketからのinputstreamを待ち, stdoutに出力するようにする.
    • socket通信が確立した直後に, login <username>という書式で, socketのoutputstreamに書き込む.
  • stdinに入力されたメッセージは, validationをした上で, そのままsocketのoutputstreamに書き込む.
    • validationは, 許可されているコマンドかを調べる.
      • send <message> (他の人にメッセージをブロードキャストする)
      • logout (streamへの書き込みをしたのち, socket通信を終了する)
  • 別スレッドで, socketからのinputstreamを受け取ったら, そのままstdoutに出力する.

Network checking

No matter where server is running, server process should be able to get the ip address that connects to wifi network.

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

public class NetworkListing {
  public static void main(String[] args) throws SocketException, IOException {
    Enumeration netItfs = NetworkInterface.getNetworkInterfaces();

    if (netItfs == null) {
      return;
    }

    while (netItfs.hasMoreElements()) {

      NetworkInterface ni = (NetworkInterface)netItfs.nextElement();

      if (ni.isLoopback() || !ni.isUp() || ni.isPointToPoint() || ni.isVirtual()) {
        continue;
      }

      System.out.println("-------------------------------");

      System.out.println(ni.getDisplayName());

      Enumeration<InetAddress> addrs = ni.getInetAddresses();

      while (addrs.hasMoreElements()) {
        InetAddress addr = addrs.nextElement();

        if (addr instanceof Inet6Address || !addr.isReachable(1000)) {
          continue;
        }

        System.out.println("--------");

        System.out.println(addr.isSiteLocalAddress());
        System.out.println(addr.getHostAddress());
      }
    }
  }
}

Server minimum specification

Skelton

public class ChatServer {
  private static ChatServer app;

  public static ChatServer getApp() {
    if (app == null) {
      app = new ChatServer();
      return app;
    }

    return this.app;
  }

  private ArrayList<ClientServant> clientServants;
  private ServerSocket serverSocket;

  private void ChatServer();

  public void start() {
    this.serverSocket = new ServerSocket(port);

    while (!this.serverSocket.isClosed()) {
      Socket clientSocket = this.serverSocket.accept();

      ClientServant cs = new ClientServant(clientSocket);
      this.clientServants.add(cs);

      cs.start();
    }
  }

  public static void main(String[] args) {
    ChatServer.getApp().start();
  }
}

class ClientServant extends Thread {
  private Socket clientSocket;
  private String username;
  private ChatServer server = ChatServer.getApp();

  public void ClientServant(Socket socket) {
    this.clientSocket = socket;
  }

  public void run() {
    InputStream is = this.clientSocket.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    while (!this.clientSocket.isClosed()) {
      String[] msg = reader.readLine().split(" ", 2);
      handleCommand(msg[0], msg[1]);
    }
  }

  private void handleCommand(String cmd, String value) {
    // call sendMsg() or logout() or login()
  }

  private void broadcastMsg(String username, String msg) {
  }

  private void logout();

  private void login(String username);

  // ------------------------------------------------------

  private void sendString(String str) {
    try {
      OutputStream os = this.clientSocket.getOutputStream();
      // TODO: write to output stream
    } catch (Exception err) {
    }
  }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.