哦,類太多了,比如vo類,實現類,就不貼了。況且這些課技術含量也不大。
如果有需要,妳留下郵箱,我給妳發兩個工程和數據庫代碼。
服務器類別:
套餐聊天;
導入impl。UserImpl
導入Java . io . io exception;
導入Java . io . inputstream;
導入Java . io . objectinputstream;
導入Java . io . object output stream;
導入Java . io . output stream;
導入Java . net . server socket;
導入Java . net . socket;
導入vo。Userinfo
進口刀。UserDao
/**
* server類,用於接受來自客戶端的請求,該系統規定來自客戶端的每個請求至少有兩個參數,第壹個用於標識請求將做什麽,下壹個是
*參數是客戶端請求服務的必要參數。
*
* @作者程生
* @版本0.1
* @日期09-01-08
*
*/
公共類ChatServer擴展線程{
//定義最大連接數。
private static final int MAXLINK = 50;
//記錄當前的連接數
public static int linkNum = 0;
//定義服務連接對象
私有靜態服務器套接字ss;
公共靜態void main(String[] args)引發異常{
//實例化服務類
ss = new server socket(8001);
//啟用多線程:其實就是調用run方法。看來沒必要再開壹個線程了。哎,寫了就不會改了。
新的ChatServer()。start();
System.out.println("服務器成功啟動………………………………………………);
}
/*
*覆蓋運行方法
*/
公共無效運行(){
Socket soc = null
嘗試{
//循環監聽客戶端請求。
while (true) {
while (true) {
//如果連接數已滿,則等待。
if(linkNum & gt;= MAXLINK)
this . sleep(100);
否則{
打破;
}
}
//監聽請求
SOC = ss . accept();
//向連接添加壹個
linknum++;
//獲取socket對象後調用處理類。
新操作(SOC);
}
} catch(異常e) {
system . out . println(e);
}最後{
如果(soc!= null) {
嘗試{
SOC . close();
ss . close();
} catch (IOException e) {
e . printstacktrace();
}
System.out.println("服務器出現莫名其妙的故障,服務器退出!");
}
}
}
}
/**
*操作類,用於處理來自客戶端的請求。
*
* @作者管理員
*
*/
操作類{
//後跟壹個變量,該變量定義客戶端發送的第壹個請求將做什麽。
私有字符串操作;
/**
*以下代碼行用於聲明網絡操作所需的變量。
*/
私有套接字soc = null
私有InputStream ips = null
private OutputStream ops = null
private object output stream soops = null;
private ObjectInputStream soips = null;
/**
*構造函數,上面定義的變量在其中賦值。
*
* @param soc
*/
操作(插座soc) {
this.soc = soc
嘗試{
IPS = SOC . getinputstream();
ops = SOC . get output stream();
soips = new ObjectInputStream(IPS);
//接收客戶端發來的第壹個請求,用來標識這個請求的內容。
operate = soips.readObject()。toString();
} catch(異常e) {
system . out . println(e);
}
//調用實際的操作方法
which ope();
}
/**
*判斷是哪個操作。
*/
私有void whichOpe() {
if("登錄"。等於(運算)){
log in();
}否則{
如果(“”。等於(運算)){
}
}
}
/**
*連接到數據庫進行登錄驗證。
*/
私有無效登錄(){
UserDao UserDao = new user impl();
Userinfo user = null
嘗試{
//從客戶端讀取數據。
user =(Userinfo)so IPS . read object();
user = userdao.login(用戶);
soops =新對象輸出流(ops);
//將結果傳遞給客戶端。
soops.writeObject(用戶);
soops . flush();
} catch(異常e) {
e . printstacktrace();
}最後{
嘗試{
soops . close();
so IPS . close();
SOC . close();
//將連接數減少壹個。
chatserver . linknum-;
} catch (IOException e) {
system . out . println(e);
}
}
}
}
兩類客戶:
打包客戶端;
導入Java . awt . font;
導入Java . awt . gridlayout;
導入Java . awt . textfield;
導入Java . awt . window;
導入Java . awt . event . action event;
導入Java . awt . event . action listener;
導入Java . io . io exception;
導入Java . io . inputstream;
導入Java . io . objectinputstream;
導入Java . io . object output stream;
導入Java . io . output stream;
導入Java . net . socket;
導入javax . swing . jbutton;
導入javax . swing . jframe;
導入javax . swing . jlabel;
導入javax . swing . joptionpane;
導入javax . swing . jpanel;
導入javax . swing . jtextfield;
導入vo。Userinfo
/**
*登錄接口,繼承自jframe類。
*
* @作者程生
* @版本0.1
* @日期09-01-08
* @地址學校宿舍:綜合樓424
*
*/
公共類登錄擴展JFrame {
private final int TEXTSIZE = 10;//定義文本長度的值
Private JLabel lname = new JLabel("用戶名");
private jlabel lpassword = new jlabel(" password ");
Private JLabel lhead = new JLabel("用戶登錄");
private JButton bok = new JButton(" log in ");
private jbutton b cancel = new jbutton(" exit ");
private JPanel pcenter = new JPanel();
private JPanel pname = new JPanel();
private JPanel ppwd = new JPanel();
private JPanel psouth = new JPanel();
private JPanel p north = new JPanel();
private TextField pwd = new TextField(TEXTSIZE);
private JTextField name = new JTextField(TEXTSIZE);
private GridLayout glayout = new GridLayout();
公共登錄(){
//設置接口的大小和位置。
this.setBounds(300,200,320,250);
This.setTitle("用戶登錄");
this . setresizable(false);
//設置如何關閉窗口。
this . setdefaultcloseoperation(this。EXIT _ ON _ CLOSE);
//布局窗口
this . frame layout();
//添加事件
this . addaction();
//顯示窗口
this . show();
}
/**
* @param args
*/
公共靜態void main(String[] args) {
// TODO自動生成的方法存根
新登錄();
}
/**
*集裝箱的排列
*/
私有最終void frameLayout() {
lhead.setFont(新字體(",字體。粗體,28));
glayout . set columns(1);
glayout . set rows(2);
p center . set layout(glayout);
pname . add(lname);
pname.add(名稱);
pwd . setechochar(' * ');
ppwd . add(lpassword);
ppwd . add(pwd);
p north . add(lhead);
psouth . add(bok);
psouth . add(b cancel);
PC enter . add(pname);
pcenter . add(ppwd);
this.add(pnorth,“北”);
this.add(pcenter," Center ");
this.add(psouth,“南”);
}
/**
*添加事件
*/
私有最終void addAction() {
bok . addactionlistener(new AddAction());
b cancel . addactionlistener(new AddAction());
name . addactionlistener(new AddAction());
pwd . addactionlistener(new AddAction());
}
/**
*該類是用於事件處理的內置類。
*
* @作者管理員
*
*/
私有類AddAction實現ActionListener {
public void action performed(action event e){
if (e.getSource() == bcancel) {
system . exit(0);
}否則{
如果(“”。equals(name.getText()) || " "。equals(pwd . gettext()){
Joptionpane。顯示消息對話框(登錄。這個,“用戶名和密碼不能為空”);
}否則{
嘗試{
//判斷輸入數據是否合法。
integer . parse int(name . gettext());
} catch (Exception ex) {
Joptionpane。顯示消息對話框(登錄。這個,“請正確輸入數字”);
返回;
}
新建TcpLogin(name.getText()、pwd.getText())。check();
}
}
}
}
/**
*登錄認證類,內置類將用戶名和密碼傳輸到服務器進行認證。
*
* @作者程生
* @版本0.1
* @日期09-01-08
*/
類TcpLogin {
私有int名稱;
私有字符串pwd =
/**
*構造函數初始化用戶名和密碼的值。
*
* @param name
* @參數密碼
*/
TcpLogin(字符串名稱,字符串密碼){
this . name = integer . parse int(name);
this.pwd = pwd
}
/**
*連接到服務器並驗證用戶信息。
*/
作廢支票(){
Window wait win = new Window(log in . this);
//獲取接口
log in log in = log in . this;
Userinfo user = new Userinfo();
user.setUserId(名稱);
user . set password(pwd);
Socket soc = null
InputStream ips = null
OutputStream ops = null
ObjectInputStream coips = null
ObjectOutputStream coops = null
嘗試{
soc =新插座(" 127.0.0.1 ",8001);
IPS = SOC . getinputstream();
ops = SOC . get output stream();
coops =新對象輸出流(ops);
coops . writeobject(" log in ");
coops.writeObject(用戶);
coops . flush();
ObjectInputStream oips =新的ObjectInputStream(IPS);
user = null
user =(Userinfo)oips . read object();
如果(用戶!= null){
新西哈(用戶);
log in . dispose();
}
否則{
Joptionpane。顯示消息對話框(登錄,“用戶名和密碼錯誤”);
}
} catch(異常e) {
e . printstacktrace();
}最後{
嘗試{
IPS . close();
ops . close();
SOC . close();
} catch (IOException e) {
e . printstacktrace();
}
}
}
}
}
打包客戶端;
導入Java . awt . gridlayout;
導入Java . awt . textarea;
導入Java . awt . event . action event;
導入Java . awt . event . action listener;
導入Java . awt . event . mouse adapter;
導入Java . awt . event . mouse event;
導入Java . util . ArrayList;
導入Java . util . iterator;
導入Java . util . list;
導入Java . util . set;
導入javax . swing . jbutton;
導入javax . swing . jframe;
導入javax . swing . jlabel;
導入javax . swing . jpanel;
導入javax . swing . jscrollpane;
導入javax . swing . jtextarea;
導入javax . swing . jtextfield;
導入javax . swing . jtree;
導入javax . swing . timer;
導入javax . swing . tree . defaultmutabletreenode;
導入vo。Groupinfo
導入vo。Relationinfo
導入vo。Userinfo
/**
*這個類是這個程序的客戶端的主接口。經過長時間的思考,我決定把它叫做“嘻哈”,意思是“嘻Xi哈哈”。
*
* @作者程生
* @版本0.1
* @日期09-01-08
* @地址學校宿舍:綜合樓424
*/
公共類XiHa擴展JFrame {
//朋友信息
靜態列表& ltUserinfo & gtfriends = new ArrayList & ltUserinfo & gt();
//用戶信息
private Userinfo user = null
private JPanel ptree = new JPanel();
private JPanel psouth = new JPanel();
private JButton bfind = new JButton(" search ");
private jbutton b system = new jbutton("系統設置");
/**
*構造函數,設置接口的基本參數。
*/
公共XiHa(Userinfo用戶){
this.user =用戶;
This.setTitle(《西Xi哈哈》);
this . setdefaultcloseoperation(this。EXIT _ ON _ CLOSE);
this.setBounds(800,100,200,500);
this . setresizable(false);
//布局界面
init frame();
//this . pack();
this . set visible(true);
}
/**
*用於界面布局
*/
私有void initFrame() {
ptree . add(new JScrollPane(new create tree(user))。create node()));
psouth . add(b system);
psouth . add(bfind);
this.add(ptree," Center ");
this.add(psouth,“南”);
}
}
/**
*這個類用於創建壹個以用戶信息為節點的樹。
*
* @作者程生
* @版本0.1
* @日期09-01-08
* @地址學校宿舍:綜合樓424
*
*/
類別CreateTree {
JTree tree = null
private Userinfo user = null
CreateTree(Userinfo用戶){
this.user =用戶;
}
/**
*用服務器返回的數據創建壹個樹。
*
* @返回
*/
JTree createNode() {
//根節點
defaultmutabletreenode all = new defaultmutabletreenode(" all friends ");
設置& ltGroupinfo & gtgroups = user . getgroupinfos();
設置& ltRelationinfo & gtrelations = user . getrelationinfosforuserid();
叠代器& ltGroupinfo & gtig = groups . iterator();
叠代器& ltRelationinfo & gtir = null
Groupinfo group = null
Relationinfo relation = null
DefaultMutableTreeNode friendNode = null;
Userinfo friend = null
while (ig.hasNext()) {
group = ig . next();
friendNode = new DefaultMutableTreeNode(group . get group name());
IR = relations . iterator();
while (ir.hasNext()) {
relation = IR . next();
if(relation . getresidegroupid()= = group . get groupid()){
friend = relation . get friend();
friendNode.add(新的DefaultMutableTreeNode(friend
。getPetname()
+"("+relation . get friendid()+"));
XiHa.friends.add(朋友);
}
}
all . add(friendNode);
//root tree . add(friendNode);
}
tree=new JTree(全部);
tree . addmouse listener(new tree listener());
返回樹;
}
/**
*該類是用於創建樹的內置類,用於節點的事件處理。
*
* @作者程生
* @版本0.1
* @日期09-01-09
* @地址學校宿舍:綜合樓424
*/
類TreeListener擴展MouseAdapter{
private JFrame friendInfo = null
私有字符串nodeInfo =
//用於區分單擊和雙擊。
Timer mouseTimer = null
/*
*覆蓋mouseAdapter中的mouseClicked方法,該方法在鼠標單擊時觸發。
*/
public void mouse clicked(mouse event e){
//返回選定的節點。
DefaultMutableTreeNode treeNode = null;
treeNode =(DefaultMutableTreeNode)create tree . this . tree . getlastselectedpathcomponent();
if(treeNode==null)返回;
//如果不是葉節點,則返回。
如果(!treeNode.isLeaf())返回;
node info = treenode . tostring();
if(e . getclickcount()= = 1){
mouse timer = new javax . swing . timer(350,new ActionListener() {
public void action performed(ActionEvent evt){
//布局信息界面
initFriendInfo();
mouse timer . stop();
}
});
mouse timer . restart();
}否則{
if(e . getclickcount()= = 2 & amp;& ampmouseTimer.isRunning()){
mouse timer . stop();
//實例化聊天接口
new win chat();
}
}
}
/**
*布局friendInfo界面
*/
private void initFriendInfo() {
friendInfo = new JFrame();
friendInfo.setSize(300,120);
friendInfo . setdefaultcloseoperation(friendInfo。DISPOSE _ ON _ CLOSE);
friendinfo . setlocationrelativeto(null);
friendInfoContent(this . treat());
friendinfo . set visible(true);
}
/**
*設置窗口中的具體內容。
* @param friendId
* @返回
*/
private void friendInfoContent(int friendId){
friendinfo . dispose();
userinfo friend = this . find friend(friendId);
JPanel pmain = new JPanel();
pmain . set layout(new GridLayout(3,1));
JPanel panel 1 = new JPanel();
panel 1 . add(new JLabel(" Hip hop number:"+friend . get userid()+"+"昵稱:"+friend . get petname()));
JPanel panel 2 = new JPanel();
panel 2 . add(new JLabel(" name:"+(friend . getname()= = null?" ":friend.getName())+" "+ "+"年齡:"+friend.getage ()+"+"性別:"+friend . getsex());
JPanel panel 3 = new JPanel();
Panel3.add(new JLabel("個性化簽名:"+(friend.getAutograph()==null?" ":friend . getautograph())));
pmain . add(panel 1);pmain . add(panel 2);pmain . add(panel 3);
friendinfo . add(pmain);
}
/**
*該方法用於從節點上的文本中獲取好友的id號。
* @返回好友id
*/
private int treat(){
int len=nodeInfo.getBytes()。長度;
int friendId = integer . parse int(new String(node info . getbytes()、len-5,4));
返回friendId
}
/**
*該方法用於通過id查找好友信息。
* @param friendId
* @返回朋友信息
*/
private Userinfo find friend(int friendId){
Userinfo friend = null
叠代器friends = xiha . friends . iterator();
while(friends.hasNext()){
Userinfo ifriend =(Userinfo)friends . next();
if(ifriend . get userid()= = friendId){
friend = ifriend
打破;
}
}
回報朋友;
}
}
}
/**
*不知道這種聊天窗口怎麽寫,現在有點不知所措。剛剛和網友交流了壹下。
*我覺得前面寫的通信代碼很不規範,應該重寫。哎,先寫界面。
*
*馬上要回去過年了,可能沒那麽多時間寫這個系統。
* @作者程生
* @版本0.1
* @ date 09-01-11
* @地址學校宿舍:綜合樓424
*
*/
類WinChat擴展JFrame{
private JPanel pmain = new JPanel();
private JPanel pcether = new JPanel();
private JPanel psouth = new JPanel();
//private JTextArea precode = new JTextArea(JTextArea。);
}