- 浏览: 9222894 次
- 性别:
- 来自: 上海
最新评论
-
netkongjian:
不错的报表工具知识分享![deyi]
主流报表工具推荐 -
starry8023:
您的博客很有用!而且我也出现了类似的问题,我是在vs上运行的, ...
在VC下配置openGL -
sliuxl:
...
复制表结构 -
DR玫瑰花香:
[color=darkblue][/color][size=m ...
KMP算法深度解析 -
alvin198761:
看看这两个操作系统的历史,就知道了,这个问题没法追究责任,一个 ...
一则旧闻-Linux是UNIX的盗版?SCO的三大漏洞
本文阐述了基于Linux环境,Java语言实现的基本聊天室功能,涉及Linux下的Java 语言的Socket编程。以及Java语言的多线程编程。
<!--[if !supportLists]-->Ø <!--[endif]-->TCP(Transmission Control Protocol)基础
<!--[if !supportLists]-->Ø <!--[endif]-->UDP(User Datagram Protocol)基础
<!--[if !supportLists]-->Ø <!--[endif]-->Socket(Java)
Java支持流套接字(steam socket)和数据报套接字(datagram socket)。流套接字使用TCP协议(Transmission Control Protocol, 传输控制协议)进行数据的传输,而数据报套接字使用UDP协议(User Datagram Protocol, 用户数据报协议)。因为TCP能够探测丢失的数据传输并重新提交它们,因此传输的数据不会丢失,是可靠的。相比之下,UDP协议不能保证无损失传输。所以,采用TCP协议通信可以保证数据的正确传输。
<!--[if !supportLists]-->Ø <!--[endif]-->客户/服务器模式
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="1" width="55"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="38" width="550"><!--[endif]--><!--[if !mso]-->
ServerSocket server = new ServerSocket(port);1
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="3" width="55"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="38" width="550"><!--[endif]--><!--[if !mso]-->
Socket connectToClient = server.accept();
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="6" width="55"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="39" width="550"><!--[endif]--><!--[if !mso]-->
Socket connectToServer = new Socket(ServerName, port);
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if gte vml 1]>
<table cellpadding="0" cellspacing="0">
<tbody><tr>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="60" width="550"><!--[endif]--><!--[if !mso]-->
InputStream isFromServer = connectToServer.getInputStream();
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
InputStream 和 OutputSteam是用户读写字节。可以使用DataInputStream、DataOutputSteam、BufferReader 和 PrintWriter包装InputStream和OutputSteam,读取double、int、String之类的数据值。可以使用readLine方法读入一行数据,使用println向端口写入一行。
<!--[if gte vml 1]>
<tr>
<td><![endif]>
<div>
<p align=center style='text-align:center'><span
style='mso-ascii-"Times New Roman";
mso-hansi-"Times New Roman"'>任务</span>1</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]>
<tr>
<td><![endif]>
<div>
<p align=center style='text-align:center'><span
style='mso-ascii-"Times New Roman";
mso-hansi-"Times New Roman"'>任务</span>2</p>
<div> </div>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]>
<tr>
<td><![endif]>
<div>
<p align=center style='text-align:center'><span
style='mso-ascii-"Times New Roman";
mso-hansi-"Times New Roman"'>任务</span>3</p>
<div> </div>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]>
<![endif]--><!--[if !vml]-->
<!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->线程有五种状态:新建、就绪、运行、阻塞、结束。
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->Thread类包括以下的几种控制方法:
public static void sleep(long millis) throws InterruptedException 方法,可以将在运行的线程置为休眠状态,休眠时间为指定的毫秒。
<!--[if !supportLists]-->¨ <!--[endif]-->Linux Platform - J2SE(TM) and NetBeans(TM) IDE Bundle NB 4.1 / J2SE 5.0 Update 4<!--[if !supportFootnotes]-->[4]<!--[endif]-->
<!--[if !supportLists]-->¨ <!--[endif]-->Rat Hat Linux 9.0
在Linux采用J2SE和NetBeans可以很容易的开发面向Linux的应用程序,可以移植到windows平台下运行。其中NetBean 是Sun公司开发的免费Java图形用户界面编辑器。(如图1-4)可以很轻松的实现界面的设计,它将控件以Swing, awt, JavaBean分类放置。
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
[MESSAGE]:表示接下来的一句话是消息
|
|
[NAME]: 表示接下来的一句话是名字
|
[FIRSTNAME]:用于程序逻辑控制,表示第一个
|
[SYSTEM]: 系统消息
|
[Server exit!]:服务器退出
|
[WHISPERMESSAGE]:私聊控制字
|
|
[QUIT]: 表示客户端退出聊天室
|
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]--><!--[if gte vml 1]>
<table cellpadding="0" cellspacing="0">
<tbody><tr>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="404" width="582"><!--[endif]--><!--[if !mso]-->
sock = new Socket(ipAddress, DEFAULT_PORT); //新建一个socket if(sock!=null) //连接成功 processMsg(); isFromServer=new BufferedReader(); //新建一个接收变量 osToServer = new PrintWriter(); //新建一个输出变量 osToServer.println("[NAME]" + name); //发名字 catch(IOException ex) readThread=new Thread(this); //通过Runnable实现 readThread.start();
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->Client端通过方法startConnect(),尝试连接服务器端,其函数原型如下:
<!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->通过SendInformation()方法实现数据的发送,实现函数原型如下:
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="3" width="23"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="259" width="582"><!--[endif]--><!--[if !mso]-->
osToServer.println("[WHISPERMESSAGE]" + message);//发送私聊信息 osToServer.println("[MESSAGE]" + message); //发送群聊信息 osToServer.flush();
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->当程序退出,或者服务器退出,线程应该结束运行。客户端,通过重载Thread的run方法实现,函数的原型如下:
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="2" width="23"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="397" width="582"><!--[endif]--><!--[if !mso]-->
osToServer.flush(); catch(Exception exc){} isFromServer.close(); //输入缓冲关闭 osToServer.close(); //输出缓冲关闭 System.exit(0);
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if !supportLists]-->à <!--[endif]-->在退出应用程序之前,向服务器端发送[QUIT]命令字,实现聊天室的更新。
<!--[if !supportLists]-->à <!--[endif]-->客户端退出要将socket关闭,要将输入和输出的数据流关闭。
<!--[if !supportLists]-->à <!--[endif]-->最后将执行finally块程序,最后调用System的exit的函数退出应用程序。
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->Server相对与客户端更加的复杂,要主动监听客户端发送的连接请求,创建不同的线程,来应答客户的请求。创建的线程,接受客户发送的数据的处理。
<!--[if !supportLists]-->Ø <!--[endif]-->服务端使用serverListen()函数开始监听端口,其函数原型如下:
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="13" width="31"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="169" width="582"><!--[endif]--><!--[if !mso]-->
chatAcceptThread = new Thread(this); //创建一个监听线程 chatAcceptThread.start(); broadcastThread = new BroadcastThread(this); //创建广播线程 broadcastThread.start();
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->ServerJFrame是通过Runnable接口来创建的线程。其run函数实现客户端的接受并创建一个新的线程:
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="5" width="31"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="398" width="582"><!--[endif]--><!--[if !mso]-->
clients = new java.util.Vector(); //分配一个栈,用于存储用户线程 serverSock=new ServerSocket(DEFAULT_PORT); //新建一个Socket catch(IOException e){} while(true) Socket clientSock = serverSock.accept(); CommunicateThread ct = new CommunicateThread(); //实例化通信类 boolean addSucOrNot = clients.add(ct); //将当前的进程压入堆栈 catch(IOException e){}
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
为了后面能够将数据广播出去,和实现私聊,必须要得到响应的线程,所以在向堆栈压入线程的时候,需要有一个变量(index)来指示线程, index 不会随着客户的退出而删除<!--[if !supportFootnotes]-->[9]<!--[endif]-->,而是逐次累加,那么当客户退出时,要将此进程在堆栈中的位置设置为[EMPTY],来表示一个客户端已经退出,此时,服务器端要结束和这个客户端连接的线程。
<!--[if !supportLists]-->Ø <!--[endif]-->那么当用户发来数据的时候,并且命令字为[MESSAGE]的时候,服务器需要将这条信息广播出去,这个由Broadcast来处理,其中的run函数原型如下:
<!--[if gte vml 1]>
<table align="left" cellpadding="0" cellspacing="0">
<tbody><tr>
<td height="6" width="31"><br></td>
</tr>
<tr>
<td><br></td>
<td style="border: 0.75pt solid black; background: white none repeat scroll 0%; vertical-align: top; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="white" height="789" width="582"><!--[endif]--><!--[if !mso]-->
boolean startBroadcast = chatFrame2.getBroadcastStart(); if (!startBroadcast) Thread.sleep(500); // 线程睡眠500毫秒后重新检测 catch(InterruptedException ex){} continue; int lengthOfChatClients = chatClients.size(); //线程个数 for(int i=0; i < lengthOfChatClients; i++) //对每个线程进行操作 if(chatClients.get(i).equals("[EMPTY]")) //若是退出进程 continue; comThread1 = (CommunicateThread)chatClients.get(i); int lengthOfMsgStack = msgStack.size(); //对消息堆栈进行广播 for(int j=0; j<lengthOfMsgStack; j++) string = (String)msgStack.get(j); broadcastInfor = string; broadcast("[MESSAGE]" + broadcastInfor); boolean temp = msgStack.removeElement(string); chatFrame2.stopBroadcast(); //停止广播 Thread.sleep(1000); catch(InterruptedException ex) {} catch(Exception e){}
<!--[endif]--><!--[if !mso & !vml]--><!--[endif]--><!--[if !vml]--> <!--[endif]-->
<!--[endif]-->
<!--[if gte vml 1]> <![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->Ø <!--[endif]-->程序可以实现公聊和私聊<!--[if !supportFootnotes]-->[10]<!--[endif]-->,公聊在服务器端将加入聊天记录,私聊则只是发给指定用户,服务器端不保留聊天信息。
<!--[if !supportLists]-->Ø <!--[endif]-->收到系统消息,和用户变化都会有声音提示。
<!--[if !supportLists]-->Ø <!--[endif]-->完全可以单机来调试信息,也试过在Linux下运行服务器端,在Windows下使用客户端进行访问,访问方式没有区别,通信也没有故障。
<!--[if !supportLists]-->Ø <!--[endif]-->当服务器退出时,或者说用户端失去服务器连接时,用户将需要重新连接,当然也可以实现超时退出的方式,这样可以实现重新连接。
<!--[if !supportLists]-->Ø <!--[endif]-->可扩展功能:系统可以选择需要发送的系统消息的对象,这样可以使系统消息发送更加灵活。
<!--[if !supportLists]-->Ø <!--[endif]-->用户可以通过右边的list得到当前的在线用户的状况
<!--[if !supportLists]-->Ø <!--[endif]-->用户可以通过左边的textArea得到当前群中用户所发送的消息的记录<!--[if !supportFootnotes]-->[11]<!--[endif]-->。
<!--[if !supportLists]-->Ø <!--[endif]-->当用户连接失败,可以选择重新登陆,重新登陆就不需要重新输入用户名。
<!--[if !supportLists]-->Ø <!--[endif]-->假如用户登陆时,没有指定连接地址,将默认为localhost地址<!--[if !supportFootnotes]-->[12]<!--[endif]-->。
<!--[if !supportLists]-->Ø <!--[endif]-->用户可以通过直接按Enter键发送消息<!--[if !supportFootnotes]-->[13]<!--[endif]-->。
相关推荐
【网络聊天室java实现】是基于Java编程语言的网络通信项目,主要运用了Java的Socket编程来构建一个多人在线实时交流的平台。在Java中,Socket是网络通信的基础,它为两台机器间的应用程序提供了双向通信的通道。通过...
【标题】:“网络聊天室java,C/S” 【描述】:“这是一个基于Java技术实现的聊天室项目,采用了经典的客户端/服务器(C/S)架构。在这个项目中,我们将深入理解Java网络编程,以及如何构建一个实时通信的应用。” ...
Java网络聊天室源码是一个基于Swing图形用户界面(GUI)和TCP协议实现的多线程通信项目。这个源码提供了学习Java网络编程和多线程处理的实用示例。让我们深入探讨一下其中涉及的关键技术点。 首先,TCP(传输控制...
本项目以"网络聊天室的java简单实现"为主题,旨在帮助初学者理解和掌握相关技术。以下将详细介绍这个项目的知识点。 首先,我们要理解的是Java语言基础。Java是一种广泛使用的面向对象的编程语言,具有跨平台性、...
在本项目中,我们关注的是一个基于Java实现的网络聊天室。这个聊天室的源代码设计得简洁明了,非常适合初学者学习和理解网络通信的基本原理。Java是一种广泛用于开发跨平台应用程序的语言,尤其在网络编程领域,其...
【网络聊天室】是一个使用Java编程语言开发的实时通信应用,允许多用户通过网络进行交互式的文本聊天。这个项目展示了网络编程、多线程以及并发处理等核心IT知识点。 首先,我们要理解网络聊天室的基本工作原理。在...
【JAVA简单网络聊天室源码】是一个非常适合初学者理解JAVA网络通信技术的实践项目。这个实验报告旨在帮助学习者深入理解如何使用JAVA实现一个基本的多用户聊天平台。在这个项目中,开发者将学习到如何利用JAVA的...
这是课程设计上做的聊天室。里面有很详细的代码描述。 基于java的服务器和客户端程序。
Java聊天室程序是一种基于Socket通信技术的多用户交互平台,它允许多个客户端通过网络与服务器进行实时通信。在这个"基于Socket的Java聊天室程序"中,我们主要关注以下几个核心知识点: 1. **Socket编程**:Socket...
《Java实现的网络聊天室详解》 在信息技术领域,网络通信是不可或缺的一部分,而聊天室则是网络交流的重要载体。本文将深入探讨一个基于Java编写的网络聊天室程序,旨在帮助初学者理解网络聊天室的基本原理及其Java...
【基于Java编写的网上聊天室】是一个利用Java编程语言实现的在线实时通信系统,它允许用户通过网络进行文字、语音甚至视频的交流。这个项目旨在提供一个基础的平台,让用户可以进行多对多的实时互动,是学习网络编程...
【标题】:“java做的网络聊天室源码”指的是使用Java编程语言实现的一个网络聊天室的完整源代码。这个项目可能是为了教学目的或者实际应用而设计的,它展示了如何利用Java的技术来创建一个可以让用户实时交流的平台...
Java网络聊天室简介:程序能够连接他人主机(局域网内)、能够进行用户的注册、登录、用户密码的修改;同时能够给对方发送文字内容,并且能够显示聊天时间;局域网内聊天不能超过50个连接(因为服务器套接字...
总的来说,“基于Java聊天室(GUI)”项目涵盖了网络编程、GUI设计、多线程以及数据交换等多个重要知识点,对于学习和提升Java开发技能非常有价值。开发者不仅可以掌握基础的TCP/IP通信,还能深入理解如何将这些概念...
【网络聊天室(Java)】项目是一个利用Java编程语言实现的聊天应用程序,它采用了传统的C/S(客户端/服务器)架构。在这个系统中,客户端作为用户交互的界面,负责接收用户的输入并发送到服务器,同时接收服务器返回...
在本案例中,“java RMI技术实现的网络聊天室”是一个使用RMI构建的多用户交互系统,可以让用户通过网络进行实时通信。以下是对这个项目的关键知识点的详细解释: 1. **RMI概念**:RMI是一种基于对象的远程调用机制...
【Java网络聊天室】是一个基于JDK 6.0版本开发的在线交流平台,它集成了登录、注册以及在线好友查询等一系列功能。这个项目的核心在于利用Java编程语言实现客户端与服务器之间的实时通信,使得用户能够进行实时的...
【标题】"简单聊天室java代码"所涉及的知识点主要集中在Java编程语言和网络编程领域,尤其是构建基于Java的实时通信应用。这个项目可能是一个基本的多用户交互平台,允许用户通过网络发送和接收文本消息。 【描述】...
该程序是一个简单的聊天程序,主要功能是可以...所以通过JAVA程序的制作来完成以前未完成的任务。本程序只是一个简单的实现通信的程序,由于时间原因没有制作更多的功能,功能的扩展可以在以后的时间里进行升级添加。
【Java 网络聊天室代码】是一个基于Socket编程实现的网络通信项目,它包括了服务器端(Server)和客户端(Client)两部分。在Java中,Socket是用于在网络中进行双向通信的基础类,它允许两个应用之间建立连接并交换...