當前位置:編程學習大全網 - 編程語言 - 怎樣有java socket實現發送接受表情類似QQ詳細點代碼

怎樣有java socket實現發送接受表情類似QQ詳細點代碼

哈 我正好在做壹個類似qq的系統,不過還沒完工,不過可以運行,現在只實現了登錄,顯示分組,列出好友,查看好友信息功冊,看看代碼吧

哎 類太多了,像什麽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.);

}

  • 上一篇:看《極速車王》,妳需要了解這些"故事"
  • 下一篇:電腦出現藍屏是什麽問題 BBCcode:100000b8
  • copyright 2024編程學習大全網