?? frame1.java~178~
字號:
DataInputStream dis; //用于實現接受從客戶端發送來的數據流
PrintStream ps; //用來實現向客戶端發送信息的打印流
Socket socket;
public Client(Socket s) //Client 線程的構造器
{
socket=s;
try{
dis=new DataInputStream(s.getInputStream());
//存儲特定客戶socket的輸入流,
//接受s客戶發送到服務器端的信息
ps=new PrintStream(s.getOutputStream());
//存儲特定客戶socket的輸出流,
//發送服務器給s客戶的信息
String info=dis.readLine();
//讀取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":");
//讀取用":"分開的分段字符
String head=stinfo.nextToken();
//用head存儲關鍵字的頭信息
if(stinfo.hasMoreTokens())
name=stinfo.nextToken();
//關鍵字的第二個數據段是客戶的名稱
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken();
//關鍵字的第三個數據段是客戶的IP地址
jTextArea2.append("系統消息: "+name+"/"+ip+" 已經連接\n");
}
catch(IOException e){
jTextArea2.append("系統消息: 聊天服務器"+"Error "+e);
}
}
public void send(StringBuffer msg)
//實現向客戶端發送信息的方法
{
ps.println(msg);
//用打印流發送信息
ps.flush();
}
public void run(){ //線程的運行方法
while(true){
String line=null;
try{
line=dis.readLine(); //讀取客戶端發送的數據流
}
catch(IOException e)
{
jTextArea2.append("系統消息:"+" 聊天服務器"+" Error: "+e);
disconnect(this);
notifyRoom();
return ;
}
if(line==null) //客戶已經離開
{
disconnect(this);
notifyRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":");
String keyword=st.nextToken();//存儲關鍵字,判斷消息類型
String broadcast=st.nextToken();//存儲消息是屬于廣播,還是屬于單播
//如果單播,則記錄的是目標用戶名
if(keyword.equalsIgnoreCase("MSG")) //如果關鍵字是MSG,則是客戶端發送的聊天信息
{
StringBuffer message=new StringBuffer("MSG:");//在服務器端建立一個緩沖區,用于信息的發送
message.append(broadcast+":");
message.append(st.nextToken("\0"));
if(broadcast.equalsIgnoreCase("BROAD"))
{
sendClients(message);
}
else
{
jTextArea2.append(broadcast);
sendtoClient(message,broadcast);
}
}
else if(keyword.equalsIgnoreCase("QUIT")) //如果關鍵字是QUIT,則是客戶端發送的退出信息
{
list1.clear();
disconnect(this);
for(int i=0;i<clients.size();i++)
{
Client listdata1=(Client)clients.elementAt(i);
list1.add(listdata1.name+" "+listdata1.ip+" 已經連接",i);
}
notifyRoom();
this.stop();
}
}
}
}
void send_actionPerformed(ActionEvent e) {
StringBuffer info=new StringBuffer("MSG");
info.append(":"+"SERVER"+":");
info.append(jTextField2.getText());
sendClients(info);
jTextField2.setText("");
}
void sysexit_actionPerformed(ActionEvent e) {
sendClients(new StringBuffer("QUIT:"+"SERVER"));
closeAll();
System.exit(0);
}
void link_actionPerformed(ActionEvent e) {
//進行服務器的初始化建立
if (serverSocket == null) {
try {
serverSocket = new ServerSocket(4000);
//建立一個服務器,端口為4000
jTextArea2.append("系統提示: 聊天服務器 系統開始啟動......\n");
}
catch (IOException ee) {
jTextArea2.append("系統消息: 聊天服務器 "+ e.toString() + "\n");
}
}
if(serverSocket!=null){
jTextArea2.append("系統消息: 聊天服務器 已經啟動\n");
Thread a=new watch();
//啟動監視線程
a.start();
}
}
class watch extends Thread{
int i=0;
public void run(){
while(true){
if(clients.size()<20)
//當客戶數目小于20的時候開始連接
{
try{
socket=serverSocket.accept();
}
catch(IOException ee){
jTextArea2.append("系統消息: 聊天服務器 "+
ee.toString()+" 用戶連接失敗\n");
}
do{
Client c=new Client(socket);
//定義并實例化一個Client線程,每一個線程對應一個客戶連接
clients.addElement(c);
//加入到clients數組中
if(checkName(c))
{
int num=active_connects+1;
active_connects++;//連接數目加1
jTextField1.setText("目前已經有"+num+"用戶連接");
//在狀態欄中顯示目前的活動數目
Client listdata=(Client)clients.elementAt(i);
list1.add(listdata.name+" "+listdata.ip+" 已經連接",i);
c.start();
//啟動線程
notifyRoom();
//監視聊天窗口的連接變化
}
else{
c.ps.println("FaultName");
//檢查名字不合法,則在發送流中發送FaultName
disconnect(c);
//斷開連接
}
i++;
break;
}
while(i<clients.size());
}
else{ //如果超過連接數目
try{
Thread.sleep(400); //睡眠一段時間然后重新連接
}
catch(InterruptedException ee)
{
}
}
} //end of while*/
}//end of run
}////end of watch class
}
class Frame1_send_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_send_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.send_actionPerformed(e);
}
}
class Frame1_sysexit_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_sysexit_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.sysexit_actionPerformed(e);
}
}
class Frame1_link_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_link_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.link_actionPerformed(e);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -