⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatserver.java

📁 一个用Java编写的聊天程序
💻 JAVA
字号:
import java.net.*;
import java.io.*;
import java.util.*;

/***************************************************************************
*
*   Created by:  耿关辉
*   Started:     August, 2003
*  
*   该程序作为 applet 使用. 
*
*   程序编译后生成三个class文件: chatserver, broadcaster and listener.
*
***************************************************************************/

// - chatserver, parent class.

public class Chatserver {

//method: swrite -- chatserver class 的基本连接


    public static void swrite(Socket sock, String str) throws Exception {

	OutputStream outStream = sock.getOutputStream();
	outStream.write(str.getBytes());
	outStream.flush();

    }

//method: main 

    public static void main(String args[]) throws Exception {

	//
	// Communications
	//

	Listener listenHandle   = null;
	Broadcaster broadHandle = null;
	PipedInputStream in     = new PipedInputStream();
	PipedOutputStream out   = new PipedOutputStream(in);
	ServerSocket server     = new ServerSocket(Integer.parseInt(args[0]));
	InputStream inStream;
	BufferedReader inReader;
	Socket sock;

	//
	// tmpVars and output strings
	//

	int counter             = -1;
	long tmpKey;
	String name, systemOut;

	System.out.println("Chat Server Running");
	while (true) {

		//
		// 获得,打开一个新连接
		//

		sock = server.accept();
		inReader = new BufferedReader(
			   new InputStreamReader(
			     sock.getInputStream()));

		//
		// 获得用户名称
		//

		swrite(sock, "Name? ");
		name = inReader.readLine();
		tmpKey = (new Date()).getTime();

		if (counter == -1) {

			broadHandle = 
			  new Broadcaster(sock, in, tmpKey, name);
			listenHandle = 
			  new Listener(sock, out, tmpKey, name, broadHandle);

			Thread t1 = new Thread(listenHandle);
			Thread t2 = new Thread(broadHandle);

			t1.start();
			t2.start();

		} else {

			listenHandle.addSock(sock, tmpKey, name);
			broadHandle.addSock(sock, tmpKey, name);

		}

		//
		// 获得当前连接的数目
		//

		counter = listenHandle.numSocks();

		systemOut = "Added User : " + name + " (" + counter + ")";
		System.out.println(systemOut);

	}

    }

}


//- Broadcaster 广播程序.  由chatserver生成.
  

class Broadcaster implements Runnable {

    Hashtable sockHash = new Hashtable();
    InputStream in;
    private Socket sock;
    private PrintWriter ostr;


//method: constructor -- call addSock, 配置输入.


    public Broadcaster(Socket sock, InputStream in, long i, String name) 
	throws IOException {

	this.in = in;
	addSock(sock, i, name);

    }

    
//method: bCast -- 输出 (到打印机).


    private void bCast(String s) throws IOException {
	PrintWriter os;

	for (Enumeration e = sockHash.elements() ; e.hasMoreElements() ;) {

		os = (PrintWriter)e.nextElement();
		os.println(s);
		os.flush();

	}

    }


//method: addSock -- 添加新连接到 bCast user.


    public void addSock(Socket sock, long i, String name) 
	throws IOException {

	ostr = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
	sockHash.put(Long.toString(i), ostr);

	try {

		bCast(name + " has joined.");

	}
	catch (Exception e) {

		e.printStackTrace();

	}

    }


//method: delSock -- 在hashtable中删除一个连接.


    public void delSock(Object hKey) throws IOException {

	sockHash.remove(hKey);

    }


//method: run -- 循环


    public void run() {

	BufferedReader istr = new BufferedReader(new InputStreamReader(in));
	try {
		while (true) {
			bCast(istr.readLine());
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}

    }

}


//  Listener: 输入线程


class Listener implements Runnable 
                                                 
   {  
    Hashtable sockHash = new Hashtable();
    Hashtable nameHash = new Hashtable();
    OutputStream out;
    Broadcaster broadHandle;
    private Socket sock;
    private BufferedReader istr;


//  method: constructor -- call addSock, 建立到Broadcaster的连接


    public Listener(Socket sock, OutputStream out, 
	long i, String name, Broadcaster broadHandle) throws IOException 
       { 
	this.broadHandle = broadHandle;
	this.out = out;
	addSock(sock, i, name);

       }


//  method: addSock -- 建立一个新连接到hashtable.


    public void addSock(Socket sock, long i, String name) throws IOException 
       {
	istr = new BufferedReader(new InputStreamReader(sock.getInputStream()));
	sockHash.put(Long.toString(i), istr);
	nameHash.put(Long.toString(i), name);

       }


//  method: numSocks -- 返回已知连接用户数目


    public int numSocks() 
      {

	return sockHash.size();

      }


//  method: delSock --  在hashtable中断开一个连接,并输出断开信息


    public void delSock(Object hKey) throws IOException 
       {

	String systemOut;
	String tmpName = (String)nameHash.get(hKey);
	String tmpStr = tmpName + " has left.\n";

	
	                                            // 终止到broadcaster的连接 	

	broadHandle.delSock(hKey);	

	
	                                            // 关闭 socket
	

	BufferedReader tmpBfr = (BufferedReader)sockHash.get(hKey);
	tmpBfr.close();

	
	                                           // 清除hashtable中的所有连接
	

	sockHash.remove(hKey);
	nameHash.remove(hKey);

	
	out.write(tmpStr.getBytes());

	systemOut = "Removed User : " + tmpName + " (" + nameHash.size() + ")";
	System.out.println(systemOut);

      }


//  method: run -- 主线程操作,循环


    public void run() 
       {

	String tmpStr, tmpName, tmpInput;
	String exitStr = new String("exit");
	Object tmpKey;
	BufferedReader tmpBfr;

	try 
           {
	    while (true)            // Loop thru hash table looking for input that is ready to be posted.  
               {                         
                for (Enumeration e = sockHash.keys() ; e.hasMoreElements() ;) 
                   {
		    tmpKey = e.nextElement();
		    tmpBfr = (BufferedReader)sockHash.get(tmpKey);
		    if (tmpBfr.ready()) 
                       {
			tmpInput = tmpBfr.readLine();
			if (tmpInput.compareToIgnoreCase(exitStr) == 0) { delSock(tmpKey);
			                                                } 
                        else if (tmpInput != "") 
                            {
			     tmpName = (String)nameHash.get(tmpKey);
			     tmpStr = tmpName + " : " + tmpInput + "\n";
			     out.write(tmpStr.getBytes());
			    }
		       }
	           }

	       }

	   } 
	catch (Exception e) { e.printStackTrace();
	                    }

       }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -