ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのチャットの機能について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんな課題が出ました! 

 メッセージの日時をサーバーが追加して送る

 入会・退会時にサーバーは情報を送る(xxさんが加わりました)

 サーバーは要求に応じてメンバー一覧を送る
 
 サーバーはメッセージをファイルに記録する
 
 メッセージを検索する
 
 特定の人だけにメッセージを送る

 その他、提案して下さい



Java初心者で全くわかりません涙

何を変えて何を使えばそれらの機能を追加できますか??
教えてくださいあせあせ(飛び散る汗)


//ChatClient.java//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*; // InputStream, BufferedReader, InputStreamReader etc
import java.net.*; // URL, Socket, UnknownHostException








class Frame1 extends JFrame implements Runnable {
//JFrame:Javaのウインドウを生成する基本クラス
//Runnable:スレッドを組み込むインターフェース

private JPanel contentPane;//GUI部品を貼り付けるパネル
private TextField InputField = new TextField();//行入力
private TextArea DisplayArea = new TextArea();//チャト表示
private Button QuitButton = new Button();//終了ボタン
private Button SendButton = new Button();//送信ボタン

Thread thread; // スレッドを定義
Socket socket; // ソケットを定義
String Name = null; // 名前
BufferedReader NetInput; // ネットワーク経由入力
PrintStream NetOutput; //ネットワーク出力
String message;

private TextField IPField = new TextField();//IP入力
private Button loginButton = new Button();//ログインボタン

//フレームのビルド
public Frame1() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

//コンポーネントの初期化
private void jbInit() throws Exception {
//クライアントウインドウのサイズとタイトルを設定
this.setSize(new Dimension(500, 300));
this.setTitle("チャットウインドウ");

//フレームから部品を置くcontentPaneを取得する
contentPane = (JPanel) this.getContentPane();//
contentPane.setLayout(null);//自動レイアウトは使用しない

//メッセージ記入欄
InputField.setBackground(Color.cyan);
InputField.setText("最初は名前");
InputField.setBounds(new Rectangle(17, 38, 374, 23));

//受信メッセージを表示する欄
DisplayArea.setBackground(Color.yellow);
DisplayArea.setBounds(new Rectangle(15, 66, 473, 213));

//Quitボタン
QuitButton.setEnabled(false);
QuitButton.setLabel("退出");
QuitButton.setBounds(new Rectangle(415, 9, 61, 23));
//quitボタンを処理する関数の設定
QuitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
QuitButton_actionPerformed(e);
}
});

//送信ボタン
SendButton.setEnabled(false);
SendButton.setLabel("送信");
SendButton.setBounds(new Rectangle(411, 37, 63, 23));
//sendボタンを処理する関数の設定
SendButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
SendButton_actionPerformed(e);
}
});

//IP記入欄とログインボタン
IPField.setText("127.0.0.1");
IPField.setBounds(new Rectangle(74, 10, 174, 21));
loginButton.setLabel("入場");
loginButton.setBounds(new Rectangle(299, 10, 68, 21));
//loginボタンを処理する関数の設定
loginButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
loginButton_actionPerformed(e);
}
});

//GUI部品を登録する
contentPane.add(DisplayArea, null);
contentPane.add(SendButton, null);
contentPane.add(InputField, null);
contentPane.add(loginButton, null);
contentPane.add(IPField, null);
contentPane.add(QuitButton, null);
}

//サーバーへの接続とソケット作成
//loginボタンで実行する
void makeSocket(){
try {

//URL homeURL = getCodeBase( ); // 基本URL/
//String host = "127.0.0.1"; // ホスト名
String host=IPField.getText();
int port = 8004; // 送受信のポート番号
try {
socket = new Socket(host, port); // ストリームソケット生成
} catch (Exception e) {
DisplayArea.append("接続に失敗しました \n");
}

// ソケットから入力ストリームを作成
InputStream inputstream = socket.getInputStream( );
// 入力ストリームから行単位に文字入力できるバッファドリーダを作成
NetInput = new BufferedReader(new InputStreamReader(inputstream));

// ソケットから出力ストリームを作成
OutputStream outputstream = socket.getOutputStream( );
// 出力ストリームからデータ出力ストリーム作成
NetOutput = new PrintStream(outputstream);

thread = new Thread(this); // 受信用スレッド生成
thread.start( ); // スレッド実行開始、run()の実行を開始
} catch(Exception e) {
System.out.println(e);
}
}

//ウィンドウが閉じられたときに終了する処置
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);//終了
}
}

//受信処理を行うスレッドの実行、
//先頭の"T"を確認し、DisplayAreaに表示
//スレッドにしないと、readLine( )で受信完了するまで、frameの処理が中断される
public void run( ) {
String message;
try {
while ((message = NetInput.readLine( )) != null) {
if ((message.substring(0,1)).equals("T"))
DisplayArea.append(message.substring(2) + "\n");
}
} catch(Exception e) {
System.out.println(e);
}
}


// 停止処理 終了ボタンから呼び出される
public void stop( ) {
NetOutput.println("quit"); // 終了メッセージ送信
NetOutput.flush( ); // バッファ内データを強制的に出力

try {
thread.sleep(3000); // 終了メッセージの送信完了待ち
} catch (InterruptedException e) {
System.out.println(e);
}

try {
NetInput.close( ); // ストリームクローズ
NetOutput.close( );
socket.close( ); // ソケットクローズ
} catch (Exception e) {
System.out.println(e);
}
thread = null; // スレッドを無効に
}

//送信ボタン処理
void SendButton_actionPerformed(ActionEvent e) {

message = InputField.getText( );//文字を読む
if (message == null)
return;
if (Name == null) {//最初の送信の場合messageを名前にする
Name = message;
}
NetOutput.println(message); // ネットワーク経由でmesage出力
System.out.println("action:"+message);
NetOutput.flush( ); // バッファ内データを強制的に出力
InputField.setText("");
}

//終了ボタン処理
void QuitButton_actionPerformed(ActionEvent e) {
SendButton.setEnabled(false); // 送信ボタンを不可
QuitButton.setEnabled(false); // 退出ボタンを不可
stop( );
}

//ログインボタン処理
void loginButton_actionPerformed(ActionEvent e) {
makeSocket(); //ソケット作成
SendButton.setEnabled(true);
QuitButton.setEnabled(true);
}

}
//Frame1

public class ChatClient {

//Main メソッド
public static void main(String[] args) {
Frame1 frame = new Frame1();//チャット用ウインドウを作成する
frame.setVisible(true);
}
}
//class



//chatserver.java//
//oirginal 林 正幸:Java サンプルプログラム集、共立出版

import java.net.*; // Socket, ServerSocket
import java.io.*; // InputStream, BufferedReader, InputStreamReader,
import java.awt.*;
import java.util.*;


public class ChatServer {
int MAX = 50; // 最大接続数
int chatPort=8004; //ポート番号
ChatService chatclient[ ]= new ChatService[MAX]; // チャットクラス配列
Thread chatThread[ ] = new Thread[MAX]; // クライアントとの入出力スレッド
String Member[ ] = new String[MAX]; // 参加者名

// メイン処理 -----------------------------
public static void main(String args[ ]) {

ChatServer obj = new ChatServer( ); // ChatServerの生成
obj.chatprocess( ); // チャット処理開始
}

// チャット処理 -------------------------------
void chatprocess( ){
try {
// 指定ポートでサーバソケット作成
ServerSocket serversocket = new ServerSocket(chatPort);
System.out.println("ServerSocket=" + serversocket);//表示

while (true) { //クライアントからの接続要求の処理を行う
int p;
for (p = 0; p < MAX; p++){ // 接続チェック
if (chatclient[p] == null) // 空いている場合
break;
}
if (p == MAX) // 空いていない場合
continue; // 以下の処理をしない

Socket socket = serversocket.accept( ); // クライアントからの接続を待つ

//クライアントに応対するスレッドを作成し、処理を任せる
chatclient[p] = new ChatService(socket, this, p);
chatThread[p] = new Thread(chatclient[p]);
chatThread[p].start( ); // スレッドスタート
}
}catch(Exception e) { // ソケット作成失敗
System.out.println("check point 1 : " + e);
}
}


// チャット終了 ----------
void chatquit(int clientnumber) {
chatclient[clientnumber] = null; // 空きにする
chatThread[clientnumber] = null; //
}

// 入室処理 -------
void entermember(String name, int clientnumber) {
Member[clientnumber] = name; // メンバーに名前を登録
}

// 退出処理 ------
void exitmember(int clientnumber) {
Member[clientnumber] = null; // メンバー削除
}

// テキスト送信 --------
synchronized void sendalltext(String message) { // 排他的に同期をとって送信
for (int i = 0; i < MAX; i++) { // 全員に送る
if (chatclient[i] != null) { // 接続されている場合
chatclient[i].sendMessage("T:" + message);// i番目のクライアントに送信
}
}
}

// メンバー一覧送信 --------
synchronized void sendallmember( ) {
String message = "M:"; // メンバー作成
for (int i = 0; i < MAX; i++) {
if (Member[i] != null) // 現在,参加している場合
message = message + Member[i] + ":";// メンバーの名前を付加
}
for (int i = 0; i < MAX; i++) { // 全員に送る
if (chatclient[i] != null && Member[i] != null) {
chatclient[i].sendMessage(message);// i番目のクライアントにメンバー送信
}
}
}

}

// クライアントの管理クラス
class ChatService implements Runnable {

BufferedReader NetInput; // ネットワーク入力
PrintStream NetOutput; // ネットワーク出力
Socket socket; // クライアントとの通信用ソケット
ChatServer chatserver; // ChatServerを記録
int clientnumber; // クライアント番号

// コンストラクタ
ChatService(Socket socket, ChatServer chatserver, int clientnumber) {
// 引数の値をこのクラスの変数にセット
this.socket = socket;
this.chatserver = chatserver;
this.clientnumber = clientnumber;

try {

// ソケットから入力ストリームを作成
InputStream inputstream = socket.getInputStream( );
// 入力ストリームからバッファドリーダを作成
NetInput = new BufferedReader(new InputStreamReader(inputstream));

// ソケットから出力ストリームを作成
OutputStream outputstream = socket.getOutputStream( );
// 出力ストリームからデータ出力ストリーム作成
NetOutput = new PrintStream(outputstream);
System.out.println("new Client"+socket);

} catch(Exception e) { // 例外処理
System.out.println("->" + e);
}
}

// メッセージ送信 ----------------------
public synchronized void sendMessage(String message) {
NetOutput.println(message); // スレッドが応対するクライアントに送信
NetOutput.flush( ); // バッファ内のデータを強制的に送信
}

// スレッド実行 クライアントとの情報交換をする
public void run( ) {
String name = null; // 名前
String sendmessage = null; // 送信メッセージ記録用

try {
while (true) {
sendmessage = NetInput.readLine( ); // クライアントからのメッセージ受信
System.out.println(sendmessage);
if (sendmessage.equals("quit")) { // quitの場合
chatserver.sendalltext( name +"さん退場!");
chatserver.exitmember(clientnumber); // メンバー退出処理
//chatserver.sendallmember( ); // 新メンバー一覧送信
stop( ); // チャット終了
break;
} else if (name == null) { // 名前が未設定の場合
name = sendmessage; // 受信メッセージを名前とする
chatserver.entermember(name, clientnumber); // メンバー登録
chatserver.sendalltext( name +"さん入場!");
//chatserver.sendallmember( ); // 新メンバー一覧送信
} else {//メッセージを全員に送る
Calendar cal = Calendar.getInstance();//実行した時点の時・分・秒などの時間を取得
int h = cal.get(Calendar.HOUR);
int m = cal.get(Calendar.MINUTE);
int s = cal.get(Calendar.SECOND);
chatserver.sendalltext("<" + name + "> " + sendmessage + " "+h+"時"+m+"分"+s+"秒");
}
}
} catch(Exception e) { // 例外処理
System.out.println("check point 4 : " + e);
}
}

// チャット終了処理
public void stop( ) {
try {
NetInput.close( ); // ネット経由入力ストリームクローズ
NetOutput.close( ); // ネット経由出力ストリームクローズ
socket.close( ); // ソケットクローズ
} catch (Exception e) { // 例外処理
System.out.println(e);
}
chatserver.chatquit(clientnumber); // 退出処理をする
}



}//class





コメント(0)

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング