【Java开源代码栏目提醒】:本文主要为网学会员提供ChatServer.java,希望对需要ChatServer.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){}
}
}
}
上一篇:
ChatRoom.java
下一篇:
电咖汽车入选2018独角兽企业榜百强 发布“天际”品牌将推高估值