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

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

Javaの課題丸投げコミュのCHATソフト作成

  • mixiチェック
  • このエントリーをはてなブックマークに追加
卒業研究:JAVAでCHATソフトを作る。

なのですが経験は学校での勉強20時間のみ。
本を見てなんとかTCPでの簡易通信ができるようにし、
チームのメンバが作った文字を入力して送信ボタンを押すとデータを通信部分に引き渡すプログラムを合わせたところ、エラー続出で何がなにやら・・・となってしまいました。
初心者丸出しな記述で申し訳ないのですが、
・送信ボタンが押されるまで受信待ちのような状態にしておく方法
・txt1に入っているテキストエリアの文字をbuffに渡す方法
がわかる方宜しくお願いします。



//サーバ
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class textfield extends Applet implements ItemListener, ActionListener {
TextArea txt1;//テキストエリア
TextArea txt2;//テスト用テキストエリア
Button btn1, btn2;//ボタン
Checkbox cbx_B, cbx_I;//チェックボックス(B、I、U)
Choice cho_color, cho_font, cho_size;//チョイス(色、フォント、サイズ)
int flg1 = 0;//ボールド、イタリックの判定フラグ
/* テキストエリア・ボタン・チョイス・チェックボックス設定 */
public void init(){

setLayout(new FlowLayout(FlowLayout.LEFT, 1, 1));//レイアウト左寄せ

cho_color = new Choice(); //チョイスの項目設定
cho_color.add("色");
cho_color.add("ブラック");
cho_color.add("レッド");
cho_color.add("ブルー");
cho_color.add("グリーン");
cho_color.add("イエロー");
cho_color.add("シアン");
cho_color.add("オレンジ");
cho_color.add("ピンク");
cho_color.addItemListener(this);
add(cho_color);

cho_font = new Choice(); //チョイスの項目設定
cho_font.add("フォント");
cho_font.add("Serif");
cho_font.add("ゴシック");
cho_font.add("ms 明朝");
cho_font.addItemListener(this);
add(cho_font);

cho_size = new Choice(); //チョイスの項目設定
cho_size.add("サイズ");
cho_size.add("10");
cho_size.add("15");
cho_size.add("20");
cho_size.addItemListener(this);
add(cho_size);

cbx_B = new Checkbox("ボールド"); //チェックボックス作成
cbx_B.addItemListener(this);
add(cbx_B);

cbx_I = new Checkbox("イタリック");//チェックボックス作成
cbx_I.addItemListener(this);
add(cbx_I);

txt2 = new TextArea("", 4, 60, TextArea.SCROLLBARS_NONE); //テキストエリアの設定
add(txt2);

txt1 = new TextArea("", 4, 60, TextArea.SCROLLBARS_NONE); //テキストエリアの設定
txt1.setForeground(Color.black);
add(txt1);


btn1 = new Button("送信"); //ボタンの設定
btn1.addActionListener(this);
add(btn1);
btn2 = new Button("全削除");
btn2.addActionListener(this);
add(btn2);

}

public static void main(String args[]) {
textfield txts = new textfield(); //?
byte buff[] = new byte[65536]; //cl側からコピー、クライアントからのデータ受信用要素
boolean loop = true; //バッファ試験用ループ(後に受信待ちに使う?

try {
ServerSocket svsock = new ServerSocket(53); //ソケットオブジェクト作成
Socket sock = svsock.accept( ); //クライアントからの接続要求待機、要求がきた先着一名と確立

if(sock != null ){System.out.println("-----");} //接続視認、サーバ側表示テスト

PrintWriter out = new PrintWriter(sock.getOutputStream(),true); //クライアントへの送信経路を確立
while( loop == true ){ //クライアントが接続してる間は?
if( txts != null ){
out.println(txts); //ストリームを出力ファイルとして扱う(つまり相手に送る文字列
}
}

//cl側からコピー,クライアントからの会話受信
InputStream in = sock.getInputStream(); //クライアントからの受信経路を確立
int n = in.read(buff); //受信経路からのデータ読み込み
System.out.println("クライアントから"); //printlnはDOSプロンプトに文字列を出力
System.out.write(buff,0,n); //データ表示(DOSプロンプト
System.out.println("を取得しました");
//ここまで

sock.close(); //ソケットクローズ
} catch (Exception e) {
System.out.println("例外 " + e + " が発生しました");//エラー時の反応
}
}
public void itemStateChanged(ItemEvent e){
Checkbox cbx = (Checkbox)e.getSource();//選択したチェックボックス

/* 書体変更 */
if(cbx == cbx_B){ //Bを選ぶと+1、解除で−1する
if(cbx_B.getState() == true){
flg1 = flg1 + 1;
}else if(flg1 >= 1){
flg1 = flg1 - 1;
}else{
}
}
if(cbx == cbx_I){ //Iを選ぶと+2、解除で−2する
if(cbx_I.getState() == true){
flg1 = flg1 + 2;
}else if(flg1 >= 2){
flg1 = flg1 - 2;
}
}

if(flg1 == 3){ //BとIが同時に選ばれると+3となる
txt1.setFont(new Font("Dialog",Font.BOLD|Font.ITALIC,12));
}else if(flg1 == 1){ //Bのみが選ばれると+1となる
txt1.setFont(new Font("Dialog",Font.BOLD,12));
}else if(flg1 == 2){ //Iのみが選ばれると+2となる
txt1.setFont(new Font("Dialog",Font.ITALIC,12));
}else{ //どちらも選ばれない場合(flg1=0の時)
txt1.setFont(new Font("Dialog",Font.PLAIN,12));
}

/* 文字色変更 */
if(e.getItemSelectable() == cho_color){
if( cho_color.getSelectedItem() == "ブラック" ){ //選択した項目と各項目の比較
//txt1.setText(cho_color.getSelectedItem());
txt1.setForeground(Color.black); //前景色に色をセット
}else if( cho_color.getSelectedItem() == "レッド" ){
txt1.setForeground(Color.red);
}else if( cho_color.getSelectedItem() == "ブル−" ){
txt1.setForeground(Color.blue);

}else if( cho_color.getSelectedItem() == "グリーン" ){
txt1.setForeground(Color.green);
}else if( cho_color.getSelectedItem() == "イエロー" ){
txt1.setForeground(Color.yellow);
}else if( cho_color.getSelectedItem() == "シアン" ){
txt1.setForeground(Color.cyan);
}else if( cho_color.getSelectedItem() == "オレンジ" ){
txt1.setForeground(Color.orange);
}else if( cho_color.getSelectedItem() == "ピンク" ){
txt1.setForeground(Color.pink);
}
}
}

public void actionPerformed( ActionEvent e ){

Button btn = (Button)e.getSource(); //クリックしたボタン

/* 送信・削除 */
if(btn == btn1){
/* 送信・初期化(文字削除) */
txt2.setText(txt1.getText()); //テストデータ反映用
// txt2 = txt1; //送信用(コメント表記)
txt1.replaceRange("", 0, 10000);//置換処理による削除
}else if(btn == btn2){
/* 全削除 */
txt1.replaceRange("", 0, 10000);//置換処理による削除
}
/*フォーカスを戻す*/
txt1.requestFocusInWindow();

}

public void paint (Graphics g){
update(g);
}

public void update (Graphics g){
}
}

コメント(8)

一応HTMLソースも張っておきます。

<HTML>
<HEAD>
<TITLE>textfield</TITLE>
</HEAD>
<BODY BGCOLOR="#ffffff">
<BR>
<APPLET CODE="textfield.class" WIDTH=450 HEIGHT=800>
<p></p>
</APPLET>
<BR>
</BODY>
</HTML>
・txt1に入っているテキストエリアの文字をbuffに渡す方法

・txt1に入っているテキストエリアの文字をtxtsに渡す方法
でした、すみません。
>あちゅやさん
まだ説明説明が足りなかったようでスミマセン。
えーとですね、アプレット勉強させられた状態だけで作れと言われ、なんとか組み上げた結果がこれでして。

1:1で片方にサーバ側ソケット、もう片方にクライアント側のソケットを書く形で作った結果がコレです。

//サーバ

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

public class sv {
public static void main(String args[]) {
byte buff[] = new byte[65536]; //cl側からコピー、クライアントからのデータ受信用要素
boolean loop = true; //バッファ試験用ループ(後に受信待ちに使う?

try {
ServerSocket svsock = new ServerSocket(8080); //ソケットオブジェクト作成
Socket sock = svsock.accept( ); //クライアントからの接続要求待機、要求がきた先着一名と確立

if(sock != null ){System.out.println("-----");} //接続視認、サーバ側表示テスト

PrintWriter out = new PrintWriter(sock.getOutputStream(),true); //クライアントへの送信経路を確立
out.println("文章 "); //ストリームを出力ファイルとして扱う(つまり相手に送る文字列


InputStream in = sock.getInputStream(); //クライアントからの受信経路を確立
int n = in.read(buff); //受信経路からのデータ読み込み
System.out.println("クライアントから"); //printlnはDOSプロンプトに文字列を出力
System.out.write(buff,0,n); //データ表示(DOSプロンプト
System.out.println("を取得しました");

sock.close(); //ソケットクローズ
} catch (Exception e) {
System.out.println("例外 " + e + " が発生しました");//エラー時の反応
}
}
}

//クライアント
import java.net.*;
import java.io.*;
class cl {
public static void main(String args[]) {
byte buff[] = new byte[65536];
try {
Socket sock = new Socket("127.0.0.1",8080); //接続先IPとポートの指定(ソケット作成
InputStream in = sock.getInputStream(); //サーバ受信経路確立
int n = in.read(buff); //受信経路からのデータ読み込み
System.out.println("サーバから"); //printlnはDOSプロンプトに文字列を出力
System.out.write(buff,0,n); //データ表示(DOSプロンプト
System.out.println("を取得しました");

PrintWriter out = new PrintWriter(sock.getOutputStream(),true); //サーバへの送信経路を確立
out.println("文章→サーバ "); //ストリームを出力ファイルとして扱う(つまり相手に送る文字列

sock.close(); //ソケットクローズ
} catch (Exception e) {
System.out.println("例外 " + e + " が発生しました"); //エラー時の反応
}
}
}


参考にした本:最新Java逆引き大全 550の極意
http://www.amazon.co.jp/gp/product/479800815X


>トリさん
ぱっと見、本当にメンバが作ったコードに自分の作ったmainを入れただけ、のように見えます…。

どうつなげるか考えて、結局エラーを消すのに
textfield txts = new textfield(); //?
の部分を追加しただけでやっとだったのでまさに殆どその通りです。

早速ヒントを試してみます、ありがとうございます。
旅行で長い事返信遅れました( ´・ω・`)

"127.0.0.1"のループバック部分は実際はサーバのIPになります。クライアントとサーバを同じPCに入れて試しているのでこうなってます。

複数つなごうと思ってますが学校でしかできない上にもう冬休みに入ってて休み明け15日間しか期間がないので1:1にしてしまおうかと思ってます( ´・ω・`)
こんばんは。
あまりじっくりとソースは読んでいませんが・・・
サーバーの処理の方法はこんな感じでは?


serversock = new ServerSocket(1234);//ポート番号は仮の値。
while(true){
sock = serversock.accept();
ServerThread serverthread = new ServerThread(sock);
serverthread.start();
}

それで、サーバースレッドクラスは・・・・

class ServerThread extends Thread{
User user = null;
Socket sock = null;
String name = null;
String msg = null;

//コンストラクタ
ServerThread(Socket s){
sock = s;
}

public void run(){
PrintWriter out = null;
BufferedReader in = null;
boolean chk = true;

try {
out = new PrintWriter(sock.getOutputStream());
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));

String instring = in.readLine();
while(chk){
//何らかの処理をする。
//ユーザーが回線を切るとchkをfalseに。
instring = in.readLine();
}
out.close();
in.close();
sock.close();
}
catch(IOException e){
try{
out.flush();
out.close();
in.close();
sock.close();
}catch(IOException e2){}
}
}
}

これで複数のアクセスを処理できると思うけど・・・
参考になれば。
がんばってくだされ。

尚、そのままコピーして異常が出ても
一切責任は取れませんのでw

ログインすると、みんなのコメントがもっと見れるよ

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

Javaの課題丸投げ 更新情報

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

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

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