基于Java的简单网络聊天室编程.docx

上传人:b****8 文档编号:28295744 上传时间:2023-07-10 格式:DOCX 页数:51 大小:84.41KB
下载 相关 举报
基于Java的简单网络聊天室编程.docx_第1页
第1页 / 共51页
基于Java的简单网络聊天室编程.docx_第2页
第2页 / 共51页
基于Java的简单网络聊天室编程.docx_第3页
第3页 / 共51页
基于Java的简单网络聊天室编程.docx_第4页
第4页 / 共51页
基于Java的简单网络聊天室编程.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

基于Java的简单网络聊天室编程.docx

《基于Java的简单网络聊天室编程.docx》由会员分享,可在线阅读,更多相关《基于Java的简单网络聊天室编程.docx(51页珍藏版)》请在冰豆网上搜索。

基于Java的简单网络聊天室编程.docx

基于Java的简单网络聊天室编程

基于Java的简单网络聊天室编程

摘要:

当前是信息网络得到飞速发展的时代,尤其是计算机和通信技术的发展和结合,深深的影响着我们的生活、学习和工作方式。

其中,网络聊天工具成为人们日常交流的一种重要工具,它成本低,通信速度快,方便信息交流和资料的传递。

本次开发的网络聊天系统是基于开放的Java应用程序设计的,系统采用客户机/服务器的架构模式,由客户端程序和服务器程序外加服务器端,用于存放客户数据的数据库组成,使用Java提供的Socket类以及Java的多线程功能,在不同的端口上部署各类服务,可以在单个程序中同时运行多个不同进程,而客户端通过Socket发送信息给服务器,从而实现多点对多点的聊天。

关键字:

Java,交互性,Socket类,多线程

Zhaocheng-yu

Abstract:

Therapiddevelopmentoftheinformationnetworks,especiallythedevelopmentandintegrationofcomputerandcommunicationtechnologies,hasdeeplyaffectedourlives,learningandwork.Amongthem,theInternetchattoolbecomesanimportanttoolfordailycommunication,becauseitislowcost,fastcommunicationandfacilitateinformationexchangeanddatatransmission.ThedevelopmentoftheInternetchatsystemisdesignedbasedonopenJavaapplication.Itcanbedynamic,real-timeinformationtransferandefficientinteractionsothatitcandealmoreeffectivelywithcustomerrequests,andiseasytomaintainandupdate.Thesystemwillusetheclient/serverarchitecturemodel,whichincludestheclientprogramandserverprogramsplusserver-sidedatabaseusedtostorecustomerdata.Byusingthesocketclassprovidedbyjavaandjavamulti-threadingcapability,wecandeployvariousservicesonadifferentportandanumberofdifferentprocessescanberunsimultaneouslyinasingleprogram.Clientssendinformationtotheserverthroughthesocketinordertoachievemulti-point-to-multipointchat.

Keywords:

Java,interactivity,theSocketclass,multi-threaded

 

1.引言

现在互联网越来越发达,网络聊天工具成为人们日常交流的一种重要工具,它成本低,通信速度快,方便信息交流和资料的传递,所以开发一个界面友好、易于操作的聊天工具能较好地解决电话的单线程通信以及费用高昂等问题。

随着网络普及程度的提高,人们对于通信软件的要求越来越趋于简单操作,同步实时,以及更简单的网络传输。

本次开发的网络聊天系统是基于开放的Java应用程序设计的,能动态、实时地完成信息的传递,且具有高效的交互性,能更有效地处理客户请求,易于维护和更新。

系统分为两部分:

客户端和服务器端。

客户端主要实现新建用户、用户登录、消息的收发功能以及群聊功能,客户端申请与服务器端建立连接,当客户端与服务器端建立连接通道后就可以像服务器端发送新建用户信息和登录信息,以及好友管理、信息编辑、发送和接收的功能;服务器端主要完成建立连接、数据库操作和监听客户三大功能,服务器端建立一个ServerSocket的连接,不断侦听客户端是否建立连接或断开连接,如果有客户端申请连接就启动线程与客户端建立连接并按照客户端的请求对数据库进行操作并把结果返回给客户端。

2.JAVA语言概况

Java是一个由Sun公司开发的新一代高级编程语言。

它可在各式各样不同机器、不同操作平台的网络环境中开发软件。

不论你使用的是哪种WEB浏览器,哪种计算机,哪种操作系统,只要WEB浏览器上面注明了“支持Java”,并且装有JAVA控件,你就可以看到生动的主页。

Java正在逐步成为Internet应用中最主要的开发语言,它彻底改变了软件开发模式,带来了自PC机以来又一次革命,为飞速发展的网络世界增添了新的动力。

总而言之java语言有简单、面向对象、分布性、安全性、多线程等特点。

3.TCP/IP

3.1TCP/IP协议的特点

TCP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议/网际协议的缩写,TCP/IP是当今网络互联的核心协议。

TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。

IP协议的作用:

第一,它是网络层的协议,提供互联网上数据传输的统一格式。

第二,提供不可靠的无连接的服务。

第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。

TCP/IP协议具有以下特点:

(1)协议标准具有开放性,其独立于特定的计算机硬件及操作系统,可以免费使用。

(2)统一分配网络地址,使得每个TCP/IP设备在网络中都具有唯一的IP地址。

(3)实现了高层协议的标准化,能为用户提供多种可靠的服务。

TCP/IP协议进行传输数据传输的过程:

应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP数据包封装在IP包内,通过网络送给目的TCP。

接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。

TCP调用IP接口,向TCP提供所有TCP需要的服务。

端口号:

有的时候,一个IP地址不能完整的标识一台服务器,这是应为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是端口。

端口实际是一个16位长的地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都只道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的客户端应用程序。

在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端。

3.2Socket介绍

Socket,简称套接字,用于实现网络上客户和服务器之间的连接。

也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。

具体的说:

一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。

服务器也通过它的本地端口连接一个socket,通过读写和客户端通信。

Socket程序的工作过程:

(1)建立Socket连接:

在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。

(2)数据通信:

利用虚拟连接通道传送数据信息进行通道。

(3)关闭:

通信结束时,再将所建的虚拟连接拆除。

具体如下:

 

图1Socket套接字原理图

3.3多线程思想

多个客户同时与单个服务器连接时非常常见的。

可以使用线程处理服务器上多个客户的同步问题。

while(true){

Socketsocket=serverSocket.accept();

Threadthread=newThreadClass(socket);

thread.start();

}

服务器套接字可以有多个连接。

While循环的每次迭代创建一个新的连接。

4.工程化思想分析

4.1基本功能需求

(1)聊天

私聊:

私聊就是两个之间聊天,即一对一。

群聊:

就是多人一起聊天,即一对多。

(2)管理员踢人的管理

(3)注册用户

4.2系统设计

(1)用户注册

服务器收到用户的注册请求,便开始接受用户传递的信息,用户的名称,密码,接受完毕后,便通过后台数据库连接,然后向数据库添加记录。

客户收到服务器返回的信息后,便打开主登陆窗口。

(2)登陆

在客户端,用户输入其用户名和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始读取数据库,然后与用户输入的信息比较,如果成功,便打开主程序窗口。

进入相应的聊天室,看看到底有多少人在聊天室里,便可以私聊或则群聊。

(3)私聊

私聊就是两个聊天。

客户端首先发送消息到服务器端,服务器端根据发送人信息和接收者信息来转发。

(4)群聊

群聊,就是多人一起聊天。

过程与私聊差不多。

唯一的不同就是服务器会将信息转发给指定的一到多个成员。

(5)管理员踢人

管理员踢人的功能相当于管理员看到某个人不符合规定变现,扰乱聊天次序,可以行使权限的功能拥有踢人的功能。

5.功能模块实现

5.1数据库设计

publicclassLoginFrameextendsjavax.swing.JFrameimplementsActionListener{

privatejavax.swing.JButtonjButtonLogin;

privatejavax.swing.JButtonjButtonRegister;

privatejavax.swing.JLabeljLabel1;

privatejavax.swing.JLabeljLabel2;

privatejavax.swing.JLabeljLabel3;

privatejavax.swing.JPasswordFieldjPasswordFieldPw;

privatejavax.swing.JTextFieldjTextFieldName;

privateJPaneljPanel1;

privateJButtonjButtonManage;

publicLoginFrame(){

try{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}catch(Exceptione){

e.printStackTrace();

}

initComponents();

}

//初始化所有控件

privatevoidinitComponents(){

jPanel1=newJPanel();

jTextFieldName=newjavax.swing.JTextField();

jPasswordFieldPw=newjavax.swing.JPasswordField();

jButtonLogin=newjavax.swing.JButton("登陆");

jButtonRegister=newjavax.swing.JButton("注册");

jLabel1=newjavax.swing.JLabel();

jLabel2=newjavax.swing.JLabel();

jLabel3=newjavax.swing.JLabel();

getContentPane().setLayout(null);

getContentPane().add(jLabel1);

jLabel1.setText("聊天系统");

//设置label中的字体和大小,并用粗体显示

jLabel1.setFont(newFont("",Font.BOLD,30));

jLabel1.setBounds(200,100,400,50);

getContentPane().add(jPanel1);

jPanel1.setLayout(null);

jPanel1.add(jLabel2);

jLabel2.setText("用户名:

");

jLabel2.setPreferredSize(newDimension(50,30));

jLabel2.setBounds(100,150,100,30);

jPanel1.add(jTextFieldName);

jTextFieldName.setBounds(200,150,150,30);

jLabel3.setText("密码:

");

jLabel3.setBounds(100,200,100,30);

jPanel1.add(jLabel3);

jPanel1.add(jPasswordFieldPw);

jPasswordFieldPw.setBounds(200,200,150,30);

jPanel1.add(jButtonLogin);

jButtonLogin.setBounds(100,250,80,20);

jButtonLogin.addActionListener(this);

jPanel1.add(jButtonRegister);

jButtonRegister.addActionListener(this);

jButtonRegister.setBounds(200,250,80,20);

jButtonManage=newJButton("管理");

jButtonManage.setBounds(300,250,80,20);

jButtonManage.addActionListener(this);

jPanel1.add(jButtonManage);

jPanel1.setBounds(0,0,500,500);

jPanel1.setVisible(true);

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();

//把窗口放在屏幕中间

this.setPreferredSize(newDimension(500,500));

this.setBounds(screenSize.width/2-250,screenSize.height/2-250,500,500);

this.setVisible(true);

setResizable(false);

pack();

}

publicstaticvoidmain(Stringargs[]){

java.awt.EventQueue.invokeLater(newRunnable(){

publicvoidrun(){

newLoginFrame().setVisible(true);

}

});

}

//处理按钮事件

publicvoidactionPerformed(ActionEvente){

if(e.getActionCommand().equals("登陆")){

//如果用户按下“登陆”按钮

booleanisAuthrized=DBHandler.isAuthorized(jTextFieldName

.getText(),jPasswordFieldPw.getText());

if(isAuthrized){

intprio=DBHandler.getPrio(jTextFieldName.getText(),

jPasswordFieldPw.getText());

SelRoomFramesrd=newSelRoomFrame(jTextFieldName.getText(),

prio);

this.dispose();

}else{

JOptionPane.showMessageDialog(this,"用户名密码不正确!

");

return;

}

}elseif(e.getActionCommand().equals("注册")){

//如果用户按下“注册”按钮

RegisterFramergf=newRegisterFrame(this);

this.setVisible(false);

}else{

//如果用户按下“管理”按钮

if(DBHandler.isAdmin(jTextFieldName.getText(),jPasswordFieldPw

.getText())){

ManageFramemf=newManageFrame(this);

}else{

JOptionPane.showMessageDialog(this,"用户名密码不正确!

");

return;

}

}

}

}

5.2登入选择聊天室

publicclassLoginFrameextendsjavax.swing.JFrameimplementsActionListener{

privatejavax.swing.JButtonjButtonLogin;

privatejavax.swing.JButtonjButtonRegister;

privatejavax.swing.JLabeljLabel1;

privatejavax.swing.JLabeljLabel2;

privatejavax.swing.JLabeljLabel3;

privatejavax.swing.JPasswordFieldjPasswordFieldPw;

privatejavax.swing.JTextFieldjTextFieldName;

privateJPaneljPanel1;

privateJButtonjButtonManage;

publicLoginFrame(){

try{

//设置显示外观为本地系统外观。

注意此句需放在初始化所有控件之前。

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}catch(Exceptione){

e.printStackTrace();

}

initComponents();

}

//初始化所有控件

privatevoidinitComponents(){

jPanel1=newJPanel();

jTextFieldName=newjavax.swing.JTextField();

jPasswordFieldPw=newjavax.swing.JPasswordField();

jButtonLogin=newjavax.swing.JButton("登陆");

jButtonRegister=newjavax.swing.JButton("注册");

jLabel1=newjavax.swing.JLabel();

jLabel2=newjavax.swing.JLabel();

jLabel3=newjavax.swing.JLabel();

getContentPane().setLayout(null);

getContentPane().add(jLabel1);

jLabel1.setText("聊天系统");

//设置label中的字体和大小,并用粗体显示

jLabel1.setFont(newFont("",Font.BOLD,30));

jLabel1.setBounds(200,100,400,50);

getContentPane().add(jPanel1);

jPanel1.setLayout(null);

jPanel1.add(jLabel2);

jLabel2.setText("用户名:

");

jLabel2.setPreferredSize(newDimension(50,30));

jLabel2.setBounds(100,150,100,30);

jPanel1.add(jTextFieldName);

jTextFieldName.setBounds(200,150,150,30);

jLabel3.setText("密码:

");

jLabel3.setBounds(100,200,100,30);

jPanel1.add(jLabel3);

jPanel1.add(jPasswordFieldPw);

jPasswordFieldPw.setBounds(200,200,150,30);

jPanel1.add(jButtonLogin);

jButtonLogin.setBounds(100,250,80,20);

jButtonLogin.addActionListener(this);

jPanel1.add(jButtonRegister);

jButtonRegister.addActionListener(this);

jButtonRegister.setBounds(200,250,80,20);

jButtonManage=newJButton("管理

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1