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

📄 chatserver.java

📁 包含了书中提到的所有范例及游戏。原始文件全部放在source目录内
💻 JAVA
字号:
/*
此程式出自「Flash MX - ActionScript 游戏制作」
版权所有人 易珑资讯 林新德
此程序仅供学习之用,请勿用于商业行为
本程序虽经多次测试,而且运行正常,但不具任何担保承诺
*/
import java.net.*;
import java.io.*;
import java.util.*;
import java.nio.charset.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class ChatServer implements Runnable
{
	static Vector serverVector;	//用以存放ChatServer对象
	static ServerSocket listener;
	Socket mySocket;		//ChatServer对象内的连线Socket
	String username;		//使用者的匿称
	
	//
	public ChatServer(Socket mySocket)
	{
		this.mySocket = mySocket;
	}
	
	//多线程方法定义
	public void run()
	{
		try{
			//准备接收字串所需的对象
			InputStream in = mySocket.getInputStream();
			BufferedReader bReader = new BufferedReader(
				new InputStreamReader(in, Charset.forName("UTF-8")));
			
			//接收第一笔资料
			String[] userstr = parseNode(bReader.readLine());
			if(userstr[0].equals("newuser")){
				//取得使用者昵称
				this.username = userstr[1];
			}
			System.out.println(username+" 进入聊天室~");
			sendMessages(username+" 进入聊天室~");
			
			String others = getPeople();
			String welcome;
			if(others.equals(""))
				welcome = "欢迎光临!目前聊天室没有其他人。";
			else
				welcome = "欢迎光临!目前聊天室内有:"+others;
			
			//将对象本身(ChatServer对象)加入Vector对象
			serverVector.addElement(this);
			
			//准备传送字串所需的对象
			OutputStream out = mySocket.getOutputStream();
			BufferedWriter bWriter = new BufferedWriter(
				new OutputStreamWriter(out, Charset.forName("UTF-8")));
			bWriter.write(welcome);
			bWriter.write(0);	//加上结尾字元
			bWriter.flush();	//送出资料
			

			//若没有断线,持续接收资料
			while(mySocket.isConnected())
			{
			
				String[] datastr = parseNode(bReader.readLine());
				if(datastr[0].equals("message")){
					//送出资料给每个人
					sendMessages(this.username+":"+datastr[1]);
				}
				System.out.println(this.username+":"+datastr[1]);
			}
		}
		catch(Exception ex){
			System.out.println(username+" 离线了~");
		}
		finally
		{
			try{	
				mySocket.close();	//关闭连线
			}catch(IOException ex){}

			//从Vector对象移除对象本身(ChatServer对象)
			serverVector.removeElement(this);
			sendMessages(username+" 离线了~");
		}
	}

	//解析XML字串
	String[] parseNode(String str)throws Exception
	{
		String[] result = new String[2];
		//把空字元换成空白字元
		str = str.replace('\0', ' ');
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		//将XML变成DOM型式
		Document doc = db.parse(new InputSource(new StringReader(str)));
		//取得标签名
		result[0] = doc.getDocumentElement().getTagName();
		//取得子节点
		Node node1 = doc.getDocumentElement().getFirstChild();
		//若为文字节点
		if(node1.getNodeName()== "#text"){
			result[1] = node1.getNodeValue();
		}
		return result;
	}

	//送出讯息的静态方法
	static synchronized void sendMessages(String msg)
	{
		//以阵列形式取得Vector对象内的所有对象
		Object[] servers = serverVector.toArray();
		
		//以循环的方式,对每个使用者传送讯息
		for(int i=0; i<servers.length; i++)
		{
			try{
				ChatServer chatserver = (ChatServer)servers[i];
				OutputStream out = chatserver.mySocket.getOutputStream();
				BufferedWriter bWriter = new BufferedWriter(
					new OutputStreamWriter(out, Charset.forName("UTF-8")));
				bWriter.write(msg);
				bWriter.write(0);	//加上结尾字元
				bWriter.flush();	//送出资料
			}
			catch(IOException ex){
				System.out.println("发生异常:"+ex);
			}
		}
	}
	
	//取得所有人的名称字串
	String getPeople()
	{
		String str = new String();
		Object[] servers = serverVector.toArray();
		for(int i=0; i<servers.length; i++)
		{
			ChatServer chatserver = (ChatServer)servers[i];
			str += chatserver.username+"、";
		}
		if(servers.length == 0)
			return "";
		else
			return str.substring(0, str.length()-1);
	}
	
	//主要方法
	public static void main(String arg[])
	{
		//建立Vector对象
		serverVector = new Vector();

		try{
			//设定倾听埠号
			listener = new ServerSocket(5678);
			System.out.println("聊天伺服器启动,欲停止请按 Ctrl-C。");
			
			while(true)
			{
				//等待连结
				Socket mySocket = listener.accept();
				ChatServer myServer = new ChatServer(mySocket);
				//以执行绪的方式执行ChatServer对象
				Thread myThread = new Thread(myServer);
				myThread.start();
			}
		}
		catch(IOException ex){
			System.out.println("连结错误!");
		}
		catch(Exception ex){
			System.out.println("发生异常:"+ex.toString());
		}
		finally
		{	
			try{	
				listener.close();	//关闭ServerSocket对象
			}catch(IOException ex){}
		}
	}
}

⌨️ 快捷键说明

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