2018.4.28 基于java的聊天系统(带完善)

Java聊天系统

1.Socket类

Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程地址上的指定远程端口。

Socket(String host, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程主机上的指定远程端口。

close()
关闭此套接字。

connect(SocketAddress endpoint)
将此套接字连接到服务器。

connect(SocketAddress endpoint, int timeout)
将此套接字连接到服务器,并指定一个超时值。

getInetAddress()
返回套接字连接的地址。

getInputStream()
返回此套接字的输入流。

getLocalPort()
返回此套接字绑定到的本地端口。

getOutputStream()
返回此套接字的输出流。

getPort()
返回此套接字连接到的远程端口。

2.ServerSocket类

ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
accept()
侦听并接受到此套接字的连接。
getInetAddress()
返回此服务器套接字的本地地址。

Socket编程步骤
服务器端创建ServerSocket对象,调用accept方法返回Socket对象
客户端创建Socket对象,通过端口连接到服务器
客户端、服务器端都使用Socket中的getInputStream方法和getOutputStream方法获得输入流和输出流,进一步进行数据读写操作

(InetAddress用来描述主机地址;
Socket用来创建两台主机之间的连接;
ServerSocket用来侦听来自客户端的请求;
Socket通常称作“套接字”,通常通过“套接字”向网络发出请求或者应答网络请求。)

3.实现的步骤:

   第一步: ChatUtil工具类:把一些常用的常量放进来

    第二步:Server开启服务
    第三步:ClientSocket连接服务器的socket
    第四步:CHatFrame(添加两个属性(name,sex))2.添加了getSocket方法
    第五步:LoginFrame设置了默认值  处理性别获得socket对象
package com.lanqiao.demo2;
/**
 * 工具类
 * @author qichunlin
 *
 */
public final class ChatUtil {
    //地址
    public static final String ADDRESS = "localhost";
    //端口
    public static final int PORT = 9999;
}
package com.lanqiao.demo2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端类
 * @author qichunlin
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(ChatUtil.PORT);
            int count = 0;
            while (true) {
                System.out.println("等待客户端连接.......");
                Socket socket = ss.accept();
                count++;
                System.out.println("目前有"+count+"个客户端进入了聊天室");
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.lanqiao.demo2;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端的socket
 * @author qichunlin
 *
 */
public class ClientSocket {
    public static Socket socket;
    public ClientSocket() {
        try {
            socket = new Socket(ChatUtil.ADDRESS, ChatUtil.PORT);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.lanqiao.demo2;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

/**
 * 聊天系统的登录界面
 * @authorqichunlin
 *
 */
public class LoginFrame extends JFrame implements ActionListener{
    //定义组件
    JLabel userLab,addrLab,portLab;//标签
    JTextField userText,addrText,portText;//文本框
    JRadioButton radioMan,radioWoman,radioser;//单选按钮
    ButtonGroup group ;//组
    JButton connectBut,closeBut;//按钮
    //容器
    JPanel p1,p2,p3;

    public LoginFrame(){
        //实例化组件
        p1 = new JPanel();
        p1.setLayout(new FlowLayout(FlowLayout.LEFT));

        userLab = new JLabel("姓名:");
        userText = new JTextField(10);
        radioMan = new JRadioButton("男");
        radioMan.setSelected(true);
        radioWoman = new JRadioButton("女");
        radioser = new JRadioButton("保密");
        //把单选按钮,添加到组中
        group = new ButtonGroup();
        group.add(radioMan);
        group.add(radioWoman);
        group.add(radioser);

        //往p1中,添加组件了(注意:组不需要添加到容器中)
        p1.add(userLab);
        p1.add(userText);
        p1.add(radioMan);
        p1.add(radioWoman);
        p1.add(radioser);

        p2 = new JPanel();
        p2.setLayout(new FlowLayout(FlowLayout.LEFT));
        addrLab = new JLabel("地址:");

        addrText = new JTextField(10);
        addrText.setText(ChatUtil.ADDRESS);

        portLab = new JLabel("端口:");
        portText = new JTextField(10);
        portText.setText(ChatUtil.PORT+"");

        //把组件添加到p2中
        p2.add(addrLab);
        p2.add(addrText);
        p2.add(portLab);
        p2.add(portText);

        p3 = new JPanel();
        p3.setLayout(new FlowLayout(FlowLayout.CENTER));

        connectBut =new JButton("连接");
        //绑定事件【点击事件】
        connectBut.addActionListener(this);

        closeBut = new JButton("断开");
        //把组件添加到p3中
        p3.add(connectBut);
        p3.add(closeBut);

        //设置面板的布局模式(流式布局)
        this.getContentPane().setLayout(new GridLayout(3,1));//网格布局

        //把组件添加到面板了
        //1、获取面板
        Container c =  this.getContentPane();
        //把p1容器添加到面板
        c.add(p1);
        //把p2容器添加到面板
        c.add(p2);
        //把p3容器添加到面板
        c.add(p3);

        init();
    }
    /**
     * 初始化窗体的基本信息
     */
    public void init(){
        //1、标题
        this.setTitle("登录界面");
        //2、大小
        this.setSize(350,200);
        //3、关闭放大功能
        this.setResizable(false);
        //4、位置
        this.setLocationRelativeTo(null);
        //5、是否显示
        this.setVisible(true);
        //6、关闭
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new LoginFrame();
    }
    //点击事件的处理过程
    @Override
    public void actionPerformed(ActionEvent e) {
        //处理选择中的性别
        String sex = "";
        if(radioWoman.isSelected()) {
            sex = "女";
        }else if(radioMan.isSelected()) {
            sex = "男";
        }else {
            sex = "保密";
        }
        System.out.println("============");
        //1、隐藏当前的界面【登录界面】
        this.setVisible(false);
        //2、显示聊天的界面
        ChatFrame c = new ChatFrame(userText.getText(),sex);//登录名传递过来
        c.getSocket();
    }
}


package com.lanqiao.demo2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端类
 * @author qichunlin
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(ChatUtil.PORT);
            int count = 0;
            while (true) {
                System.out.println("等待客户端连接.......");
                Socket socket = ss.accept();
                count++;
                System.out.println("目前有"+count+"个客户端进入了聊天室");
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/qichunlin/p/8969894.html

时间: 2024-10-05 12:42:22

2018.4.28 基于java的聊天系统(带完善)的相关文章

基于JAVA的简易在线聊天系统,觉得挺自豪的一个项目

项目做的比较多,最近,做的一个项目:基于JAVA的简易在线聊天系统,感觉挺自豪的. 这个项目应用JAVA编程语言实现基于网络的文本交互软件的设计和实现,达到多客户端收发文本消息的交互操作.通过服务器端多线程地监控客户端的登陆和退出,实时接收客户端发出的消息并定向发送到指定客户端,以实现在线实时文本消息传输功能:当服务器端运行时,客户端可以随时登陆和退出:客户端登陆时可以设置个人信息,包括用户名和密码:保持一定的系统稳定性,客户端与服务器端的连接稳定. 这个“基于JAVA的简易在线聊天系统”是我在

基于java的ssh架构的2018最新 酒店信息管理系统【原创】-未经同意请勿转载

网络上流传的大部分95%以上的程序都是跑不通的,应大部分同学要求,现写了一个酒店管理信息系统. 是ssh的架构, 基于java的 . 贴2个截图 第二个 原文地址:https://www.cnblogs.com/qq2032333807/p/8178807.html

基于java的微信公众号二次开发视频教程

详情请交流  QQ  709639943 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务原理改造房产销售平台 00.Python3入门机器学习 经

基于JAVA的邮件客户端的设计和实现

获取项目源文件,技术交流与指导联系Q:1225467431 摘  要 Java是Sun Microsystem公司推出的新一代面向对象和面向网络的程序设计语言,特别适合于Internet/Intranet上的应用软件开发,因此也把Java语言称为新一代网络程序设计语言.Java语言将面向对象.多线程.安全和网络等特征集于一身,为软件开发人员提供了很好的程序设计环境,当今企业级计算和应用中相当成熟和稳定的平台,在这个领域中不可否认地占据着领导地位.JBuilder是Borland公司推出的Java

这里整理了基于java平台的常用资源

这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.thanks. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gra

基于Java软引用机制最大使用JVM堆内存并杜绝OutOfMemory

题记:说好的坚持一周两篇文章在无数琐事和自己的懒惰下没有做好,在此表达一下对自己的不满并对有严格执行力的人深表敬意!!!! --------------------------------------------------------------------------------------------------------------------------------- 引文:Java程序员对OutOfMemory并不陌生,一般来说,出现此异常主要是由于应用里缓存了大量的数据没有被GC

基于java的socket编程

#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好,不用全记得,然后你一个劲地编,使劲地编,编的时候不懂再回来看就好了,这是最快的方法.心里一琢磨,还真是这样,根据以前学C语言的情况不就这样吗.所以便加速看,把一些书里介绍的方法,类飞速地浏览过了,刷到网络这一章,觉得socket编程应该是得试一下手,不要只看不做假把式. 此文为原创,转摘请注明转摘自

基于Java的数据采集(二)

在上一篇文章<基于Java的数据采集(一)>:http://www.cnblogs.com/lichenwei/p/3904715.html 提到了如何如何读取网页源代码,并通过group正则 动态抓取我们所需要的网页数据 现在来写下关于数据的存储,思路很简单,只需要在我们每次读取一个数据的时候,把数据存放在临时变量,然后插入数据库即可. 先来建一个表: DoMysql.java(数据库连接类,并提供插入数据的方法) 1 package com.lcw.curl; 2 3 4 import j

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/