用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

简单通讯

2016-07-08 作者: 嶙峋举报

[java]代码库

package client;
 
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.Date;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
import server.ManagerClientConServerThread;
import server.Message;
 
 
 
//因为客户端要不断读取信息,所以也是一个线程类
public class Chat extends JFrame implements ActionListener
{      static String receiver;
     //声明各组件************************
    JTextArea jta=null;     
    JButton jb=null;
    JTextField jtf=null;
    JPanel jp=null;
    JScrollPane jsp=null;
    PrintWriter pw=null;
     //声明各组件************************
     
 
    String ownername;
    String friendname;
    public Chat(String ownername,String friendname)
    {   this.ownername=ownername;
        this.friendname=friendname;
        //设置窗体属性************************************************************
        jta=new JTextArea();                        //创建文本域对象
        jta.setEditable(false);
        jb=new JButton("发送");                       //创建按钮对象
        jb.addActionListener(this);                 //给按钮添加事件源对象
        jtf=new JTextField(15);                     //创建文本框对象
        jp=new JPanel(){{ add(jtf);add(jb); }};     //创建界面对象jp,在界面中添加文本框和按钮
        jsp=new JScrollPane(jta);                   //在滚动条中添加文本域
         
         this.setTitle(ownername+"正在和"+friendname+"聊天");        //设置窗体的标题  
         this.setSize(400,300);                     //设置窗体的大小
         this.setDefaultCloseOperation(2);          //关闭一个聊天框,不是全部关闭,所以选择方式2,方式3是关闭全部窗体
         this.setLocationRelativeTo(null);          //设置窗体出现在屏幕中间
         this.setResizable(false);                  //设置窗体不可改变大小
         this.setLayout(new BorderLayout());        //设置窗体为空布局
         this.add(jsp,BorderLayout.CENTER);         //将面板jsp添加到窗体的中间区域
         this.add(jp,BorderLayout.SOUTH);           //将面板jp添加到窗体的下方区域
         this.setVisible(true);                     //设置窗体可见
       //设置窗体属性************************************************************
    }
 
 
    public void actionPerformed(ActionEvent e)   //发送信息
    {
        Message m=new Message();
        m.setSender(this.ownername);   //要发什么就封装什么
        m.setGetter(this.friendname);
        m.setCon(jtf.getText());
        m.setSendtime(new Date().toString());
        m.setMesType("3");
         
        try
        {
            String xinxi=jtf.getText();
            String time=new Date().toString();
            jta.append(m.getSender()+":"+xinxi+"\t"+time+"\r\n"); 
             //得到自己的线程
            ObjectOutputStream oos=new ObjectOutputStream(ManagerClientConServerThread.getClientConServerThread(m.getSender()).getS().getOutputStream());
            oos.writeObject(m);
            jtf.setText("");
             
        }catch(Exception e2){e2.printStackTrace();}
 
    }
     
 
    public void setText(Message m)
    
        jta.append(m.getSender()+":"+m.getCon()+"\r\n");
    }
 
 
}
package client;
 
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
 
import server.ManagerClientConServerThread;
import server.Message;
import server.User;
 
 
 
public class ClientConnectServer {
 
    public Socket s;
 
    // 发送第一次请求
    public boolean sendLoginInfoToServer(Object o)
    {
        boolean b = false;
 
        try {
            long beginTime=System.currentTimeMillis();
            s=new Socket();
            SocketAddress socketAddress=new InetSocketAddress("127.0.0.1", 9999);  //InetSocketAddress(服务器地址,端口号)
            s.connect(socketAddress, 60000);     //设定连接等待时间60000毫秒
            long endTime=System.currentTimeMillis();
            ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
            oos.writeObject(o);
 
            Message m = (Message)new ObjectInputStream(s.getInputStream()).readObject();//读取对象流的信息
 
            if (m.getMesType().equals("1")) {
                // 就创建一个该qq号和服务器端保持通讯连接得线程
                ClientConServerThread ccst = new ClientConServerThread(s);
                new Thread(ccst).start();
                ManagerClientConServerThread.addClientConServerThread( ((User) o).getName(), ccst);
                b = true;
                long connectTime=endTime-beginTime;       
                System.out.println(socketAddress+":"+connectTime); //输出连接花费的时间
            }
             
            else  s.close();   // 关闭Scoket
 
        } catch (Exception e) {e.printStackTrace();}
        return b;
    }
 
    public Socket getSocket() {
        return s;
    }
 
    public void SendInfoToServer(Object o) {
     
    }
}
package client;
 
//客户端和服务器保持通讯的类
import java.io.*;
import java.net.*;
 
import server.ChatThread;
import server.FriendListThread;
import server.Message;
 
 
public class ClientConServerThread implements Runnable {
 
    private Socket s;
 
    public Socket getS() {
        return s;
    }
 
    public void setS(Socket s) {
        this.s = s;
    }
 
    public ClientConServerThread(Socket s) {
        this.s = s;
    }
 
    public void run() {
        while (true)
        {
            try {
                Message m = (Message) new ObjectInputStream(s.getInputStream()).readObject();//读取对象流数据存入m中
                 
                if(m.getMesType().equals("3")) //如果是普通信息包
                    {
                         ChatThread.get(m.getGetter() + " "+ m.getSender()).setText(m);
                    }
                 
                else if(m.getMesType().equals("4")) //如果是好友在线包
                    {
                    FriendList friendlist=FriendListThread.getQqFriendList(m.getGetter());
                    friendlist.updateFriend(m);          //更新在线的朋友
                    }
                 
                 
                }catch (Exception e) {}    
        }
    }
 
}
package client;
 
import server.User;
 
 
public class ClientUser {
 
    public  boolean checkUser(User u)
    
        return new ClientConnectServer().sendLoginInfoToServer(u);
    }
     
}
package client;
 
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
 
import server.ChatThread;
import server.Message;
 
 
 
public class FriendList extends JFrame implements MouseListener{
     
    JPanel jphy1,jphy2,jphy3;
    JButton jphy_jb1,jphy_jb2,jphy_jb3;
    JScrollPane jsp1;
    String owner;
    JPanel jpmsr1,jpmsr2,jpmsr3;
    JButton jpmsr_jb1,jpmsr_jb2,jpmsr_jb3;
    JScrollPane jsp2;
    public static JLabel []jbs1;
    public static JLabel []jbs2;
    CardLayout c1;
    String name;
     
  public  FriendList(String name)
  { this.name=name;
    this.setTitle(name);                                                         //设置窗体的标题
    this.setSize(200, 650);                                                      //设置窗体的大小
    this.setLocationRelativeTo(null);                                            //设置窗体出现位置居中
    this.setDefaultCloseOperation(3);                                            //设置窗体的关闭操作
    this.setResizable(true);                                                     //设置禁止调整窗体的大小
    this.setIconImage((new ImageIcon("src/MyPicture/qq.png").getImage()));//设置标题栏图标
    //好友面板*********************************************
    jphy_jb1=new JButton("我的好友");
    jphy_jb2=new JButton("陌生人");
    jphy_jb2.addActionListener(e->c1.show(this.getContentPane(),"2"));
    jphy_jb3=new JButton("黑名单");
     
    jphy2=new JPanel(new GridLayout(50,1,4,4));                                
    jbs1=new JLabel[30];
     
    for(int i=0;i<jbs1.length;i++)
    {  jbs1[i]=new JLabel((i+1)+"",new ImageIcon("src/MyPicture/6.jpg"),JLabel.LEFT); //给每个好友添加头像
       jbs1[i].setEnabled(false); //false 图标都是灰暗的,不可操作,true表示图标可操作
       if(jbs1[i].getText().equals(name))
       {jbs1[i].setEnabled(true);}
       jbs1[i].addMouseListener(this);
       jphy2.add(jbs1[i]);
    }
     
    jphy3=new JPanel(new GridLayout(2,1)){{ add(jphy_jb2);add(jphy_jb3);}};
    jsp1=new JScrollPane(jphy2);
 
    jphy1=new JPanel(new BorderLayout()){{add(jphy_jb1,"North");add(jsp1,"Center");add(jphy3,"South"); }};
 
    //好友面板*********************************************
    //黑名单*********************************************
    jpmsr_jb1=new JButton("我的好友");
    jpmsr_jb1.addActionListener(e->c1.show(this.getContentPane(),"1"));
    jpmsr_jb3=new JButton("黑名单");
    
    jpmsr2=new JPanel(new GridLayout(20,1,4,4)); 
     jbs2=new JLabel[20];
     
    for(int i=0;i<jbs2.length;i++)
    {  jbs2[i]=new JLabel((i+21)+"",new ImageIcon("src/MyPicture/6.jpg"),JLabel.LEFT); //给每个好友添加头像
       jbs2[i].setEnabled(false); //false 图标都是灰暗的,不可操作,true表示图标可操作
       jbs2[i].addMouseListener(this);
       jpmsr2.add(jbs2[i]);
    }
     
    jpmsr3=new JPanel(new GridLayout(2,1)){{add(jpmsr_jb1);add(new JButton("陌生人"));}}; //2行一列,将jpmsr_jb1,jpmsr_jb2变成一个上部面板
    jsp2=new JScrollPane(jpmsr2);   //添加中间面板
     
     
    jpmsr1=new JPanel(new BorderLayout()){{add(jpmsr3,"North");add(jsp2,"Center");add(jpmsr_jb3,"South"); }};
 
    //黑名单*********************************************
     c1=new CardLayout();
    this.setLayout(c1);  //详细看下CardLayout的知识
    this.add(jphy1,"1");   //将面板jphy1添加到CardLayout的1号位置
    this.add(jpmsr1,"2");  //将面板jpmsr1添加到CardLayout的2号位置
    this.setSize(250, 600);//设置面板大小
    this.setVisible(true);
  }
 
 
     
    public void mousePressed(MouseEvent e) {
    }
 
    public void mouseReleased(MouseEvent e) {
    }
 
    public void mouseEntered(MouseEvent e)
    {   ((JLabel)e.getSource()).setForeground(Color.red);//鼠标移动到头像上,头像变红
    }
 
    public void mouseExited(MouseEvent e)
    { ((JLabel)e.getSource()).setForeground(Color.BLACK);//鼠标移动到头像上,头像变黑
    }
 
    public void mouseClicked(MouseEvent e)
    if(e.getClickCount()==2)
        {   String friendNo= ((JLabel)e.getSource()).getText();  //得到聊天的好友编号
        String sss=this.name+" "+friendNo;
        ChatThread.addQqChat(sss, new Chat(this.name,friendNo)); // 这行代码检查错误用了1小时,错误代码是ManageQqChat.hm1.put(sss,a)      
        }
    }
     
    public void updateFriend(Message m)
    {
       //让对应好友图标变亮
        Arrays.asList(m.getCon().split(" ")).forEach(i->jbs1[Integer.parseInt(i)-1].setEnabled(true)) ;
    }
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...