java 简单聊天室程序

合集下载

一种基于Java技术的聊天室系统的设计与实现

一种基于Java技术的聊天室系统的设计与实现
维普资讯

种基于 Jv 技术的聊天室系统的设计与实现 aa
胡少 峰 , 赵 克 , 春 霞 耿
707 ) 1 0 1 ( 安 电子 科 技 大 学 研 究 生 院 , 安 西 西
摘 要 : 章 简 要 介 绍 了 J P ( a a S r e a e 文 S J v e v r P g )以 及 J C ( a a aa a e DB J v D tb s
J E E B等 。J v 2 E、 J a a技 术 从 推 出 至 今 仅 几 年
的时 问 , 以其 完 全 的 面 向对 象 风 格 , 作 平 就 操
台 的无 关 性 、 全性 、 安 健壮 性 、 移 植 性 、 可 中性 等 优 点 , 受 国 内外 软 件 开 发 人 员 的 欢 迎 。 深
We b应 用 的 一 般 过 程 为 : 置 好 We 设 b服 务
0 引 言
Jv a a技 术 是 由 美 国 S n公 司 倡 导 和 推 u 出 的 。 a a技 术 包括 J v Jv a a语 言 和 J v da a aMe i
A PI 、J v Ap lt a a s aa p e 、J v Ap l a i n、J v p i to c aa
RM I J v a s J P、 a a S r l t J 、 a a Be n 、 S J v e ve 、 DBC、
器 ; 发 J v pe 开 a a Ap lt或 C in piain l t Ap l t e c o 作为 客户 端程 序, 轻 服 务器 的负担 ; 减 用 J P、a aB a s J v e ve 、 J 等 构 建 在 S J v e n 、a aS r lt E B 服 务 器 端 运 行 的 服 务 程 序 ; 最 底 层 设 计 良 在 好 的 数 据 库 系 统 ; 户 以 HTTP 或 者 RM I 客

初级前端开发实训实现一个简单的聊天室功能

初级前端开发实训实现一个简单的聊天室功能

初级前端开发实训实现一个简单的聊天室功能一、简介在本次的初级前端开发实训中,我们将着手实现一个简单的聊天室功能。

聊天室是一种实时通信的应用程序,用户可以通过聊天室与其他用户进行文字交流。

我们将使用前端开发技术来搭建界面,并结合后端技术来实现聊天功能。

二、项目准备实现聊天室功能需要以下准备工作:1. 下载并安装Node.js:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,我们将使用它来实现后端的逻辑。

2. 安装Express框架:Express是Node.js的一个快速、开放、极简的web应用框架,我们将使用它来搭建服务器。

3. 创建项目文件夹:在本地计算机上创建一个文件夹,命名为ChatRoom,用于存放项目文件。

三、搭建前端界面1. 创建HTML文件:在ChatRoom文件夹中创建一个名为index.html的文件,这将作为前端界面的入口文件。

2. 编写HTML代码:根据聊天室的需求,设计并编写HTML代码,包括聊天显示区域、输入框、发送按钮等元素。

3. 使用CSS美化界面:在HTML文件中引入CSS文件,并根据需求编写样式,使得聊天室界面整洁美观。

四、实现前后端交互1. 创建服务器:在ChatRoom文件夹中创建一个名为server.js的文件,用于处理前后端之间的数据传输。

2. 使用Express框架:在server.js文件中引入Express框架,并设置服务器的监听端口。

3. 处理前端请求:编写服务器端代码,当接收到前端的请求时,根据请求的内容做出相应的处理。

4. 实现聊天功能:服务器端接收到用户发送的聊天消息后,将其广播给所有在线用户,实现实时的聊天功能。

五、项目测试1. 启动服务器:在终端中进入ChatRoom文件夹,并运行server.js 文件,启动服务器。

2. 打开浏览器:在浏览器中访问localhost:port(port为设置的监听端口),打开聊天室界面。

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

摘要随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐.目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。

该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。

前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。

后者通过与服务器建立连接,来进行客户端与客户端的信息交流。

其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。

开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。

在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。

经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java 语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统关键词:局域网聊天 socket javaAbstractAlong with the fast development of Internet,the network chating tool has already become one kind of important communication tools and received more and more web cams favor. At present, many extremely good chating tools have appeared . for example,Netmeeting, QQ,MSN—Messager and so on. This system development mainly includes two aspects of the server procedure of the network chat and the customer procedure of the network chat。

java聊天室部分主要代码

java聊天室部分主要代码

ChatClient.javaimport java.awt.*;import java.io.*;import .*;import java.applet.*;import java.util.Hashtable;public class ChatClient extends Applet implements Runnable{ Socket socket=null;DataInputStream in=null;//读取服务器端发来的消息DataOutputStream out=null;//向服务器端发送的消息InputInfo 用户名提交界面=null;UserChat 聊天界面=null;Hashtable listTable;//用于存放在线用户的用户名的散列表Label 提示条;Panel north,center;Thread thread;public void init(){setSize(1000,800);int width=getSize().width;int height=getSize().height;listTable=new Hashtable();setLayout(new BorderLayout());用户名提交界面=new InputInfo(listTable);int h=用户名提交界面.getSize().height;聊天界面=new UserChat("",listTable,width,height-(h+5));聊天界面.setVisible(false);提示条=new Label("正在连接到服务器...",Label.CENTER);提示条.setForeground(Color.red);north=new Panel(new FlowLayout(FlowLayout.LEFT));center=new Panel();north.add(用户名提交界面);north.add(提示条);center.add(聊天界面);add(north,BorderLayout.NORTH);add(center,BorderLayout.CENTER);validate();}public void start(){if(socket!=null&&in!=null&&out!=null){try{socket.close();in.close();out.close();聊天界面.setVisible(false);}catch(Exception ee){}}try{socket=new Socket(this.getCodeBase().getHost(),6666);in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());}catch(IOException ee){提示条.setText("连接失败");}//客户端成功连接服务器端if(socket!=null){InetAddress address=socket.getInetAddress();提示条.setText("连接:"+address+"成功");用户名提交界面.setSocketConnection(socket,in,out);north.validate();}if(thread==null){thread=new Thread(this);thread.start();}}public void stop(){try{socket.close();thread=null;}catch(IOException e){this.showStatus(e.toString());}}public void run(){while(thread!=null){if(用户名提交界面.getchatornot()==true){聊天界面.setVisible(true);聊天界面.setName(用户名提交界面.getName());聊天界面.setSocketConnection(socket,in,out);提示条.setText("祝聊天快乐!");center.validate();break;}try{Thread.sleep(100);}catch(Exception e){}}}}ChatMain.javaimport .*;import java.util.*;public class ChatMain {public static void main(String args[]) {ServerSocket server=null;Socket you=null;Hashtable peopleList;peopleList=new Hashtable();while(true){try{//服务器端在端口6666处监听来自客户端的信息server=new ServerSocket(6666);}catch(IOException e1){System.out.println("正在监听");}try{//当服务器端接收到客户端的消息后,取得客户端的IP地址。

基于Java多线程的聊天室程序

基于Java多线程的聊天室程序
的 网络 通信 链 接 实 现 数据 交 换 。即 服 务 器 和客 户 端 的应 用 程 序 各 有 一 个 S c e ,这 两个 S c e 把 服 务 器 和客 户 端 的程 序 连 接 okt okt 起 来 并 交换 数 据 。 ( )多线 程 :因 为 一 个 服 务 器 要 连 人 多 个 客 户 端 ,要 让 服 2 务 器 程 序 同时 为 多 个 客 户 服 务 , 就 需 要 为 每 个 客 户 端 开 辟 一
Bu f r dR a e b = n w Bu f r - fe e e d r r e fe e
d e d rn w n u S r a R a e (e Ip t te mRe d r e lp t te mO) a e ( g tn u S r a ) s ;
中 ,首 先 定 义 一 个 S reS c e, 并 指 明 端 口号 ,这 样 服 务 器 ev ro k t


t i. l n s = c in s h sc i t e l t; e
3 程序 实现
31 服 务 器 端 。
建 一个 类 ,名 称 为 C atev r h r re ,代 表 服 务 器 程 序 。 在 该 类 S
p bi v i u ) u l od rn({ c ty{ r
建立 好 之 后 .每 个 客 户端 的发 言 都 发 送 给 服 务 器 ,服 务 器 接 收 后 再 转 发 给所 有 连 入 的 客户 端 ,这 样 每 个 客 户 端就 都 能 收 到 其 他 客户 发 出 的信 息 了 。这 就 是 C S结 构 聊 天 室 的工 作 原 理 ,其 / 实现 主 要使 用 如 下 两 种技 术 :
p bi S re T ra S c e s Se l n s{ u l e v r he d(o k tsHa h tci t) c e

Java课程设计聊天室(含代码)

Java课程设计聊天室(含代码)

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JAVA实现基于C/S模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。

3.进度安排:12月28日 ~ 12月29日:课程设计选题,查找参考资料12月30日 ~ 1月1日:完成系统设计1月2日 ~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。

java聊天工具代码

java聊天工具代码
tamsg.append(exc.toString来自)); } }
else if(pareTo("close")==0) {
try {
DataInputStream is=new DataInputStream(socket.getInputStream());
if(pareTo("start")==0) {
try {
int po=Integer.parseInt(port.getText());
svsocket=new ServerSocket(po);
daemons=new Daemon[MAXUSER];
close.addActionListener(this);
add(panel2,BorderLayout.SOUTH);
tamsg=new TextArea();
tamsg.setBackground(Color.PINK);
tamsg.append("输入你要链接的地址,然后按(link)按钮\n");
}
catch (Exception exc) {
tamsg.append("error happended link\n");
tamsg.append(exc.toString());
}
}
else if(pareTo("id_ok")==0)
DataOutputStream os=new DataOutputStream(socket.getOutputStream());
os.write(strmsg.getBytes());

Java 多人聊天 源码

Java 多人聊天 源码

Java 多人聊天源码1.ChatApplet.java类import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import yout.*;import javax.swing.border.*;import java.io.*;import .*;public class ChatApplet extends JApplet {boolean isStandalone = false;BorderLayout borderLayout1 = new BorderLayout();Border border1;JPanel jPanel2 = new JPanel();Border border2;BorderLayout borderLayout2 = new BorderLayout();JPanel jPanel1 = new JPanel();JButton buttonSend = new JButton();BorderLayout borderLayout3 = new BorderLayout();JPanel jPanel3 = new JPanel();Border border3;BorderLayout borderLayout4 = new BorderLayout();JTextField textTalk = new JTextField();JPanel jPanel4 = new JPanel();Border border4;BorderLayout borderLayout5 = new BorderLayout();JScrollPane jScrollPane1 = new JScrollPane();JTextArea textMessages = new JTextArea();PrintWriter out = null;/**Get a parameter value*/public String getParameter(String key, String def) {return isStandalone ? System.getProperty(key, def) :(getParameter(key) != null ? getParameter(key) : def); }/**Construct the applet*/public ChatApplet() {}/**Initialize the applet*/public void init() {try {jbInit();Client client = new Client(this);if (client.isConnected())out = client.getOutputStream();elseappendMessage("大大的错误!!");}catch(Exception e) {e.printStackTrace();}}/**Component initialization*/private void jbInit() throws Exception {border1 = BorderFactory.createEmptyBorder(9,9,9,9);border2 = BorderFactory.createEmptyBorder(9,9,9,9);border3 = BorderFactory.createEmptyBorder(2,0,2,5);border4 = BorderFactory.createEmptyBorder(0,0,5,0);this.setSize(new Dimension(400,300));this.getContentPane().setLayout(borderLayout1);jPanel2.setBorder(border2);jPanel2.setLayout(borderLayout2);buttonSend.setFocusPainted(false);buttonSend.setText("发送");buttonSend.addActionListener(newjava.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {buttonSend_actionPerformed(e);}});jPanel1.setLayout(borderLayout3);jPanel3.setBorder(border3);jPanel3.setLayout(borderLayout4);jPanel4.setBorder(border4);jPanel4.setLayout(borderLayout5);textTalk.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) {textTalk_keyPressed(e);}});this.getContentPane().add(jPanel2, BorderLayout.CENTER);jPanel2.add(jPanel1, BorderLayout.SOUTH);jPanel1.add(buttonSend, BorderLayout.EAST);jPanel1.add(jPanel3, BorderLayout.CENTER);jPanel3.add(textTalk, BorderLayout.CENTER);jPanel2.add(jPanel4, BorderLayout.CENTER);jPanel4.add(jScrollPane1, BorderLayout.CENTER);jScrollPane1.getViewport().add(textMessages, null);}/**Get Applet information*/public String getAppletInfo() {return "Applet Information";}/**Get parameter info*/public String[][] getParameterInfo() {return null;}/**Main method*/public static void main(String[] args) {ChatApplet applet = new ChatApplet();applet.isStandalone = true;JFrame frame = new JFrame();//EXIT_ON_CLOSE == 3frame.setDefaultCloseOperation(3);frame.setTitle("Applet Frame");frame.getContentPane().add(applet, BorderLayout.CENTER);applet.init();applet.start();frame.setSize(400,320);Dimension d = Toolkit.getDefaultToolkit().getScreenSize();frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);frame.setVisible(true);}//static initializer for setting look & feelstatic {try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClass Name());}catch(Exception e) {}}public void appendMessage(String message) {textMessages.setText(message + textMessages.getText());}void buttonSend_actionPerformed(ActionEvent e) {String msg;msg = textTalk.getText().trim();if (msg.equals("") || msg == null) return;out.println(textTalk.getText());textTalk.setText("");}void textTalk_keyPressed(KeyEvent e) {if (e.getKeyChar() != '\n') return;out.println(textTalk.getText());textTalk.setText("");}}2.ChatServlet.javaimport javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class ChatServlet extends HttpServlet {private static final String CONTENT_TYPE = "text/html";/**Initialize global variables*/public void init(ServletConfig config) throws ServletException { super.init(config);try {new Server();}catch (IOException ex) {System.err.println("IO 错误:");ex.printStackTrace(System.err);destroy();}/**Process the HTTP Get request*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType(CONTENT_TYPE);PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>ChatServlet</title></head>");out.println("<body>");out.println("<p>The servlet has received a GET. This is the reply.</p>");out.println("</body></html>");}/**Clean up resources*/public void destroy() {}}3.Client.javaimport java.io.*;import .*;public class Client {Socket socket = null;private String host;private boolean connected = false;public boolean isConnected() { return connected; }public Client(ChatApplet applet) {try {host = applet.getDocumentBase().getHost();//host = "202.115.4.246";socket = new Socket(host, Server.port);connected = true;new ClientRecieveThread(socket, applet).start();}catch (Exception ex) {applet.appendMessage(ex.getMessage());ex.printStackTrace(System.err);}public PrintWriter getOutputStream() throws IOException {return new PrintWriter(socket.getOutputStream(), true);}}4.ClientRecieveThread.javaimport java.io.*;import .*;public class ClientRecieveThread extends Thread {private ChatApplet applet = null;private Socket socket = null;public ClientRecieveThread(Socket socket, ChatApplet applet) { this.socket = socket;this.applet = applet;}public void run() {BufferedReader in = null;String inputLine;try {in = new BufferedReader(new InputStreamReader(socket.getInputStream()));while ((inputLine = in.readLine()) != null) {//if (inputLine.equalsIgnoreCase("quit")) break; applet.appendMessage(inputLine + "\n");}}catch (Exception ex) {ex.printStackTrace(System.err);}finally {Close();}}void Close() {try {socket.close();catch (Exception ex) {ex.printStackTrace(System.err);}}}5.Protocol.javapublic class Protocol {private String userid;public Protocol(String userid) {erid = userid;}public String processInput(String input) {return (userid + ": " + input);}}6.Server.javaimport java.io.*;import .*;import java.util.Vector;public class Server {private ServerSocket serverSocket = null;public static int port = 4444;private boolean listening = true;Vector clientSockets = new Vector(10);public Server() throws IOException {try {serverSocket = new ServerSocket(port);}catch (Exception ex) {System.err.println("不能监听端口:" + port); ex.printStackTrace(System.err);System.exit(-1);System.out.println("成功监听端口:" + port);while (listening)addClient(serverSocket.accept());serverSocket.close();}public void addClient(Socket socket) throws IOException {new ServerThread(socket, this).start();clientSockets.add(socket);send("欢迎 " + socket.getInetAddress().getHostName() + " 来到这里!");System.out.println("聊天室共有 " + clientSockets.size() + " 人");}public void removeClient(Socket socket) throws IOException {send("欢送 " + socket.getInetAddress().getHostName() + " 的离去");clientSockets.remove(socket);System.out.println("聊天室共有 " + clientSockets.size() + " 人");}public void send(String msg) throws IOException {Socket socket = null;for (int I = 0; I < clientSockets.size(); I++) {socket = (Socket)(clientSockets.get(I));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println(msg);}}public static void main(String[] args) throws IOException {new Server();}}7.ServerThread.javapublic class ServerThread extends Thread {private Server server = null;private Socket socket = null;private Protocol jcp = null;private String userid;public ServerThread(Socket socket, Server server) {super("jetic Chat Server");this.socket = socket;this.server = server;userid = socket.getInetAddress().getHostName();jcp = new Protocol(userid);}public void run() {PrintWriter out = null;BufferedReader in = null;String inputLine, outputLine;try {out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out.println("你可以开始你的闲聊了:)");while ((inputLine = in.readLine()) != null) {if (inputLine.equalsIgnoreCase("quit")) break;outputLine = jcp.processInput(inputLine);server.send(outputLine);}}catch (Exception ex) {ex.printStackTrace(System.err);Close();}finally {Close();}}private void Close() {try {server.removeClient(socket);socket.close();}catch (Exception ex) {ex.printStackTrace(System.err); }}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单聊天室程序先运行Server,然后运行test。

有简单的界面登录成功后实现群聊,-to name something 实现单独聊天package chatroom;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketAddress;import .SocketException;import .UnknownHostException;import java.util.Enumeration;import java.util.Hashtable;import java.util.Scanner;public class Server implements Runnable{private DatagramSocket server = null;private DatagramPacket getDatas = null;private InetAddress serverAddress = null;private int port = 0;//开始运行监听的变量private boolean beStart = false;//用来测试服务器的变量private boolean test = true;//信息存储器private Hashtable<String,SocketAddress> infoMemory = new Hashtable<String,SocketAddress>();/*** 测试服务器连接* @param ip* @param port* @return*/public boolean testServer(String ip,int port) {this.initServer(ip, port);return test;}/*** 服务器初始化* @param ip* @param port*/public void initServer(String ip,int port) {//确定IP与port输入正确this.fixServerLink(ip,port);try {server = new DatagramSocket(this.port,serverAddress);System.out.println("!-The Server Initialization Success!");//可以开始运行变量beStart = true;} catch (SocketException s) {//如果出现异常,则服务器测试不通过test = false;errorTip("!-The Server Initialization Fail!");}}/*** 确定服务器IP和端口信息* @param ip* @param port*/private void fixServerLink(String ip,int port) {//判断连接服务器的端口号//如果输入命令为0,则为默认端口号9999//否则端口号为新端口号if(port == 0)this.port = 9999;elsethis.port = port;//判断连接服务器的IP地址//如果输入命令为0,则为默认的本地IP地址//否则为输入的IP地址try {if(ip.equalsIgnoreCase("0"))this.serverAddress = InetAddress.getLocalHost();elsethis.serverAddress = InetAddress.getByName(ip);} catch (UnknownHostException u) {errorTip("!-Sorry, IP address you put is not currect!");}}* 监听信息**/public void listenLink() {byte[] buf = new byte[1024];String mes = null;try {getDatas = new DatagramPacket(buf,buf.length);System.out.println("!-The Server starts listenning to message.");while(beStart) {server.receive(getDatas);mes = new String(buf,0,getDatas.getLength());//将获取的数据传递至数据分析器this.analyseMes(mes);}} catch (IOException e) {errorTip("!-The Server Can not receive message");}}/*** 数据分析器,给予相应处理* @param mes*/private void analyseMes(String mes) {//获取当前客户端的地址:SocketAddress adr = getDatas.getSocketAddress();//-test:进行服务器与客户端的连接测试//若成功,则将该客户端发送成功消息if(mes.trim().equalsIgnoreCase("-test")) {transforMesSingle(adr,"-test: !-From Server:Succeed in Testing.");}//-quit:接受客户端退出信息//将该用户的退出信息转发至所有在线成员else if(mes.trim().equalsIgnoreCase("-quit")) {String name = this.getConsumerName(adr);System.out.println(name+"//"+adr+" quit! ");transforMes("* "+name+"退出聊天室");infoMemory.remove(name);}//-getList:接受客户端获取列表的请求//将所有用户连接为字符串的形式,如:"-getList,用户1,用户2...用户n"else if(mes.trim().equals("-getList")) {StringBuffer list = new StringBuffer();list.append("-getList,");Enumeration<String> names = infoMemory.keys();while (names.hasMoreElements()) {list.append(names.nextElement()+",");}transforMesSingle(getDatas.getSocketAddress(),list.toString());}//-to:接受客户端请求,将信息转发给相应客户//如果目标客户不存在,则向请求客户发送相应消息else if(mes.indexOf("-to ") != -1 && mes.startsWith("-to ")) {String main = mes.substring("-to ".length(),mes.length());String toName = main.substring(0,main.indexOf(" "));String name = this.getConsumerName(adr);String con = name+" say to you :"+main.substring(toName.length()+1,main.length());if(!infoMemory.containsKey(toName))transforMesSingle(adr,"!-The message can not be recevie by whom you send for,please check out.");elsetransforMesSingle(infoMemory.get(toName),con);}//-nick:接受客户端登录请求//如果输入的匿名不存在,则登记该用户与infoMemory//如果存在则返回相应提示else if(mes.indexOf("-nick ") != -1 && mes.startsWith("-nick ")) {String nickName = mes.substring("-nick ".length(), mes.length());infoMemory.put(nickName,adr);transforMes("欢迎"+nickName +" 来到聊天室!");System.out.println(nickName+"//"+adr.toString()+"连接成功");}//一般消息将会转发至所有用户else {String name = this.getConsumerName(adr);transforMes(name+": "+mes);}}/*** 通过地址得到用户的昵称* 由于Hashtable无法通过Value获取Key,所有专门写该方法* @param sa* @return*/private String getConsumerName(SocketAddress sa) {Enumeration<String> names = infoMemory.keys();String name = null;while (names.hasMoreElements()) {String temp = names.nextElement();SocketAddress adrs = infoMemory.get(temp);//进行比较if (sa.equals(adrs)) {name = temp;break;}}return name;}/*** 向所有的用户发送数据* @param mes*/public void transforMes(String mes) {byte[] buf = mes.getBytes();DatagramPacket sendDatas = null;Enumeration<SocketAddress> all = infoMemory.elements();try {while (all.hasMoreElements()) {sendDatas = new DatagramPacket(buf,buf.length,all.nextElement());server.send(sendDatas);}} catch (SocketException s) {errorTip("!-The feedback address is error!");} catch (IOException i) {errorTip("!-Can not send message!");}}/*** 向单个用户发送数据* @param adr* @param mes*/public void transforMesSingle(SocketAddress adr,String mes) {byte[] buf = mes.getBytes();try {DatagramPacket sendDatas = new DatagramPacket(buf,buf.length,adr);server.send(sendDatas);} catch (SocketException s) {errorTip("!-The feedback address is error!");} catch (IOException i) {errorTip("!-Can not send message!");}}/*** 断开连接**/public void cutServer() {beStart = false;if(server != null)server.close();System.out.println("!-The server is done.");}public void helpList() {System.out.println("-help"+"获取服务器相应操作的帮助"+"n"+"-run "+"运行服务器,并同时建立信息监听"+"n"+"-stop"+"停止服务器"+"n"+"-quit"+"停止服务器,并退出命令"+"n");}/*** 线程*/public void run() {listenLink();}/*** 主要操作* @param args*/public static void main(String[] args) {Server ser = new Server();String getIp = null;int getPort = 0;Scanner input = new Scanner(System.in);//建立输入boolean goon = true;while (goon){System.out.println("1.输入服务器的IP地址,默认输入数字0:");getIp = input.next();System.out.println("2.输入服务器的端口号,默认输入数字0:");try {getPort = input.nextInt();} catch (Exception e) {System.out.println("!-The port style is not currect!");}//测试服务器创建,如果成功则同时为信息监听器建立线程System.out.println("!-创建服务器并运行...");if (ser.testServer(getIp, getPort)) {new Thread(ser).start();goon = false;} elseSystem.out.println("!-服务器创建失败,请检查!");}}/*** 错误提示* @param str*/public static void errorTip(String str) {System.out.println("-----------------n"+str+"n-----------------");}}package chatroom;import java.awt.GridLayout;import java.awt.ScrollPane;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.*;import .*;import java.util.InputMismatchException;import java.util.NoSuchElementException;import java.util.Scanner;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextArea;import javax.swing.JTextField;public class Consumer implements Runnable{//发送数据的服务器Net地址,在fixServerLink //和sendMes方法中会用到private InetAddress sendAddress = null;private int port = 0;//客户端private DatagramSocket client = null;//发送的数据报private DatagramPacket sendDatas = null;//用来测试是否能够连接成功或者用户名是否正确//在testConnect和checkNickName中会用到.//并穿插在sendMes方法中private boolean test = true;static final JTextArea jt10 = new JTextArea();static final JTextArea jt3 = new JTextArea();Scanner s = new Scanner(System.in);private String u_Id;private String u_Name;private String u_Password;private int index = 0;int k =0;public String getU_Id() {return u_Id;}public void setU_Id(String u_Id) {this.u_Id = u_Id;}public String getU_Name() {return u_Name;}public void setU_Name(String u_Name) {this.u_Name = u_Name;}public String getU_Password() {return u_Password;}public void setU_Password(String u_Password) {this.u_Password = u_Password;}static Consumer users[] = new Consumer[100];public void UserWriter(){OutputStream os = null;File file = new File("F://User.txt");try {os = new FileOutputStream(file);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}String str="";for(int i=0;i<users.length;i++){if(users[i]!=null){String temp = str + users[i].getU_Id() + "," + users[i].getU_Name()+ ","+ users[i].getU_Password()+";";str = temp;}}try {os.write(str.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void UserReader(){//初始化时从文件中读取数据File file = new File("F://User.txt");if(!file.exists()){try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(file.length()==0){users = null;users = new Consumer[100];}else{InputStream is = null;try {is = new FileInputStream(file);} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}byte byt[] = new byte[(int)file.length()];try {is.read(byt);String temp = new String(byt);String user1[] = temp.split(";");for(int i =0;i<user1.length;i++){String date[] =user1[i].split(",");String id = date[0];String name = date[1];String password = date[2];Consumer ut = new Consumer();ut.setU_Id(id);ut.setU_Name(name);ut.setU_Password(password);users[i] = ut;}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public void Registor(){erReader();// 创建窗体JFrame jf = new JFrame("注册");// 创建容器JPanel jp = new JPanel();// 为容器添加布局管理器jp.setLayout(new GridLayout(4,3));// 创建组建JLabel j1 = new JLabel("用户名:");JLabel j2 = new JLabel("用户密码:");JLabel j3 = new JLabel("重复密码:");JLabel j4 = new JLabel();final JLabel j5 = new JLabel();final JLabel j6 = new JLabel();final JLabel j7 = new JLabel();final JTextField name = new JTextField(8);final JPasswordField pwd = new JPasswordField(8);final JPasswordField pwd_ag = new JPasswordField(8);final JButton but = new JButton("注册");JPanel jp1 = new JPanel();jp1.setLayout(new GridLayout(1,3));jp1.add(j5);jp1.add(but);// 将组件添加到容器jp.add(j1);jp.add(name);jp.add(j5);jp.add(j2);jp.add(pwd);jp.add(j6);jp.add(j3);jp.add(pwd_ag);jp.add(j7);jp.add(j4);jp.add(jp1);// 将容器添加到窗体jf.add(jp);// 设置窗体大小jf.setSize(300,150);// 设置初始位置jf.setLocation(300,200);// 设置可见jf.setVisible(true);// 设置窗体是否可调jf.setResizable(false);// 添加监听器but.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("监听器开始工作");String u_name = name.getText();String u_pwd = new String(pwd.getPassword());String u_pwd_ag =new String( pwd_ag.getPassword());int index = 0;Consumer u0 = new Consumer();//判断用户名是否在普通用户中已存在if(u_name.length()!=0){for(int i =0;i < users.length;i++){if(users[i]!=null){if(u_name.equals(users[i].getU_Id())){j5.setText("用户名已存在");break;}}else{index =1;u0.setU_Id(u_name);}}}else{j5.setText("用户名不能为空!");}if(index ==1){if(u_pwd.equals(u_pwd_ag)){if(u_pwd.length()!=0){u0.setU_Password(u_pwd_ag);for(int i=0;i<users.length;i++){if(users[i]==null){if(users[i]==null){users[i]=u0;j5.setText("恭喜你!注册成功!");name.setText(null);pwd.setText(null);pwd_ag.setText(null);break;}}}}else{j6.setText("密码不能为空!");}}else{j6.setText("两次输入密码不一致,请重新注册!");}}}});erWriter();}public void Login(){erReader();// 创建窗体和容器final JFrame jf = new JFrame("登录");JPanel jp = new JPanel();// 创建组件JLabel jl1 = new JLabel("用户名:");JLabel jl2 = new JLabel("用户密码:");JButton but1 = new JButton("注册");JButton but2 = new JButton("登录");final JTextField name = new JTextField(8);final JPasswordField pwd = new JPasswordField(8); // 为容器创建布局管理器jp.setLayout(new GridLayout(3,2));JPanel jp1 = new JPanel();//jp1.setLayout()// 将组件添加到容器jp.add(jl1);jp.add(name);jp.add(jl2);jp.add(pwd);jp.add(but1);jp.add(but2);// 将容器添加到窗体jf.add(jp);// 窗体设置jf.setSize(300,150);jf.setLocation(300,200);jf.setVisible(true);jf.setResizable(false);// 添加监听器but1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Registor();}});but2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {final Consumer consumer = new Consumer();erReader();Scanner s = new Scanner(System.in);String Id = name.getText();for(int i = 0;i<users.length;i++){if(users[i]!=null){if(users[i].getU_Id().equals(Id)){String password = new String(pwd.getPassword());if(password.equals(users[i].getU_Password())){jf.setVisible(false);send(Id);break;}else{new Demo01().WrongPwd();break;}}}else {new Demo01().WrongName();break;}}}});}/**** 建立连接* @param ip服务器IP号* @param port 服务器Port*/public void connectServer(String ip,int port) {//先确定输入的IP与端口号是否符合规则this.fixServerLink(ip,port);//try {try {client = new DatagramSocket();} catch (SocketException e) {// TODO Auto-generated catch blockSystem.out.println("The Connection of server is error.");}//} catch(SocketException s) {//System.out.println("The Connection of server is error.");//}}/*** 确定IP与Port输入是否正确* @param ip* @param port*/private void fixServerLink(String ip,int port) {//判断连接服务器的端口号//如果输入命令为0,则为默认端口号9999//否则端口号为新端口号if(port == 0)this.port = 9999;elsethis.port = port;//判断连接服务器的IP地址//如果输入命令为0,则为默认的本地IP地址//否则为输入的IP地址try {if(ip.equalsIgnoreCase("0"))this.sendAddress = InetAddress.getLocalHost();elsethis.sendAddress = InetAddress.getByName(ip);} catch (UnknownHostException e) {// TODO Auto-generated catch blockSystem.out.println("Sorry, IP address you put is not currect!");}//try {//} catch (UnknownHostException u) {//System.out.println("Sorry, IP address you put is not currect!");//}}/*** 断开连接*/public void disconnectServer() {//当客户端断开连接之前,客户端会向服务器端发送一个信息,//以便告诉服务器该客户下线this.sendMes("-quit");if(client != null){client.close();}}/*** 发送消息* @param mes*/public void sendMes(String mes) {byte[] buf = mes.getBytes();sendDatas = new DatagramPacket(buf,buf.length,sendAddress,port); //当建立发送时,测试正常test = true;try {client.send(sendDatas);} catch (NullPointerException n) {//如果无法得到要发送的消息,测试终止test = false;System.out.println("无法得到要发送的消息");} catch (IOException s) {//如果无法发送消息至服务器,测试终止test = false;System.out.println("无法发送到服务器");}}/*** 得到数据*/public void getMes() {String str = null;byte[] buf = new byte[1024];DatagramPacket getDatas = new DatagramPacket(buf,buf.length);String mes = null;try {while(true) {client.receive(getDatas);mes = new String(buf,0,getDatas.getLength());//如果服务器发送的消息中的头片段有-getList//表明客户端获得在线用户列表,调用getList方法解析if(mes.indexOf("-getList") == 0)this.getList(mes);else{jt10.append(mes+"\n");System.out.println(mes);}}} catch (IOException i) {System.out.println("Fail in receving message");}}/*** 得到一次数据**/public String getMesOnce() {byte[] buf = new byte[1024];DatagramPacket getDatas = new DatagramPacket(buf,buf.length);String mes = null;try {client.receive(getDatas);mes = new String(buf,0,getDatas.getLength());} catch (Exception e) {System.out.println("!-Can not receive the message!");} finally {}return mes;}/*** 显示在线用户列表* @param mes*/private void getList(String mes) {String[] list = mes.split(",");jt3.setText("");for(int i = 1;i<list.length;i++) {jt3.append("----"+list[i]+"---"+"\n");}}/*** 测试连接* @param ip* @param port* @return*/public boolean testConnect(String ip,int port) {//创建连接,测试连接是否正确this.connectServer(ip,port);//如果连接正确,试图发送测试标识"-test"//在发送数据过程中测试连接是否正确this.sendMes("-test");//如果连接发送测试通过//则开始测试是否能够正确if (test) {String mes = this.getMesOnce();//如果服务器返回相应的标识,测试通过if (mes.startsWith("-test")) {test = true;}}if(client != null) {client.close();}return test;}/*** 判断用户名输入是否正确*/// private boolean checkNickName(String nickName) {// test = true;// String mes = null;////判断昵称是否符合约定// for(int i = 0;i<nickName.length();i++) {// char temp = nickName.charAt(i);////如果不符合,则终止测试// if(!Character.isLetterOrDigit(temp)) {// test = false;// break;// }// }////如果通过约定,则试图向服务器发送昵称,进行判断// if (test) {// this.sendMes("-nick "+nickName);// mes = this.getMesOnce();////如果服务器返回"-nick"标识////说明测试昵称失败,终止测试// if (mes.startsWith("-nick")) {// test = false;// }// }//// System.out.println(mes);// return test;// }/*** 得到帮助列表**/public void helpList() {System.out.println("重要说明:如果已经成功连接,只要输入内容,所有在线用户都能看到您的发言。

相关文档
最新文档