|  |
DownLoad JavaChat2.lzh(ソースコード付き)
import java.io.* ;
import java.net.* ;
import java.util.* ;
import java.text.*;
public class Server {//実行方法:java Server 8000 10 java Server
static final String sLogDat = "log.dat";
static Vector vLog = new Vector();
static int MAX_LOG_SIZE = 20;
public static void logProc(String inString) {//logProc() ログファイルへ書き込む
try{
vLog.addElement(inString);//発言ログを発言のつどログファイルへ記録
FileWriter fw = new FileWriter(sLogDat) ;
BufferedWriter bw = new BufferedWriter (fw) ;//なければ作成される
if(vLog.size() > MAX_LOG_SIZE)
{
vLog.removeElementAt(0);
}
for(int i = 0 ; i < vLog.size(); i++) {
bw.write( vLog.elementAt(i) + "\n") ;
}
bw.close() ;
} catch(IOException e) {System.out.println("Server::logProc :" + e) ;}
catch(Exception e) {System.out.println("Server::logProc :" + e) ; }
}
public static void startReadLog()
{
try{
FileReader fr = new FileReader( sLogDat ) ;
BufferedReader br = new BufferedReader(fr) ;
String hoe = "" ;
while( (hoe = br.readLine() ) != null ){
vLog.addElement(hoe);
}
} catch(IOException e) {System.out.println("Server::logProc :" + e) ;}
catch(Exception e) {System.out.println("Server::logProc :" + e) ; }
}
public static void addConnections(Socket socket) {// クライアントを追加
if(vConnections == null) {
vConnections = new Vector();
}
vConnections.addElement(socket);
vIP.addElement(socket.getInetAddress().getHostAddress());//IPVectorに登録
}
public static void deleteConnection(Socket socket) {// クライアントを削除
if(vConnections != null) {
vConnections.removeElement(socket);
vIP.removeElement(socket.getInetAddress().getHostAddress());
}
}
static Vector vIP = new Vector();//ログインユーザーIPアドレス格納Vectro
public static void makeSocket(String[] args) {
int DEFAULT_PORT = 8000;
ServerSocket serverSocket = null ;
Socket insocket = null ;
Thread thread = null ;
try { if(args.length>0) {
serverSocket = new ServerSocket(Integer.parseInt(args[0]), Integer.parseInt(args[1])) ;
} else {
System.out.println("Java Server ");
}
System.out.println("JavaChat2 Server Starting...");
while(true) {
insocket = serverSocket.accept() ;//接続受付待機
if(vIP.indexOf(insocket.getInetAddress().getHostAddress())==-1){//2重起動防止IPVectorに登録されていなければ
addConnections(insocket);//クライアントソケットを追加
thread = new Thread(new ClientProc(insocket));//クライアント処理をThread化する
thread.start();
}
}
} catch(IOException e) {System.out.println("Server::main() : " + e) ;}
}
public static void main(String[] args) {
startReadLog();
makeSocket(args);//ソケットを作成
}
static Vector vHostAddress = new Vector();//IPアドレス
static Vector vHandleName = new Vector() ;
public static void memberList(int i, String sInetAddress, String sHandleName) {
switch(i) {
case 0: // InetAddressをリストの一番最後に追加HandleNameにもInetAddressを入れる
vHostAddress.addElement(sInetAddress);
vHandleName.addElement(sHandleName);break ;
case 1: // 同じInetAdressを探してhandleNameをついか
for(int j = 0 ; j < vHostAddress.size(); j++) {
if( vHostAddress.elementAt(j).equals(sInetAddress) ) {// IPアドレスが同じであっても別ユーザーの場合もある
if( vHandleName.elementAt(j).equals(sInetAddress)) {
vHandleName.setElementAt(sHandleName, j);
sendAll("/addUser");
}
}
}break ;
case 2: // 同じInetAdressを探してInetAdressとhandleNameを削除
for(int j = 0 ; j < vHostAddress.size(); j++) {
if( vHostAddress.elementAt(j).equals(sInetAddress) ) {
if( vHandleName.elementAt(j).equals(sHandleName)) {//なおかつハンドル名も同じでである場合はメンバーリストから削除する
vHostAddress.removeElementAt(j);
vHandleName.removeElementAt(j);
System.out.println("[Server::UserCount in Room : " + Server.vHandleName.size() );
}
}
} break ; // delete
}
String sMemberList ="/who;";// メンバーリストをクライアント全員に出力
for(int y = 0 ; y < vHandleName.size(); y++) {//handleネームをかき集めて、、、
sMemberList += vHandleName.elementAt(y) + ";" ;
}
if(Server.vHandleName.size()!=0) {//ユーザが誰もいないので有れば送信の必要は無し
sendAll(sMemberList);
}
}
static Vector vConnections = null;
public static void sendAll(String inString) {//sendAll() クライアント全員に送信
PrintWriter pw = null ;
if(vConnections != null) {
for(Enumeration e = vConnections.elements(); e.hasMoreElements(); ) {
try{pw = new PrintWriter(((Socket)e.nextElement() ).getOutputStream());
pw.println(inString);
pw.flush();
} catch(IOException ex) {System.out.println("Server::sendAll() : " + ex);}
}
}
}
public static void sendUser(String sHandleName, String inString) {//特定のユーザーへ送信
int i = vHandleName.indexOf(sHandleName);//ハンドルネームのindexからvConnectionsのindexを探す
if(vConnections != null) {//探し出したソケットにメッセージを送信する
try{PrintWriter pw = new PrintWriter(((Socket)vConnections.elementAt(i)).getOutputStream());
pw.println(inString);
pw.flush();
} catch(IOException ex) {System.out.println("Server::sendAll() : " + ex);}
}
}
}
class ClientProc implements Runnable{
Socket socket = null;
BufferedReader in = null ; // クライアントからのソケット入力用
String inString = "";
String sHandleName = "" ;
public ClientProc(Socket socket) throws IOException{
this.socket = socket;
in = new BufferedReader(new InputStreamReader(socket.getInputStream() )) ;
//############# ROM IP/IP
Server.memberList(0, ""+socket.getInetAddress().getHostAddress(), ""+socket.getInetAddress().getHostAddress());//クライアントのInetAddressをリストにROM表示
}
public String getDate(){
Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyyy年MMMMMdd aaa hh:mm");//1996.July.10 AD 12:08 PM
return (String)df.format(date);
}
boolean bEnter = false ;
public void run(){
try{inString = in.readLine();//読みとり
while(!"/quit".equals(inString)){//############################### quitじゃなければ
if(inString != null && inString.length() != 0) {//空白じゃなければ
if(inString.charAt(0) == '/'){// "/"がついていたら信号と判断
StringTokenizer st = new StringTokenizer(inString, ";");//区切り文字は ;
String cmd = st.nextToken();
cmd.toLowerCase();//小文字に変換
if(cmd.equals("/handle")){//########################## ハンドルネーム
sHandleName = st.nextToken();
Server.sendAll("□ "+ sHandleName + " さんが入室されました ["+getDate()+"]");//クライアントへ出力
Server.logProc("□ "+ sHandleName + " さんが入室されました ["+getDate()+"]");//ログへ出力
Server.memberList(1, ""+socket.getInetAddress().getHostAddress(), sHandleName);//memberListに追加
bEnter = true;
}
if(cmd.equals("/mes")){//############################# メッセージ
String sMes = st.nextToken();
Server.sendAll(sMes);//クライアントへ出力
Server.logProc(sMes);//ログへ出力
}
if(cmd.equals("/invoke")){//########################## 呼び出し
if(bEnter==true){
String sCallMember = st.nextToken();
Server.sendUser(sHandleName, "/invoke");
Server.sendUser(sHandleName, "□ "+ sHandleName + " さんがお呼びです ["+getDate()+"]");
}
}
}
}
inString = in.readLine();//読み込み
}
if(bEnter==true) {// 入室していないやつは退室もしない
Server.sendAll("□ "+ sHandleName + " さんが退出されました ["+getDate()+"]");//クライアントへ出力
Server.logProc("□ "+ sHandleName + " さんが退出されました ["+getDate()+"]");//ログへ出力
Server.sendAll("/quit");
}//################################################################# /quit
Server.memberList(2, ""+socket.getInetAddress().getHostAddress(), sHandleName);//ログインmemberListから削除
Server.memberList(2, ""+socket.getInetAddress().getHostAddress(), ""+socket.getInetAddress().getHostAddress());//ROM memberListから削除
Server.deleteConnection(socket);//quitだったらsocketを切断
in.close();socket.close();
}catch(IOException e){try{in.close();socket.close();} catch(IOException ex){System.out.println("Server::run() : " + e) ;}}
}
}
import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class JavaChat2 extends Applet implements Runnable{
private Hashtable lookup = null;
boolean reverseScroll = false;
int state = 0;
Font font = null;
AudioClip soundOnline = null;
AudioClip soundContact = null;
AudioClip soundKnock = null;
AudioClip soundQuit = null;
Color bgcolor = Color.white;
Color fgcolor = Color.black;
String channel = "Default";
int port = 8080 ;
String host = "127.0.0.1" ;
int maxAge = 1440;
int logSize = 10;
TextArea chatArea = null;
java.awt.List memberList = null;
TextField messageField = null;
boolean ex = false ;//最初のログイン時false ログイン後 true
final String sLogdatName = "log.dat";
final String sLogListName = "logIndex.dat";
/**
*
*/
public void init() {
lookup = new Hashtable(5);
lookup.put( "name", "Java\u30C1\u30E3\u30C3\u30C8");//表示される文字列の国際化
lookup.put( "for", "\uFF1E" );
lookup.put( "input", "\u3042\u306A\u305F\u306E\u540D\u524D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044");
lookup.put( "err_unknown", "\u672A\u5B9A\u7FA9\u306E\u30B3\u30DE\u30F3\u30C9\u3067\u3059");
lookup.put( "err_connect", "\u30B5\u30FC\u30D0\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");
host = getCodeBase().getHost();//ホスト情報の取得
soundOnline = getAudioClip(getCodeBase(), "Online.au");
soundContact = getAudioClip(getCodeBase(), "Contact.au");
soundKnock = getAudioClip(getCodeBase(), "Knock.au");
soundQuit = getAudioClip(getCodeBase(), "Quit.au");
String sParam = getParameter("font");
String sFont ;
if(sParam==null){
sFont = "Serif" ;
}else{
sFont = getParameter("size");
}
sParam = getParameter("size");
int iSize ;
if(sParam==null){
iSize = 12;
}else{
iSize = Integer.parseInt(getParameter("size"));
}
int iFonttype ;
sParam = getParameter("fonttype");
if(sParam==null){
iFonttype = 0;
}else{
iFonttype = Integer.parseInt(getParameter("fonttype"));
}
setFont(font = new Font(sFont, iFonttype, iSize));
sParam = getParameter("channel");
if(sParam == null){
channel = "Default" ;
}else{
channel = getParameter("channel");
}
sParam = getParameter("port");
if(sParam == null){
port = 8000;
}else{
port = Integer.parseInt(getParameter("port"));//8000
}
sParam = getParameter("maxAge");
if(sParam == null){
maxAge = 1440 ;
}else{
maxAge = Integer.parseInt(getParameter("maxAge"));//1440
}
sParam = getParameter("logSize");
if(sParam == null){
logSize = 10;
}else{
logSize = Integer.parseInt(getParameter("logsize"));//10
}
sParam = getParameter("bgcolor");
if(sParam == null){
bgcolor = new Color(Integer.parseInt("ffffff", 16));
}else{
bgcolor = new Color(Integer.parseInt(getParameter("bgcolor"), 16));
}
sParam = getParameter("fgcolor");
if(sParam == null){
fgcolor = new Color(Integer.parseInt("000000", 16));
}else{
fgcolor = new Color(Integer.parseInt(getParameter("fgcolor"), 16));
}
setBackground(bgcolor);
setLayout(new BorderLayout());
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add("Center", chatArea = new TextArea());
chatArea.setEditable(false);
chatArea.setBackground(bgcolor);
chatArea.setForeground(fgcolor);
chatArea.setFont(font);
p.add("East", memberList = new java.awt.List());
memberList.setBackground(bgcolor);//ユーザーリスト
memberList.setForeground(fgcolor);
memberList.setFont(font);
add("Center", p);
Panel p2 = new Panel();
p2.setLayout(new GridLayout(1, 1));
p2.add(messageField = new TextField());
messageField.setBackground(bgcolor);
messageField.setForeground(fgcolor);
messageField.setFont(font);
add("South", p2);
reverseScroll = true;
}
Thread thread = null;
Socket socket = null;
BufferedReader input = null ;
PrintWriter output = null;
public void start() {
int retry = 0;
try { while(socket == null){
try{socket = new Socket(host, port);
input = new BufferedReader(new InputStreamReader(socket.getInputStream() )) ;
output = new PrintWriter( socket.getOutputStream());
retry = 0;
}catch(SocketException se){
if(retry >= 5){
chatArea.insert("Error JavaChat2::start() : " + se + "\n", 0);
}
socket = null;
retry++;
}
}
}catch(IOException ie){ chatArea.insert("Error JavaChat2::start() : " + (String)lookup.get("err_connect") + "\n", 0); return; }
state = 1;
chatArea.setText("");
messageField.setText((String)lookup.get("input"));
messageField.requestFocus();
messageField.selectAll();
if(thread != null){
System.out.println("Error JavaChat2::start() : internal error!");
}
thread = new Thread(this);
thread.start();
chatArea.insert("\n□□□JavaChat2 Version " + getParameter("version") + "2002 SUZUKI I-ichirow □□□\n\n", 0);
if(getParameter("log").equals("True")){
readLog(sLogdatName);//ログを表示する
}
}
public void run(){
while(true){
String line="";
try{line = input.readLine();//サーバーからの文字列を取得
}catch(IOException e){}
if(line != null && line.length() != 0){
if(line.charAt(0) == '/'){// スラッシュがついていたらサーバーからの信号と受け取る
StringTokenizer st = new StringTokenizer(line, ";");//区切り文字は ;
String cmd = st.nextToken();
cmd.toLowerCase();
if(cmd.equals("/who")){//受信受信受信受信受信受信受信受信受信受信受信受信受信
memberList.removeAll();//memberリストを全て消去して
for(; st.hasMoreTokens(); memberList.addItem("□ "+st.nextToken()));//全員追加する
}
if(cmd.equals("/mes")){//受信受信受信受信受信受信受信受信受信受信受信受信受信
chatArea.insert(st.nextToken(), 0);//コメントペインに表示
}
if(cmd.equals("/addUser")){
if(ex){
soundContact.play();
}else{
soundOnline.play();
}
ex=true;
}
if(cmd.equals("/invoke")){
soundKnock.play();
}
if(cmd.equals("/quit")){
soundQuit.play();
}
} else {
chatArea.insert(line + "\n", 0);// サーバーからの文字列をそのまま表示 エラー表示など
}
}
}
}
public void readLog(String sLog){
try{URL url = new URL(getCodeBase() + sLog);
URLConnection urlconnection = url.openConnection();
InputStream inputstream = urlconnection.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream, "SJIS");
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String hoe = "" ;
for(int i = 0 ; i < Integer.parseInt(getParameter("logLine")); i ++ ){
hoe = bufferedreader.readLine();
if(hoe != null){
chatArea.insert(hoe + "\n", 0);
}
}
bufferedreader.close();
inputstream.close();
}catch(IOException e){
chatArea.insert("\n□□□指定されたファイルを開く事ができませんでした□□□\n\n", 0);
}
}
String sHandleName= "";
public boolean action(Event evt, Object what){
if(evt.target == messageField){
String mes = messageField.getText();
if(mes != null && mes.length() != 0){
if(mes.charAt(0) == '/'){// スラッシュがついていたらサーバーからの信号と受け取る
StringTokenizer st = new StringTokenizer(mes, ";");//区切り文字は ;
String task = st.nextToken();// /logを抽出
if(task.equals("/version")){
chatArea.insert("\n□□□JavaChat2 Version " + getParameter("version") + "2002 SUZUKI I-ichirow □□□\n\n", 0);
}
}else{
switch(state){
case 1: // '\001'入室時
for(; mes.charAt(0) == '/' && mes.length() > 1; mes = mes.substring(1));
if(!mes.equals("/")){// ハンドル名をサーバーへ
output.println("/handle;" + mes);
output.flush();
sHandleName = mes;//ユーザーハンドルネームとして格納
state=2;
}break;
case 2: // '\002'入室後はhandleNameとメッセージをまとめて送る// メッセージをサーバーへ
output.println("/mes;" + sHandleName + " > " + mes);
output.flush();
break;
}
}
messageField.setText("");//送信したらテキストフィールドをnullにする
}
return true;
}
if(evt.target == memberList){//メンバーリストをダブルクリック
messageField.requestFocus();
output.println("/invoke;"+memberList.getSelectedItem());
output.flush();
}
return false;
}
public void stop(){
if(thread == null){
System.out.println("JavaChat2 #stop: internal error!");
}
try{output.print("/quit");
output.flush();
output.close();
input.close();
socket.close();
thread.stop();
thread = null;
}catch(IOException ie){System.out.println(ie.toString());}
state = 0;
}
}
インターネットスタートページ 鈴木維一郎 石橋三重子
|
|
|
|
|
|