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();
}
}
}
2018.4.28 基于java的聊天系统(带完善)的更多相关文章
- 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
本文适合有 Java 基础的人群 作者:DJL-Lanking HelloGitHub 推出的<讲解开源项目>系列.有幸邀请到了亚马逊 + Apache 的工程师:Lanking( htt ...
- Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)
之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...
- 2018面向对象程序设计(Java)第15周学习指导及要求
2018面向对象程序设计(Java)第15周学习指导及要求 (2018.12.6-2018.12.9) 学习目标 (1) 掌握Java应用程序打包操作: (2) 了解应用程序存储配置信息的两种方法 ...
- 2018面向对象程序设计(Java)第9周学习指导及要求
2018面向对象程序设计(Java)第9周学习指导及要求(2018.10.25-2018.10.28) 学习目标 1.掌握java异常处理技术: 2.了解断言的用法: 3.了解日志的用途: 4.掌 ...
- 基于Java 生产者消费者模式(详细分析)
Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- 搭建基于java环境
.net项目架构改造之搭建基于java环境配置一览[上] 最近公司做了一个项目,需要嵌套在千牛的客户端上,项目代码必须上阿里的聚石塔,全程采用基于docker的自动化部署,我们的项目是基于.net ...
- 基于java平台的常用资源整理
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- 基于Java的打包jar、war、ear包的作用与区别详解
本篇文章,小编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下 以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.cla ...
随机推荐
- HDU 1556 Color the ball 前缀和+思维
Color the ball N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球 ...
- 2017 Gartner Hype Cycle for Emerging Technologies: AI, AR/VR, Digital Platforms
- Nacos深入浅出(五)
四中标色的代码 result = ConfigService.dump(dataId, group, tenant, cf.getContent(), lastModified); 我们看下这个方法 ...
- redis 拒绝远程访问解决
启动时报的警告: 1.Warning: no config file specified, using the default config. In order to specify a config ...
- 069 Sqrt(x) 求平方根
实现 int sqrt(int x) 函数.计算并返回 x 的平方根.x 保证是一个非负整数.案例 1:输入: 4输出: 2案例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., ...
- 1550: Simple String 最大流解法
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...
- 漫谈Code Review的错误实践
从刚开始工作时到现在,已经写了7年的代码,大部分代码都被人review过,自己也review了很多人的代码.在上一家公司的时候,我负责的一轮面试是专门进行Code Review的练习和经验谈. 通过在 ...
- 解决Linux下SSH等终端乱码问题
1.vi /etc/sysconfig/i18n Centos5.5原来内容是: //LANG="en_US.UTF-8" //SYSFONT="latarcyrheb- ...
- C# 指定WebBrowser 的 User Agent 版本
今天用WebBrowser 打开网页,本机ie是ie9 可是WebBrowser 显示的效果明显不是ie9 ,百度查资料才知道,其实是因为直接用IE跟使用WebBrowser 运行的是不同的User ...
- Java中的构造函数——通过示例学习Java编程(14)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=25 构造函数是用来初始化新创建的对象的代码块. ...