java实现类似qq的窗口对聊

  Swing实现界面,socket实现通信

package com.learn.talk;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

public class ChatReceiver {

    private PrintWriter pw;
    private JFrame frame;
    private JPanel pane_buttom;
    private JSplitPane pane_center;

    // 显示内容的文本框,输入内容的文本框,发送内容按钮
    private JScrollPane pane_showWindow;
    private JScrollPane pane_inputWindow;
    private JTextArea area_showWindow;
    private JTextArea area_inputWindow;

    private JButton btn_send;

    private Dimension dimension;// 用于设置area_showWindow可拖拉的大小

    // 初始化
    public ChatReceiver() {
        frame = new JFrame();
        pane_buttom = new JPanel();
        pane_showWindow = new JScrollPane();
        pane_inputWindow = new JScrollPane();
        area_showWindow = new JTextArea();
        area_inputWindow = new JTextArea();
        pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false,
                pane_showWindow, pane_inputWindow);
        btn_send = new JButton("send");

        dimension = new Dimension(50, 300);

    }

    // 调用方法显示窗口
    public void showFrame() {
        initFrame();
        initChatTextArea();
        initButton();
        btn_send();
        socket();
    }

    // 主窗体
    public void initFrame() {
        frame.setTitle("简繁");
        int width = (int) Toolkit.getDefaultToolkit().getScreenSize()
                .getWidth();
        int height = (int) Toolkit.getDefaultToolkit().getScreenSize()
                .getHeight();
        frame.setBounds(width / 2, height / 2, 400, 450);
        frame.setVisible(true);
    }

    // 内容显示文本框和输入内容文本框
    private void initChatTextArea() {
        // 取得视图焦点
        pane_showWindow.getViewport().add(area_showWindow);
        pane_inputWindow.getViewport().add(area_inputWindow);
        // 将显示文本域设置为不可编辑
        area_showWindow.setEditable(false);
        // 设置显示文本域可拖拉的大小
        pane_showWindow.setMinimumSize(dimension);
        frame.add(pane_center, BorderLayout.CENTER);
    }

    // 发送文件,发送内容按钮
    public void initButton() {
        pane_buttom.add(btn_send);
        frame.add(pane_buttom, BorderLayout.SOUTH);
    }

    private void btn_send() {
        btn_send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String info = area_inputWindow.getText();
                area_showWindow.append("简繁:" + info + "\r\n");
                pw.println(info);
                area_inputWindow.setText("");
            }
        });
    }

    private void socket() {
        ServerSocket ss;
        try {
            ss = new ServerSocket(9988);
            // 等待连接 客户端
            Socket s = ss.accept();
            InputStreamReader isr = new InputStreamReader(s.getInputStream());
            BufferedReader br = new BufferedReader(isr);
            // PrintWriter必须和socket有密切的关系
            pw = new PrintWriter(s.getOutputStream(), true);

            // 读取从客户端法发来的信息
            while (true) {
                // 读取从客户端发来的信息
                String info = br.readLine();
                // 在文本栏里显示
                area_showWindow.append("garfield:" + info + "\r\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ChatReceiver chat = new ChatReceiver();
        chat.showFrame();
    }
}
package com.learn.talk;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

public class ChatSender {
    private PrintWriter pw;
    private JFrame frame;
    private JPanel pane_buttom;
    private JSplitPane pane_center;

    // 显示内容的文本框,输入内容的文本框,发送内容按钮
    private JScrollPane pane_showWindow;
    private JScrollPane pane_inputWindow;
    private JTextArea area_showWindow;
    private JTextArea area_inputWindow;

    private JButton btn_send;

    private Dimension dimension;// 用于设置area_showWindow可拖拉的大小

    // 初始化
    public ChatSender() {
        frame = new JFrame();
        pane_buttom = new JPanel();
        pane_showWindow = new JScrollPane();
        pane_inputWindow = new JScrollPane();
        area_showWindow = new JTextArea();
        area_inputWindow = new JTextArea();
        pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false,
                pane_showWindow, pane_inputWindow);
        btn_send = new JButton("send");

        dimension = new Dimension(50, 300);
    }

    // 调用方法显示窗口
    public void showFrame() {
        initFrame();
        initChatTextArea();
        initButton();
        btn_send();
        socket();
    }

    // 主窗体
    public void initFrame() {
        frame.setTitle("garfield");
        int width = (int) Toolkit.getDefaultToolkit().getScreenSize()
                .getWidth();
        int height = (int) Toolkit.getDefaultToolkit().getScreenSize()
                .getHeight();
        frame.setBounds(width / 2, height / 2, 400, 450);
        frame.setVisible(true);
    }

    // 内容显示文本框和输入内容文本框
    private void initChatTextArea() {
        // 取得视图焦点
        pane_showWindow.getViewport().add(area_showWindow);
        pane_inputWindow.getViewport().add(area_inputWindow);
        // 将显示文本域设置为不可编辑
        area_showWindow.setEditable(false);
        // 设置显示文本域可拖拉的大小
        pane_showWindow.setMinimumSize(dimension);
        frame.add(pane_center, BorderLayout.CENTER);
    }

    // 发送文件,发送内容按钮
    public void initButton() {
        pane_buttom.add(btn_send);
        frame.add(pane_buttom, BorderLayout.SOUTH);
    }

    private void btn_send() {
        btn_send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String info = area_inputWindow.getText();
                area_showWindow.append("garfield: " + info + "\r\n");
                pw.println(info);
                area_inputWindow.setText("");
            }
        });
    }

    private void socket() {
        try {
            Socket s = new Socket("127.0.0.1", 9988);
            InputStreamReader isr = new InputStreamReader(s.getInputStream());
            BufferedReader br = new BufferedReader(isr);
            pw = new PrintWriter(s.getOutputStream(), true);
            while (true) {
                String info = br.readLine();
                area_showWindow.append("简繁: " + info + "\r\n");
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ChatSender chat = new ChatSender();
        chat.showFrame();
    }
}
时间: 2024-11-14 12:53:18

java实现类似qq的窗口对聊的相关文章

qt实现类似QQ伸缩窗口--鼠标事件应用

上一章节讲了qt鼠标事件实现,获取鼠标参数的方法.这一讲主要讲怎么应用上讲的鼠标事件实现一个小功能. qq好友对话框右侧 未展开时如图: 鼠标移动到 “隐藏侧边”处单击可以隐藏侧边,隐藏后效果如图: 实现的范例效果如下 1.一般情况 2.鼠标移动到中间分割线中间区域时,效果 3.单击红色按钮后,效果 4.鼠标移动到边界,效果 下面讲解实现过程:一般情况在QT中,这种伸缩窗体的实现有两种方法:一种是是直接用QSplitter分割器实现:另一种直接用布局管理器自己实现.本节用的是第二种方法实现的.布

[C# 网络编程系列]专题九:实现类似QQ的即时通信程序

转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序. 一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些

详解C# 网络编程系列:实现类似QQ的即时通信程序

引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序.  一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些都是属于即时通信(Instant Messenger,IM)软件,IM是指所有能够即时发送和接收互联网消息的软件. 在前面专题

C#实现类似QQ的隐藏浮动窗体、消息闪动

功能简介 当语音客服系统登录成功进入主界面时,本聊天工具将会自动隐藏在左下角位置,当鼠标移动到左下角时,自动弹出,当鼠标移开聊天窗体时,自动隐藏.如果想让聊天窗体固定在桌面,只要拖动一下聊天窗口,让它不停留在边界位置就可以了.隐藏和悬浮方式类型QQ. 1. 系统主界面 当点击最小化按钮时, 在电脑右下角会显示任务图标,点击任务图标,将会在左下角位置弹出. 主界面各部分介绍: a) 消息列表:该区域的功能主要是显示消息记录. b) 发送消息:输入要发送的消息进行发送,默认群聊,输入消息后,按回车键

WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右下角会显示一个窗体,一般情况下该窗体会隐藏停靠在右边,只露出很小部分,当鼠标移动到这个很小部分时,窗体全部显示,显示过程是从右边滑动到左边,当鼠标离开窗体时,窗体需要隐藏在右边,只露出很小部分,隐藏过程是从左边滑动到右边. 实现此类效果我碰到的连个难点是:1.如何判断鼠标离开了窗体?2.窗体显示隐藏

类似QQ消息左滑删除的Demo

最近在网上学到一篇类似QQ消息左滑删除的demo,完善了下代码,感觉还不错,特此分享一波: CustomSwipeListView.java 是个继承自ListView的类,里面调用了自定义View 类SwipeItemView.java的一个收缩的方法.其实QQ消息删除这个动画可以有很多种方法实现,这里我们介绍的方法是:常规ListView的每个Item展示方式不变,只是在Adapter类里面去绑定该显示的数据和删除等字样.具体详见如下: 自定义的ListView: package com.r

使用plupload做一个类似qq邮箱附件上传的效果

公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可以添加多个附件,也可一个都不添加 以其中一个为例:(文件保存到了数据库中),有关plupload的内容可参考:http://www.360doc.com/content/14/0714/03/552866_394228686.shtml 首先是po package cn.com.plupload.p

Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)

百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口. 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富.交互性强的地图类应用程序. 简单的说就是可以通过调用它绘制地图,也可以进行定位.而我这次使用百度 地图API要实现类似QQ发表说说时的定位功能: 1. 使用前准备: 从百度地图SDK官网下载demo,里面有我们需要的jar包和so文件. 将locSDK_XXX.ja

C#如何实现类似QQ那样靠边隐藏的功能

http://www.cnblogs.com/yechensi/archive/2009/08/02/1537145.html C#如何实现类似QQ那样靠边隐藏的功能 你想过为自己的程序添加靠边隐藏的功能吗?还在为计算窗体的大小及位置而烦恼吗?想这么简单的轻松调用吗? DockWindow.FormDockTemplate m_oDockFormTemplate = new DockWindow.FormDockTemplate(this); 不用吃惊,您只需要在你的窗体初始化的时候(也就是窗体