package com.test;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatRoomServer extends Frame implements Runnable{
Panel panel;
ScrollPane sPanel;
TextArea textArea;
Button button1;
//net
ServerSocket serverSock;
public final static int DEFAULT_PORT=6666;//默认端口号
Thread chatAcceptThread;//启动接受连接的线程
BroadcastThread broadcastThread;//广播thread; run when server is listening
java.util.Vector clients;//记录连接的线程
java.util.Vector clientsInfor;//记录连接线程的信息
public static int index=0;
public ChatRoomServer(){
try{
jbInit();
}catch(Exception e){
e.printStackTrace();
}
serverListen();//服务器开始监听
}
private void jbInit(){//初始化界面
panel=new Panel();
sPanel=new ScrollPane();
textArea=new TextArea("server information:\n");
button1=new Button("退出");
sPanel.add(textArea);
button1.addActionListener(new java.awt.event.ActionListener(){//退出按钮注册
public void actionPerformed(ActionEvent e){
button1_actionPerformed(e);
}
});
panel.add(button1);
//this.addWindowListener(new ChatFrame_WindowAdapter(this));//注册到继承了窗口适配器的类
this.setSize(600,600);
this.setLayout(new BorderLayout());
this.add(sPanel,BorderLayout.CENTER);
this.add(panel,BorderLayout.SOUTH);
this.show();
}
private void button1_actionPerformed(ActionEvent e){
exit();
}
public void processMsg(String str){//
textArea.append(str);
}
private void serverListen(){
try{
serverSock=new ServerSocket(DEFAULT_PORT);
}catch(IOException e){
processMsg(e.toString());
processMsg("server failed!\n");
}
processMsg("server listening on port:"+DEFAULT_PORT);
clients=new java.util.Vector();
clientsInfor=new java.util.Vector();
chatAcceptThread=new Thread(this);//启动接受连接的线程
chatAcceptThread.start();
broadcastThread=new BroadcastThread(this);//广播线程
broadcastThread.start();
//还有一个回收无用连接thread 的线程
}
public void run(){//接受连接并记录线程信息
int i=0;
try{
while(true){
Socket clientSock=serverSock.accept();
CommunicateThread ct=new CommunicateThread(clientSock,this,index);//创建线程保持连接
clients.add(ct);//record Communicate Thread;
i++;
index++;//version2
clientsInfor.add("Thread-"+i);
processMsg("Thread-"+i+"join in\n");
}
}catch(IOException e){processMsg(e.toString());}
}
public void exit(){
broadcastThread.broadcast("Server exit!");
try{
serverSock.close();
}catch(IOException ioe){}
finally{System.exit(0);}
}
public static void main(String[] args){
ChatRoomServer chat=new ChatRoomServer();}}
class CommunicateThread extends Thread{//保持连接线程
protected Socket clientSock;
protected BufferedReader in=null;
protected PrintWriter out;
ChatRoomServer chatFrame;
boolean isTrue=true;//run()
java.util.Vector inforStack;
int index2;//
public CommunicateThread(Socket Sock,ChatRoomServer cFrame,int index){
clientSock=Sock;
chatFrame=cFrame;
index2=index;
inforStack=new java.util.Vector();
try{
in=new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
out=new PrintWriter(clientSock.getOutputStream());
}catch(IOException ei){
try{
clientSock.close();
}catch(IOException ei2){ }
chatFrame.processMsg(ei.toString());
return;
}
this.start();
}
public void run(){
String infor;
try{
while(isTrue){
infor=in.readLine();
if(infor.equals("Client exit!")){
writeInformation(infor);//把信息写到信息栈,以倍广播出去
stopRun();
}else if(infor!=null){
writeInformation(infor);
}//else break;
try{
Thread.sleep(100);//version2
}catch(InterruptedException ex){}
}
}catch(IOException e){ ;}
finally{
try{
in.close();
out.close();
clientSock.close();
chatFrame.clients.remove(index2);//在clients中清除本线程序
ChatRoomServer.index--;//
}catch(IOException ei){;}
}
}
public void writeInformation(String infor){//写信息栈
inforStack.add(infor);
}
private void stopRun(){//终止线程
isTrue=false;
}
public void sendInformation(String str){//发送信息
try{
out.println(str);
out.flush();
}catch(Exception e){;}
}
}
class BroadcastThread extends Thread{//广播线程
ChatRoomServer chatFrame2;
java.util.Vector chatClients;//连接线程信息
java.util.Vector msgStack;//信息栈
java.util.Vector clientMsg;//记录客户发送的信息
CommunicateThread comThread1;
CommunicateThread comThread2;
String string;//information in inforStack
String clientName;//client thread name
String broadcastInfor;//broadcast information=clientName+string;
public BroadcastThread(ChatRoomServer cFrame){
chatFrame2=cFrame;
chatClients=chatFrame2.clients;
clientMsg=chatFrame2.clientsInfor;
//this.start();
}
public void broadcast(String str){//广播
for(int k=0;k<chatClients.size();k++){//send to everyone分别调用每个连接线程,发送信息
comThread2=(CommunicateThread)chatClients.get(k);
comThread2.sendInformation(str);
}
}
public void run(){
try{
while(true){
for(int i=0;i<chatClients.size();i++){
comThread1=(CommunicateThread)chatClients.get(i);
msgStack=comThread1.inforStack;//得到每个连接的信息栈
clientName=(String)clientMsg.get(i);//客户名
//读取每个连接线程的信息栈并把信息发送出去
for(int j=0;j<msgStack.size();j++){
string=(String)msgStack.get(j);
broadcastInfor=clientName+"->"+string;
broadcast(broadcastInfor);
}
//clear the inforStack
msgStack.removeAllElements();//清除以发送的信息
}
try{
Thread.sleep(100);//version2
}catch(InterruptedException ex){}
}
}catch(Exception e){}
}
}
/*//处理窗口关闭事件的适配器
class ChatFrame_WindowAdapter extends java.awt.event.WindowAdapter{
ChatRoomServer chatFrame;
public ChatFrame_WindowAdapter(ChatRoomServer chatFrame){this.chatFrame=chatFrame;}
public void windowClosing(WindowEvent e){chatFrame.exit();}
}
*/
没有合适的资源?快使用搜索试试~ 我知道了~
JAVA程序设计的小程序老师上课演示的实验
共141个文件
class:55个
java:42个
html:9个
需积分: 9 3 下载量 151 浏览量
2008-12-23
15:45:05
上传
评论 1
收藏 133KB RAR 举报
温馨提示
演示的程序,都是经典上课老师演示的程序,各章的演示实验
资源推荐
资源详情
资源评论
收起资源包目录
JAVA程序设计的小程序老师上课演示的实验 (141个子文件)
java.policy.applet 141B
java.policy.applet 141B
TestMenu1.class 6KB
ChatRoomClient.class 5KB
TestTable.class 5KB
TestMenu.class 4KB
ChatRoomServer.class 4KB
TestReflection.class 4KB
TestMultiUserServer$CreateServerThread.class 3KB
TestTree1.class 3KB
TestGUI.class 3KB
UserManager.class 3KB
UserManager.class 3KB
UserManager.class 3KB
TestIo.class 3KB
UserManager.class 3KB
TestMultiUserServer.class 3KB
CommunicateThread.class 3KB
Thread3.class 2KB
Animator.class 2KB
TestApplet.class 2KB
TestConnectSocket1.class 2KB
Thread2.class 2KB
TestAnimator.class 2KB
TestApplet1.class 2KB
BroadcastThread.class 2KB
TestTree.class 2KB
TestMultiUserClient.class 2KB
TestConnectSocketClient1.class 2KB
TestConnectSocket.class 1KB
TestAnimator$1.class 1KB
Thread1.class 1KB
TestMultiUserServer$Broadcast.class 1KB
TestConnectSocketClient.class 1KB
TestServlet.class 1KB
TestAnimator1.class 1KB
TestAnimator2.class 1KB
Conndb.class 1KB
TestReference.class 1KB
Call.class 1KB
User.class 1KB
User.class 1KB
User.class 1KB
User.class 1KB
MyMouseEvent.class 893B
TestEquals.class 783B
ChatRoomServer$1.class 769B
ChatRoomClient$2.class 769B
ChatRoomClient$1.class 769B
textField2_KeyAdapter.class 726B
textField1_KeyAdapter.class 723B
TestMenu$2.class 701B
TestException.class 692B
TestMenu$1.class 685B
ChatFrame_WindowAdapter.class 636B
TestRandom.class 620B
TestMultiThread.class 602B
.classpath 340B
.classpath 340B
.classpath 226B
.classpath 226B
.classpath 226B
.classpath 226B
search.html 465B
search.html 459B
register.html 330B
register.html 330B
login.html 318B
login.html 318B
hello.html 181B
testApplet.html 127B
com.test.TestApplet1226885388828.html 106B
ChatRoomServer.java 7KB
ChatRoomClient.java 6KB
TestMenu1.java 4KB
TestMultiUserServer.java 3KB
TestGUI.java 3KB
TestTable.java 2KB
TestMenu.java 2KB
TestTree1.java 2KB
UserManager.java 2KB
UserManager.java 2KB
UserManager.java 2KB
TestReflection.java 2KB
TestIo.java 2KB
UserManager.java 2KB
Conndb.java 2KB
Thread3.java 1KB
TestTree.java 1KB
TestAnimator.java 1KB
TestApplet.java 1KB
TestConnectSocket1.java 1KB
Animator.java 1KB
Thread2.java 1KB
TestMultiUserClient.java 1KB
TestApplet1.java 1012B
TestConnectSocket.java 930B
TestConnectSocketClient1.java 879B
TestConnectSocketClient.java 787B
TestAnimator1.java 647B
共 141 条
- 1
- 2
资源评论
nieminnini123456
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功