古詩詞大全網 - 藝術簽名 - 如何擁有java socket實現用類似QQ的表情發送和接收詳細點代碼?

如何擁有java socket實現用類似QQ的表情發送和接收詳細點代碼?

哈,我正在做壹個類似qq的系統,還沒完成,但是可以運行。現在只實現登錄,顯示分組,列出好友,查看好友信息工作簿,看代碼。

哦,類太多了,比如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。);

}