?? chatdog.java
字號:
package chatDog;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.lang.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.lang.*;
import java.net.*;
import java.lang.*;
public class ChatDog implements Runnable,Sendable,Const,ActionListener{
private String LocalIP=null;
private int friendNum;
private Friend[] friend;
private String user;
private String passWord;
private File friendFile;
private BufferedReader fr;
private PrintStream fw;
private mainGUI mg;
private addFriendGUI afGUI;
private delFriendGUI dfGUI;
private int activeFriendID;
private int REMOTE_PORT=SERVER_PORT;
private static Object friendLock=new Object();
//////////////////////////////
private int threadID;
private Object threadIDLock=new Object();
///////////////////////////////
private JFrame mainwnd=new JFrame(MAINWNDCAP);
private ServerSocket serverSock;
private Socket nClient;
private boolean loadFriend(JFrame par,String userName,String password)
throws NumberFormatException,FileNotFoundException,IOException{
friendFile=new File(userName+SUFFIX_FILE);
if(!friendFile.exists()){
(new JOptionPane()).showMessageDialog(par,new JLabel("用戶不存在,你可以通過注冊來創建新用戶!"),
"用戶不存在",JOptionPane.ERROR_MESSAGE);
return false;
}
else{
fr=new BufferedReader(new FileReader(friendFile));
String s=fr.readLine();
passWord=s;
System.out.println(s);
System.out.println(password);
if(!s.equals(password)){
(new JOptionPane()).showMessageDialog(par,new JLabel("密碼錯誤!請重新輸入"),
"密碼錯誤",JOptionPane.ERROR_MESSAGE);
fr.close();
return false;
}
friendNum=Integer.parseInt(fr.readLine());
//friend=(friendNum==0)?null:new Friend[friendNum];
friend=new Friend[MAXFRIENDS];
for(int i=0;i<=friendNum-1;i++){
friend[i]=new Friend(fr.readLine(),fr.readLine(),fr.readLine());
friend[i].ID=i;
friend[i].isOnline=false;
friend[i].setActionCommand(""+i);
friend[i].addActionListener(this);
}
fr.close();
}
return true;
}
private boolean registUser(JFrame par,String userName,String password)throws FileNotFoundException,IOException{
File f=new File(userName+SUFFIX_FILE);
if(f.exists()){
(new JOptionPane()).showMessageDialog(par,new JLabel("用戶已經存在,創建失敗"),
"用戶已經存在",JOptionPane.ERROR_MESSAGE);
return false;
}
f.createNewFile();
PrintWriter pw=new PrintWriter(f);
pw.println(password);
pw.println(""+0);
pw.close();
return true;
}
private void saveFile() throws Exception{
int fn;
synchronized(friendLock){
fn=friendNum;
}
PrintStream sfps=new PrintStream(friendFile);
sfps.println(passWord);
sfps.println(""+fn);
for(int i=0;i<=fn-1;i++){
sfps.println(friend[i].name);
sfps.println(friend[i].IP);
sfps.println(friend[i].picAddr);
}
sfps.close();
}
public void logon()throws NumberFormatException,FileNotFoundException,IOException{
LogonGUI lg=new LogonGUI("chatDog Logon");
boolean isEnd=false;
while(!isEnd){
lg.reset();
lg.start();
while(lg.getMessage()==null){};
if((lg.getMessage()).equals(BTN_LOGONCAP)){
user=lg.getName();
if(loadFriend(lg.getFrame(),lg.getName(),lg.getPassword())){
isEnd=true;
}
}
else if((lg.getMessage()).equals(BTN_REGISTCAP)){
if(registUser(lg.getFrame(),lg.getName(),lg.getPassword())){
(new JOptionPane()).showMessageDialog(lg.getFrame(),new JLabel("用戶創建成功!"),
"用戶創建成功",JOptionPane.INFORMATION_MESSAGE);
}
}
else{
exit();
System.exit(0);
}
}
lg.hide();
System.out.println(user);
}
/*
*
* use socket
*
*/
private boolean isOnline(String hostName,String hostIP,int hostPort){
Socket sock=null;
BufferedReader sbfr=null;
PrintStream spw=null;
String rmsg=null;
try{sock=new Socket(hostIP,hostPort);}
catch(Exception e){
System.out.println("Socket check Friend: "+hostName+" "+hostIP+" "+e.getMessage());
if(e.getMessage().equals(CONNECTION_REFUSE)){
System.out.println(hostName+"is off Line!");
return false;
}
}
try{
sbfr=new BufferedReader(new InputStreamReader(sock.getInputStream()));
spw=new PrintStream(sock.getOutputStream());
sock.setSoTimeout(1000);
spw.println(MSG_ISONLINE);
rmsg=sbfr.readLine();
System.out.println("System: cheking "+hostName+" "+hostIP+":"+hostPort+" end");
if(rmsg==null) {
sock.close();
return false;
}
if(!rmsg.equals(MSG_IAMONLINE)){
sock.close();
return false;
}else if(sbfr.readLine().equals(hostName)){
sock.close();
return true;
}
}catch(Exception e){}
try{sock.close();}catch(Exception e){}
return false;
}
private int getPort(String name,String IP){
int port=SERVER_PORT;
boolean checkEnd=false;
while(!checkEnd&&port<=MAX_PORTNUM*PORT_DELTA+SERVER_PORT){
if(!isOnline(name,IP,port)) port+=PORT_DELTA;
else return port;
}
return -1;
}
private void checkFriend(int sID,int eID){
System.out.println("sID,eID:"+sID+","+eID+"----begin");
Socket sock=null;
BufferedReader sbfr=null;
PrintStream spw=null;
String rmsg=null;
boolean portCheckEnd=false;
boolean tempOnline=false;
for(int fID=sID;fID<=eID;fID++)
if(!friend[fID].isOnline){
portCheckEnd=false;
tempOnline=false;
friend[fID].port=SERVER_PORT;
while(!portCheckEnd&&friend[fID].port<=SERVER_PORT+MAX_PORTNUM*PORT_DELTA){
System.out.println("System: cheking "+friend[fID].name+" "+friend[fID].IP+":"+friend[fID].port+" begin");
try{sock=new Socket(friend[fID].IP,friend[fID].port);}
catch(Exception e){
System.out.println("Socket check Friend: "+friend[fID].name+" "+friend[fID].IP+" "+e.getMessage());
if(e.getMessage().equals(CONNECTION_REFUSE)){
System.out.println(friend[fID].name+"is off Line!");
friend[fID].setIsOnline(false);
friend[fID].port=friend[fID].port+PORT_DELTA;
continue;
}
}
try{
sbfr=new BufferedReader(new InputStreamReader(sock.getInputStream()));
spw=new PrintStream(sock.getOutputStream());
sock.setSoTimeout(1000);
spw.println(MSG_ISONLINE);
rmsg=sbfr.readLine();
System.out.println("System: cheking "+friend[fID].name+" "+friend[fID].IP+":"+friend[fID].port+" end");
if(rmsg==null) {
friend[fID].setIsOnline(false);
friend[fID].port=friend[fID].port+PORT_DELTA;
sock.close();
continue;
}
if(!rmsg.equals(MSG_IAMONLINE)){
friend[fID].setIsOnline(false);
friend[fID].port=friend[fID].port+PORT_DELTA;
sock.close();
continue;
}else if(sbfr.readLine().equals(friend[fID].name)){
friend[fID].setIsOnline(true);
portCheckEnd=true;
sock.close();
}else{
friend[fID].port=friend[fID].port+PORT_DELTA;
sock.close();
}
}catch(Exception e){friend[fID].port=friend[fID].port+PORT_DELTA;}
}
}
System.out.println("sID,eID:"+sID+","+eID+"----end");
}
public void checkFriend(){
int threadNum;
synchronized(friendLock){
System.out.println("friendNum"+friendNum);
threadNum=((int)friendNum/FNUM_PERTHREAD)*FNUM_PERTHREAD<friendNum?
((int)friendNum/FNUM_PERTHREAD+1):(int)friendNum/FNUM_PERTHREAD;
System.out.println("t Num:"+threadNum);
threadID=0;
while(threadID<=threadNum-1)
{
//for(threadID=0;threadID<=threadNum-1;){
System.out.println(threadID*FNUM_PERTHREAD);
(new Thread(){
public void run(){
int eID=(threadID+1)*FNUM_PERTHREAD-1;
eID=new Integer(eID>friendNum-1?friendNum-1:eID);
int sID=new Integer((threadID)*FNUM_PERTHREAD);
checkFriend(sID,eID);
}
}).start();
try{Thread.sleep(50);}catch(Exception e){}
/*
*
*I did not think a better way to solve the Synchronized of threadID
*
*
*/
threadID++;
}
}
}
private void sortFriend(){
int i=0,j=friendNum-1;
Friend temp=null;
while(i<j)
{
while(!friend[i].isOnline&&i<j)i++;
while(friend[j].isOnline&&j>i)j--;
if(i<j){
temp=friend[j].clone();
friend[j]=friend[i].clone();
friend[i]=temp.clone();
}
}
}
/*
*
* USE SERVER SOCKET
*
*/
private void openPort()throws IOException {
boolean isPortOpen=false;
serverSock=null;
REMOTE_PORT=SERVER_PORT;
while(!isPortOpen&&REMOTE_PORT<=SERVER_PORT+MAX_PORTNUM*PORT_DELTA){
try{serverSock=new ServerSocket(REMOTE_PORT); isPortOpen=true;}
catch(Exception e){
REMOTE_PORT+=PORT_DELTA;
}
}
if(!isPortOpen){
(new JOptionPane()).showMessageDialog(null,new JLabel("打開的ChatDog已經超過最大限制,請你關閉一個再試"),
"窗口超過限制",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
//InetAddress getLIP=new InetAddress();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -