第6章 インターネットアプリケーション

第6章 インターネットアプリケーション
6.1
6.2
6.3
6.4
6.5
インターネットアプリケーション
Javaによるネットワーク処理
電子メール
Webアプリケーション
チャットアプリケーション
6.5 チャットアプリケーション
6.5.1 チャットアプリケーションの仕組み
(1)TCPの利用
■ ひとつのチャットサーバと複数のチャットクライアント
[送信端末]
チャットクライアント
チャットサーバ
チャットクライアント
チャットクライアント
(2)UDPの利用
■ すべてチャットクライアント
チャットクライアント
チャットサーバ機能
チャットクライアント機能
チャットクライアント
チャットクライアント
チャットサーバ機能
チャットサーバ機能
チャットクライアント機能
チャットクライアント機能
6.5.2 TCPを利用したチャットアプリケーション
(1)チャットサーバの実現(その1 /3 )
■ サーバは,チャットクライアントから受取ったメッセージを,コネクションが確立してい
る他のチャットクライアントに送信する。
[ChatServerクラス]
import java.io.*;
import java.net.*;
import java.until.*;
private class ChatServer{
private static final int port = 6000; // ポート番号
private static void main(String [] args) {
try{
ServerSocket serverSocket = new SeverSocket(port);
while(true) {
Socket cs = serverSocket.accept();
ClientConnection connection = new ClientConnection(cs);
}
} catch(IOException e){}
}
}
[クライアントコネクションをスレッドとする]
チャットサーバの実現(その2 /3 )
class ClientConnection extends Thread{
private Socket socket;
private BufferedReader in; private BufferedWriter out;
static Vector members;//複数クライアントのコネクション
Vector ClientConnection(Socket s){//クライアントコネクションのコンストラクタ
socket = s;
if(members == null) members = new Vector();
members.add(socket);
try{
in = new BufferedReader( // ソケットからストリームを取り込む
new InputStreamReader(socket.getInputStream()));
} catch(IOException e) {}
}
public void run(){
try { while(true){ // メッセージをコンソールに出力
String message = in.readLine(); writeMessageAll(message + "\n");
System.out.println(message);
if(message.equals("Bye")){
socket.close(); // 「Bye」の入力により切断
break;
}
}
} catch(IOException e){}
}
チャットサーバの実現(その3/3)
[すべてのクライアントにメッセージを転送する]
public void writeMessageAll(String message){
Socket soc = null;
for(Enumeration em = members.elements(); em.hasMoreElements();){
soc =(Socket)em.nextElement();
try {
BufferedWriter bw = new BefferedWriter(
new OutputStream Writer(soc.getOutputStream()));
bw.write(message);
bw.flush();
} catch(IOException e) {}
}
}
(2)チャットクライアントの実現
■ TCPコネクションのプログラムで代用できるが,キーボードから入力されたものを出
力ストリームに出力するようにする。
[ChatServerクラス]
public void run(){
try {
while(true) {
String keyLine = keyin.readLine();
BufferedWriter bw
= new BufferedWriter(
new OutputStream writer(serverSocket.getOutputStream()));
bw.write(keyLine);
bw.flush();
} catch(IOException e){}
}
(3)チャットの実行例
■ 1つのサーバと2つのクライアント
>java ChatServer
Hello!
Hi
④Hi
>java TCPClient
Hello!
Hi
①Hello! ②Hello!
③Hi
>java TCPClient
Hello!
Hi
6.5.3 UDPを利用したチャットアプリケーション
(1)メッセージ送信機能の実現
■ データパケットを作成して,マルチキャストソケットに送信する(sendメソッド)
■IPアドレスは,マルチキャストグループのIPアドレス,ポート番号を送る。
■データグラムの生存期間(TTL : Time To live)はデフォルト1。
■ルータを超えたマルチキャスト通信を行わなければ,TTL はデフォルトのままでい
いが,変えるには SetTimeToLive メソッドを用いる。
メッセージ送信クラス
[コンソールから入力した文字列をマルチキャストグループに送信]
import java.net.*
public class MessageSend extends Thread {
MulicastSocket ms; InetAddress inetAddr; int port;
byte[] buff = new byte[1024];//送信データ
MessageSend(MulticastSocket msocket, InetAddress mgroup, int port_number){
ms = msocket; inetAddr = mgroup; port = port_number;
}
public void run(){
try { while(true){
int n = System.in.read(buff, 0, buff.length);
if(n > 0){
DatagramPacket dp = new DatagramPacket(buff, n, inetAddr, port);
ms.send(dp);
} else break;
}
} catch(IOException e){e.printStackTrace(); System.exit();}
}
}
(2)メッセージ受信機能の実現
■ メッセージをDatagramPacket オブジェクトとして受信する(receive メソッド)
■ DatagramPacket オブジェクトには,受信データのほかに送信先のIPアドレスと
ポート番号が格納されている。
■ receive メソッドはデータグラムが受信するまで入出力ブロックを行うので,スレッド
として実装する必要がある。
メッセージ受信クラス
[受信したメッセージをコンソールに出力]
import java.net.*
public class MessageReceive extends Thread {
MulicastSocket ms;
byte[] buff = new byte[1024];//受信データ
MessageReceive(MulticastSocket msocket){
ms = msocket;
}
public void run(){
try { while(true){
DatagramPacket recv
= new DatagramPacket(buff, buff.length);
ms.receive(recv);
if(recv.getLength() > 0) System.out.write(buff, 0, recv.getLength());
}
} catch(IOException e){e.printStackTrace(); System.exit();}
}
}
(3)チャットアプリケーション
■ メッセージ送信機能とメッセージ受信機能を併せ持った機能を作成する。
■ 送受信ともスレッドとして実行されるクラスなので,MulticastSocket オブジェクトは
送受信で共有されるようにする。
送受信の実行
[コンソール入力をマルチキャストとして送り,受信したメッセージをコンソールに出力]
import java.net.*
public class ChatApp{
public static void main(String[] args){
String multicastAddress="224.0.0.1";
int port = 7000;
try { InetAddress group
= InetAddress.getByName(multicastAddress);
MulticastSocket msocket = new MulticastSocket(port);
// マルチキャストグループに参加
msocket.joinGroup(group);
// 送信スレッド開始
MessageSend ms = new MessageSend(msocket, group, port);
ms.start();
// 受信スレッド開始
MessageReceive mr = new MessageReceive(msocket);
mr.start();
}
} catch(IOException e){}
}
}
(4)実行例
■ 3つの ChatApp を起動
Client 1
>java ChatApp
Hello!
Hello!
Hi
Client 2
>java ChatApp
Hello!
Hi
Hi
Client 3
>java ChatApp
Hello!
Hi