哎 類太多了,像什麽vo類及實現類我就不發了,再說這些類沒什麽技術含量
如果有必要的話 妳留下郵箱,我將兩個工程和數據庫代碼發給妳
服務器類:
package chat;
import impl.UserImpl;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import vo.Userinfo;
import dao.UserDao;
/**
* 服務器類,用於接受來自客戶端的請求,本系統規定來自客戶端每壹次請求 所傳過來的參數不少於兩個,第壹個用來標識此次請求將做什麽操作,後面
* 的參數為客戶端請求服務所需的必要參數
*
* @author 程勝
* @version 0.1
* @date 09-01-08
*
*/
public class ChatServer extends Thread {
// 定義最大連接數
private static final int MAXLINK = 50;
// 記錄當前連接數
public static int linkNum = 0;
// 定義服務連接對象
private static ServerSocket ss;
public static void main(String[] args) throws Exception {
// 實例化服務類
ss = new ServerSocket(8001);
// 啟用多線程:其實就是調用run方法,好像沒必要另啟線程,哎 寫好了 就不改了
new ChatServer().start();
System.out.println("服務器已成功啟動…………");
}
/*
* 覆寫run方法
*/
public void run() {
Socket soc = null;
try {
// 循環監聽客戶端請求
while (true) {
while (true) {
// 如果連接數已滿,則等待
if (linkNum >= MAXLINK)
this.sleep(100);
else {
break;
}
}
// 監聽請求
soc = ss.accept();
// 將連接加壹
linkNum++;
// 獲得socket對象後調用處理類
new Operate(soc);
}
} catch (Exception e) {
System.out.println(e);
} finally {
if (soc != null) {
try {
soc.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("服務器出現莫名故障,服務器退出!");
}
}
}
}
/**
* 操作類,用來處理來自客戶端的請求
*
* @author Administrator
*
*/
class Operate {
// 接定義用於實別客戶端發來的頭號請求將做何操作的變量
private String operate;
/**
* 以下幾行用於聲明網絡操作的必要變量
*/
private Socket soc = null;
private InputStream ips = null;
private OutputStream ops = null;
private ObjectOutputStream soops = null;
private ObjectInputStream soips = null;
/**
* 構造函數,在其中為以上定義的變量的賦值
*
* @param soc
*/
Operate(Socket soc) {
this.soc = soc;
try {
ips = soc.getInputStream();
ops = soc.getOutputStream();
soips = new ObjectInputStream(ips);
// 接收從客戶端發來的頭號請求,它用於實別此次請求的內容
operate = soips.readObject().toString();
} catch (Exception e) {
System.out.println(e);
}
// 調用實際操作方法
whichOpe();
}
/**
* 判斷是哪個操作
*/
private void whichOpe() {
if ("login".equals(operate)) {
login();
} else {
if ("".equals(operate)) {
}
}
}
/**
* 連接數據庫,進行登錄驗證
*/
private void login() {
UserDao userdao = new UserImpl();
Userinfo user = null;
try {
// 讀取從客戶端傳過來的數據
user = (Userinfo) soips.readObject();
user = userdao.login(user);
soops = new ObjectOutputStream(ops);
// 將結果傳給客戶端
soops.writeObject(user);
soops.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
soops.close();
soips.close();
soc.close();
// 將連接數減壹
ChatServer.linkNum--;
} catch (IOException e) {
System.out.println(e);
}
}
}
}
客戶端的兩個類:
package client;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import vo.Userinfo;
/**
* 登錄界面,繼承自jframe類
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*
*/
public class Login extends JFrame {
private final int TEXTSIZE = 10;// 定義文本長度的值
private JLabel lname = new JLabel("用戶名");
private JLabel lpassword = new JLabel("密碼");
private JLabel lhead = new JLabel("用戶登錄");
private JButton bok = new JButton("登錄");
private JButton bcancel = new JButton("退出");
private JPanel pcenter = new JPanel();
private JPanel pname = new JPanel();
private JPanel ppwd = new JPanel();
private JPanel psouth = new JPanel();
private JPanel pnorth = new JPanel();
private TextField pwd = new TextField(TEXTSIZE);
private JTextField name = new JTextField(TEXTSIZE);
private GridLayout glayout = new GridLayout();
public Login() {
// 設置界面大小及位置
this.setBounds(300, 200, 320, 250);
this.setTitle("用戶登錄");
this.setResizable(false);
// 設置窗口的關閉方式
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
// 布置窗口
this.frameLayout();
// 添加事件
this.addAction();
// 顯示窗口
this.show();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Login();
}
/**
* 布置容器
*/
private final void frameLayout() {
lhead.setFont(new Font("", Font.BOLD, 28));
glayout.setColumns(1);
glayout.setRows(2);
pcenter.setLayout(glayout);
pname.add(lname);
pname.add(name);
pwd.setEchoChar('*');
ppwd.add(lpassword);
ppwd.add(pwd);
pnorth.add(lhead);
psouth.add(bok);
psouth.add(bcancel);
pcenter.add(pname);
pcenter.add(ppwd);
this.add(pnorth, "North");
this.add(pcenter, "Center");
this.add(psouth, "South");
}
/**
* 添加事件
*/
private final void addAction() {
bok.addActionListener(new AddAction());
bcancel.addActionListener(new AddAction());
name.addActionListener(new AddAction());
pwd.addActionListener(new AddAction());
}
/**
* 此類為內置類,用於事件處理
*
* @author Administrator
*
*/
private class AddAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bcancel) {
System.exit(0);
} else {
if ("".equals(name.getText()) || "".equals(pwd.getText())) {
JOptionPane.showMessageDialog(Login.this, "用戶名和密碼不能為空");
} else {
try {
// 判斷輸入的數據是否合法
Integer.parseInt(name.getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(Login.this, "請正確輸入號碼");
return;
}
new TcpLogin(name.getText(), pwd.getText()).check();
}
}
}
}
/**
* 登錄驗證類,內置類 將用戶名和密碼傳到服務器做驗證
*
* @author 程勝
* @version 0.1
* @date 09-01-08
*/
class TcpLogin {
private int name;
private String pwd = "";
/**
* 構造函數,初始化用戶名和密碼的值
*
* @param name
* @param pwd
*/
TcpLogin(String name, String pwd) {
this.name = Integer.parseInt(name);
this.pwd = pwd;
}
/**
* 連接服務器,驗證用戶信息方法
*/
void check() {
Window waitWin=new Window(Login.this);
// 獲得界面
Login login = Login.this;
Userinfo user = new Userinfo();
user.setUserId(name);
user.setPassword(pwd);
Socket soc = null;
InputStream ips = null;
OutputStream ops = null;
ObjectInputStream coips = null;
ObjectOutputStream coops = null;
try {
soc = new Socket("127.0.0.1", 8001);
ips = soc.getInputStream();
ops = soc.getOutputStream();
coops = new ObjectOutputStream(ops);
coops.writeObject("login");
coops.writeObject(user);
coops.flush();
ObjectInputStream oips = new ObjectInputStream(ips);
user = null;
user = (Userinfo) oips.readObject();
if (user != null){
new XiHa(user);
login.dispose();
}
else {
JOptionPane.showMessageDialog(login, "用戶名和密碼錯誤");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ips.close();
ops.close();
soc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package client;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import vo.Groupinfo;
import vo.Relationinfo;
import vo.Userinfo;
/**
* 此類為本程序客戶端的主界面,剛想了好會兒決定取名叫’嘻哈‘ 意為’嘻嘻哈哈‘
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*/
public class XiHa extends JFrame {
// 好友信息
static List<Userinfo> friends = new ArrayList<Userinfo>();
// 用戶信息
private Userinfo user = null;
private JPanel ptree = new JPanel();
private JPanel psouth = new JPanel();
private JButton bfind = new JButton("查找");
private JButton bsystem = new JButton("系統設置");
/**
* 構造函數,設置界面基本參數
*/
public XiHa(Userinfo user) {
this.user = user;
this.setTitle("嘻嘻哈哈");
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setBounds(800, 100, 200, 500);
this.setResizable(false);
// 布置界面
initFrame();
// this.pack();
this.setVisible(true);
}
/**
* 用於界面布置
*/
private void initFrame() {
ptree.add(new JScrollPane(new CreateTree(user).createNode()));
psouth.add(bsystem);
psouth.add(bfind);
this.add(ptree, "Center");
this.add(psouth, "South");
}
}
/**
* 本類用於創建以用戶信息為節點的樹
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*
*/
class CreateTree {
JTree tree=null;
private Userinfo user = null;
CreateTree(Userinfo user) {
this.user = user;
}
/**
* 用服務器傳回的數據創建壹棵樹
*
* @return
*/
JTree createNode() {
//根結點
DefaultMutableTreeNode all = new DefaultMutableTreeNode("所有好友");
Set<Groupinfo> groups = user.getGroupinfos();
Set<Relationinfo> relations = user.getRelationinfosForUserId();
Iterator<Groupinfo> ig = groups.iterator();
Iterator<Relationinfo> ir = null;
Groupinfo group = null;
Relationinfo relation = null;
DefaultMutableTreeNode friendNode = null;
Userinfo friend = null;
while (ig.hasNext()) {
group = ig.next();
friendNode = new DefaultMutableTreeNode(group.getGroupName());
ir = relations.iterator();
while (ir.hasNext()) {
relation = ir.next();
if (relation.getResideGroupId() == group.getGroupId()) {
friend = relation.getFriend();
friendNode.add(new DefaultMutableTreeNode(friend
.getPetname()
+ "(" + relation.getFriendId() + ")"));
XiHa.friends.add(friend);
}
}
all.add(friendNode);
// rootTree.add(friendNode);
}
tree=new JTree(all);
tree.addMouseListener(new TreeListener());
return tree;
}
/**
* 此類為創建樹的內置類,用於對結點的事件處理
*
* @author 程勝
* @version 0.1
* @date 09-01-09
* @address 學校寢室:綜合樓424
*/
class TreeListener extends MouseAdapter{
private JFrame friendInfo=null;
private String nodeInfo="";
//用於區分單擊雙擊
Timer mouseTimer =null;
/*
* 覆寫mouseAdapter中的mouseClicked方法,鼠標點擊時觸發
*/
public void mouseClicked(MouseEvent e){
//返回選定的結點
DefaultMutableTreeNode treeNode =null;
treeNode =(DefaultMutableTreeNode)CreateTree.this.tree.getLastSelectedPathComponent();
if(treeNode==null)return;
//如果它不是葉子結點就返回
if(!treeNode.isLeaf())return;
nodeInfo=treeNode.toString();
if(e.getClickCount()==1){
mouseTimer = new javax.swing.Timer(350, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//布置信息界面
initFriendInfo();
mouseTimer.stop();
}
});
mouseTimer.restart();
}else{
if(e.getClickCount()==2&&mouseTimer.isRunning()){
mouseTimer.stop();
//實例化聊天界面
new WinChat();
}
}
}
/**
* 布置friendInfo的界面
*/
private void initFriendInfo() {
friendInfo=new JFrame();
friendInfo.setSize(300,120);
friendInfo.setDefaultCloseOperation(friendInfo.DISPOSE_ON_CLOSE);
friendInfo.setLocationRelativeTo(null);
friendInfoContent(this.treat());
friendInfo.setVisible(true);
}
/**
* 設置窗口中的具體內容
* @param friendId
* @return
*/
private void friendInfoContent(int friendId) {
friendInfo.dispose();
Userinfo friend=this.findFriend(friendId);
JPanel pmain=new JPanel();
pmain.setLayout(new GridLayout(3,1));
JPanel panel1=new JPanel();
panel1.add(new JLabel("嘻哈號:"+friend.getUserId()+" "+"昵稱:"+friend.getPetname()));
JPanel panel2=new JPanel();
panel2.add(new JLabel("姓名:"+(friend.getName()==null?"":friend.getName())+" "+"年齡:"+friend.getAge()+" "+"性別:"+friend.getSex()));
JPanel panel3=new JPanel();
panel3.add(new JLabel("個性簽名: "+(friend.getAutograph()==null?"":friend.getAutograph())));
pmain.add(panel1);pmain.add(panel2);pmain.add(panel3);
friendInfo.add(pmain);
}
/**
* 此方法用於獲得好友的id號 從節點上的文本中獲取
* @return 好友id
*/
private int treat(){
int len=nodeInfo.getBytes().length;
int friendId=Integer.parseInt(new String(nodeInfo.getBytes(),len-5,4));
return friendId;
}
/**
* 此方法用於按id查找好友信息
* @param friendId
* @return 好友信息
*/
private Userinfo findFriend(int friendId){
Userinfo friend=null;
Iterator friends=XiHa.friends.iterator();
while(friends.hasNext()){
Userinfo ifriend=(Userinfo)friends.next();
if(ifriend.getUserId()==friendId){
friend=ifriend;
break;
}
}
return friend;
}
}
}
/**
* 本類聊天窗口類,還不知道該怎麽寫,現在有點茫然,剛跟網友交流了壹下
* 覺得前面寫的通信代碼很不規範,應該重新寫,哎 先把界面寫好再說
*
* 壹會兒就要回去過年了,可能就沒那麽時間寫這個系統了
* @author 程勝
* @version 0.1
* @date 09-01-11
* @address 學校寢室:綜合樓424
*
*/
class WinChat extends JFrame{
private JPanel pmain=new JPanel();
private JPanel pcether=new JPanel();
private JPanel psouth=new JPanel();
//private JTextArea precod=new JTextArea(JTextArea.);
}