java编写的简单局域网聊天室(适合初学者).
JAVA局域网聊天系统源代码
这是我自己做的简单聊天系统客户端package LiaoTianSys;import java.awt.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import .Socket;import .UnknownHostException;public class ConversationFrame extends JFrame {JScrollPane jsp;JTextField jtf;static JTextArea jta;//JTextArea jat1,jta2;JButton enter=new JButton("发送");JButton jb=new JButton("聊天室好友");JButton jb2=new JButton("进入聊天室");JButton jb3=new JButton("刷新在线人员列表");JPanel jp,jp1,jp3,jp4;DefaultListModel listmodel = new DefaultListModel();//static String[] NAME=new String[10];String n[]={"f"};JList list=new JList(listmodel);JLabel time=new JLabel("当前系统时间:");JLabel showtime=new JLabel("显示时间");JLabel jl=new JLabel("输聊天信息");JLabel nicheng=new JLabel("昵称");JTextField NCshuru=new JTextField(10);static DataOutputStream dos;static DataInputStream dis;//final LoginFrame lf;Socket socket;public ConversationFrame(){Container con=getContentPane();con.setLayout(new BorderLayout());jp=new JPanel();setSize(700,600);setLocation(100,100);jta=new JTextArea();jta.setEditable(false);jsp=new JScrollPane(jta);con.add(jsp,BorderLayout.CENTER);jtf=new JTextField(20);jp.add(jl);jp.add(jtf);jp.add(enter);con.add(jp,BorderLayout.SOUTH);jp1=new JPanel(new BorderLayout());JScrollPane jsp1=new JScrollPane(list);jp1.add(jsp1,BorderLayout.CENTER);jp1.add(jb,BorderLayout.NORTH);con.add(jp1,BorderLayout.EAST);//pack();jp3=new JPanel();jp3.add(nicheng);jp3.add(NCshuru);jp3.add(jb2);con.add(jp3,BorderLayout.NORTH);jp4=new JPanel(new GridLayout(10,1));jp4.add(jb3);jp4.add(time);jp4.add(showtime);new getTime(this).start();con.add(jp4,BorderLayout.WEST);setVisible(true);// 发送信息给所有人enter.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubString info=jtf.getText();try {dos.writeUTF(NCshuru.getText()+" 对所有人说:"+info);dos.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});//进入聊天室时将自己的昵称发给服务器,首先去验证是否会与已有的人同名,本聊天室是不支持同昵称聊天jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){String msg=NCshuru.getText().toString();//得到昵称if(msg.length()==0){JOptionPane.showMessageDialog(null, "昵称不应该为空,", "温馨提示", RMA TION_MESSAGE);}{try{dos.writeUTF("name"+msg);dos.flush();}catch(Exception ex){System.out.println(ex.getMessage());}}}});//向服务器请求更新在线人员列表jb3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try {listmodel.removeAllElements();//请求之前删除JList对象中的所有内容dos.writeUTF("请求更新在线人员列表");dos.flush();} catch (IOException e1) {// TODO Auto-generated catch block//e1.printStackTrace();System.out.println(e1.getMessage());}}});//当有在线人员时,双击JList列表某项弹出私聊对话框事件,匿名内部类实现的list.addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){if(e.getClickCount()==2){int index=list.locationToIndex(e.getPoint());// 获得list表中的索引值String recevier=(String)listmodel.getElementAt(index);//得到索引对应的值String sender=NCshuru.getText();new Danliao(sender,recevier,socket);}}});}public static void main(String[] args) {ConversationFrame Con=new ConversationFrame();Con.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Con.kaishi();}public void kaishi(){try {socket=new Socket("172.16.14.60",8888);dos=new DataOutputStream(socket.getOutputStream());dis=new DataInputStream(socket.getInputStream());pc pc1=new pc(socket,this);//传送套接字,本类对象给pc线程pc1.start();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}// pc线程类,负责接收服务器发送来的信息class pc extends Thread{ ConversationFrame conver;Socket socket;public pc(Socket socket,ConversationFrame conver){this.conver=conver;this.socket=socket;}public void run(){try {int i=0;while(true){String line;//从线路读取信息line=ConversationFrame.dis.readUTF();// 将所有的在线人员昵称发送给JList,并添加到在线人列表中if(line.startsWith("N"))// 服务器发送过来的信息的格式是N+{String na=line.substring(1);try{conver.listmodel.addElement(na);System.out.println(na);}catch(Exception e){System.out.println(e.getMessage());}}//接受服务器发来的广播聊天信息else{ConversationFrame.jta.append(line+"\n");}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println(e.getMessage());}}}服务器端package LiaoTianSys;import java.io.*;import .*;import java.util.*;public class Server implements Runnable{public static final int port=8888;protected ServerSocket ss;static Vector connections;Thread connect;public Server(){try {ss=new ServerSocket(port);connections=new Vector(1000);connect=new Thread(this);connect.start();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {new Server();}public void run(){try{while(true){Socket client=ss.accept();System.out.println("客户端连接上");firstthread f=new firstthread(this,client);f.setPriority(Thread.MIN_PRIORITY);f.start();connections.addElement(f);}}catch(IOException e){System.out.println(e.getMessage());}}//向所有人发送聊天信息public void SenAll(String msg){int i;firstthread ft;for(i=0;i<connections.size();i++){ft=(firstthread)connections.elementAt(i);try{ft.out.writeUTF(msg);}catch(Exception e){System.out.println(e.getMessage());}}}//发送单聊信息的方法public void SenOne(String msg){int i;firstthread ft;/*String s1,s2,s3;s1=new String("people");s2=new String(msg.substring(2));//私信为两个字s3=s1.conString msg="我悄悄的对小花说你好啊";cat(s2);*/int begin=msg.indexOf("对");int end=msg.indexOf("说");begin=begin+1;String strNew=msg.substring(begin,end);for(i=0;i<connections.size();i++)//遍历线程,找到要发送的对象{ft=(firstthread)connections.elementAt(i);//遍历线程if(strNew.startsWith()){System.out.println();try{String MSG=msg.substring(7);ft.out.writeUTF(MSG);}catch(IOException e){System.out.println(e.getMessage());}}}}}class firstthread extends Thread{protected Socket client;String line,name=null;DataOutputStream firstout,out;DataInputStream in;Server server;public firstthread(Server server,Socket socket){this.server=server;this.client=socket;try{in=new DataInputStream(client.getInputStream());out=new DataOutputStream(client.getOutputStream());firstout=new DataOutputStream(client.getOutputStream());}catch(IOException e){server.connections.removeElement(this);}}//客户线程运行的方法,不断监听客户线路发送的来的信息,然后决定转发方式public void run(){try{while(true){line=in.readUTF();if(line.startsWith("name")){//获取当前线程firstthreadd=(firstthread)(server.connections.elementAt(server.connections.indexOf(this)));line=line.substring(4);if(==null){=line;}}//将服务器的所有在线人员的昵称发送给所有的客户端else if(line.startsWith("请求更新在线人员列表")){try{for(int i=0;i<server.connections.size();i++){firstthread c=(firstthread)(server.connections.elementAt(i));if(!=null){firstout.writeUTF("N"+);//发送昵称}}}catch(Exception e){System.out.println(e.getMessage());}}else if(line.startsWith("private")){server.SenOne(line);}//发送聊天信息给所有的pc客户端else{server.SenAll(line);}}}catch(IOException e){System.out.println(e.getMessage());}}}显示时间package LiaoTianSys;import java.text.SimpleDateFormat;import java.util.Date;public class getTime extends Thread{String time;ConversationFrame conver;public getTime(ConversationFrame conver){this.conver=conver;System.out.println("获得系统时间");}public void run(){while(true){SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss");time= df.format(new Date());//System.out.println(time);conver.showtime.setText(time);try{this.sleep(1000);}catch(Exception e){System.out.println(e.getMessage());}}}public static void main(String []args){}}单聊package LiaoTianSys;import java.io.DataOutputStream;import java.io.IOException;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Danliao extends JFrame implements ActionListener{ JButton jb=new JButton("发送");JPanel jp1=new JPanel();JLabel jl=new JLabel("输入聊天信息");JTextField jtf=new JTextField(20);JTextArea jta=new JTextArea();JScrollPane jsp=new JScrollPane(jta);String recevier;String sender;Socket socket;public Danliao(String sender,String recevier,Socket socket) { this.recevier=recevier;this.sender=sender;this.socket=socket;setBackground(Color.red);setTitle("与"+recevier+"单聊");setSize(400,400);setLocation(200,200);Container con=getContentPane();con.setLayout(new BorderLayout());con.add(jsp,BorderLayout.CENTER);jp1.add(jl);jp1.add(jtf);jp1.add(jb);/*addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){//System.exit(0);//this.dispose();//this.hide();this.setVisible(false);}});*/addWindowListener(new Close(this));con.add(jp1,BorderLayout.SOUTH);jb.addActionListener(this);setVisible(true);}public void actionPerformed(ActionEvent e){ String msg=jtf.getText();jta.append(msg+"\n"+"\n");jtf.setText(null);try{DataOutputStream dos=new DataOutputStream(socket.getOutputStream());dos.writeUTF("private"+sender+"悄悄的对"+recevier+"说: "+msg);jtf.setText(null);}catch(Exception e1){e1.printStackTrace();}}public static void main(String[] args){}}//单击关闭窗口事件,隐藏单聊窗口class Close extends WindowAdapter{Danliao danliao;public Close(Danliao danliao){this.danliao=danliao;}public void windowClosing(WindowEvent e) {danliao.setVisible(false);}}。
用javaWebSocket做一个聊天室
⽤javaWebSocket做⼀个聊天室最近⼀个项⽬中,需要⽤到Java的websocket新特性,于是就学了⼀下,感觉这技术还挺好玩的,瞬间知道⽹页上⾯的那些在线客服是怎么做的了。
先看图:实现了多客户机进⾏实时通讯。
下⾯看代码项⽬结构图:很简单,就1个类,1个页⾯然后看具体代码先看后端代码package com.main;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.*;import javax.websocket.server.ServerEndpoint;/*** @ServerEndpoint 注解是⼀个类层次的注解,它的功能主要是将⽬前的类定义成⼀个websocket服务器端,* 注解的值将被⽤于监听⽤户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端*/@ServerEndpoint("/websocket")public class H5ServletServerSocket {// 静态变量,⽤来记录当前在线连接数。
应该把它设计成线程安全的。
private static int onlineCount = 0;// concurrent包的线程安全Set,⽤来存放每个客户端对应的MyWebSocket对象。
若要实现服务端与单⼀客户端通信的话,可以使⽤Map来存放,其中Key可以为⽤户标识 private static CopyOnWriteArraySet<H5ServletServerSocket> webSocketSet = new CopyOnWriteArraySet<H5ServletServerSocket>();// 与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;/*** 连接建⽴成功调⽤的⽅法** @param session* 可选的参数。
基于JAVA局域网聊天程序设计与实现(附源代码)
局域网聊天课程设计摘要随着互联网的发展,网络聊天工具作为一种交流工具,已经受到网民的青睐。
目前,出现了很多功能强大的聊天工具,其中应用比较广泛的有腾讯QQ、MSN-Messager等等。
即时通讯软件,是每一个上网用户都需要的工具,它除了能够让您迅速地在网上找到自己的朋友和伙伴之外,还可以实时交谈和传递信息,截止到目前,全球约有近3亿多人使用即时软件,正因为即时通讯软件拥有数以亿计的用户和增长的市场,所以各个公司都盯上了这个最大的市场,一时间,即时通讯市场硝烟四起。
对等网络(peer-to-peer,简称P2P),应用最初出现时和现在并不相同。
事实上可以认为它是若干不同技术以及流行趋势相结合的产物。
以下是导致P2P技术发展最重要的趋势:首先,一些新技术与软件工程的结合,形成了一种将工作分散的趋势。
P2P计算正是这种分散工作趋势的结果。
其次,在企业应用集成等因素的驱动下,过去十年渐渐形成从集中的单机系统转向分布式系统。
然而随着互联网的发展,全面的分布式计算也就成为一种迫切需求。
关键词:局域网聊天 P2P javaAbstractWith the development of the Internet,the chat tool as a communication tool, has been popularly accepted by netizens of all ages. At present, there are many powerful chat tools, of which Tencent QQ, MSN-Messager are much more prevalent.Instant messaging software is necessary for every one who connects to the internet, which can not only provide you a prompt way to find friends and partners online, but can provide you the convenience of internet relay chat and information delivering. Up to now, there are about 300 million people using real-time software all over the world. As more and more corporations have focused on this market with growing potential, which has hundreds of millions of uses, the competitions among these corporations are extremely fierce.The initial application of peer-to-peer network (peer-to-peer, referred to as P2P) is not the same as it is now. In fact, it can be regarded as a combination of different technologies and fashion trends. Below are the most important trends that have led the development of P2P technology: First of all, the integration of software engineering and new technologies led to a working dispersion trend. As a result, P2P computing was born. Then, in the past decade, it has turned fro m a single centralized system to distributed system due to the motivation of factors such as enterprise application integration. At last, with the development of the Internet, however, a comprehensive distributed computing has become an urgent need.Keywords:LAN chat P2P java局域网聊天课程设计目录摘要 (i)Abstract ..................................................................................................................................... i i 1绪论 . (1)1.1JAVA的网络功能与编程 (1)1.1.1JAVA概述 (1)1.1.2 JAVA的特点 (3)1.1.3 JAVA语言在网络上的应用 (5)1.2J AVA B EANS技术 (6)1.3IP/TCP协议常识 (6)1.4S OCKET的简介 (7)1.5对等网络 (8)1.5.1 对等网络发展历史 (8)1.5.2 对等网络的概念 (9)1.5.3 对等网络的主要系统结构 (9)2 JAVAqq局域网聊天程序的需求分析 (13)2.1课题来源 (13)2.2需求分析 (13)3 JAVAqq局域网聊天程序的系统分析与设计 (15)3.1JAVA QQ局域网聊天程序的总体设计要点 (15)3.2JAVA QQ局域网聊天程序的设计步骤及功能模块划分 (15)3.3JAVA QQ局域网聊天程序各功能模块 (16)4 JAVAqq局域网聊天程序的设计与实现 (24)4.1开发环境工具 (24)4.2硬件环境 (24)4.3聊天系统功能模块的测试 (24)结论 (27)致谢 (29)参考文献 (30)附录 A 程序源代码 (31)1绪论随着互联网逐步普及,互联网技术的逐步提高。
javaweb实现简单聊天室
javaweb实现简单聊天室⽬标servlet、jsp实现简单聊天室,⽤户通过浏览器登录后进⼊聊天室,可发送消息进⾏群聊,点击聊天信息框中的⽤户名可实现拍⼀拍功能。
基础知识数据的存取 setAttribute / getAttributerequest请求对象:有效时间短ServletContext上下⽂对象:⼀直存在于服务器,存储公有、共享数据Session会话对象:独⽴⽹站默认页⾯⼀般是index.jsp实现思路1.登录页⾯ login.jsp 输⼊昵称2.编写⼀个LoginSevlet,处理登录提交的昵称,保存登录昵称到session(会话变量)若昵称合法 if(nickname.length()!=0),跳转到聊天室,不合法回到登录页⾯3.编写聊天室页⾯chatroom.jsp ,是⼀个框架,把多个页⾯集成到⼀个页⾯中<iframe src="message.jsp" width="100%" height="70%"> </iframe><iframe src="input.jsp" width="100%" height="25%"> </iframe>4.聊天内容显⽰message.jsp,不断⾃动刷新标签内设置响应头,⽤${上下⽂变量}显⽰聊天内容<meta http-equiv="refresh" content="1">5.input.jsp(不刷新)输⼊聊天内容⽂本框text,点击发送聊天内容按钮时,将把⽂本框的聊天信息提交给ChatServlet处理。
下⽅有超链接可退出聊天室。
<a href="login.jsp" target="_top">退出聊天室</a>6.ChatServlet:检测聊天信息合法性,把聊天信息加⼊到ServletContext变量(字符串)中,(每次都将xx:xxxx加⼊上下⽂字符串)判断是否存在该变量,存在则直接读取现有聊天内容,把数据加⼊进去后,重新写回上下⽂变量7.实现拍⼀拍功能(⽬的:学习如何进⾏链接操作)每个⼈名做成⼀个链接,访问某⼀个servlet,该servlet可以在聊天信息(上下⽂变量)⾥添加⼀⾏,xx拍了yyy⼀下,跳转回message.jsp问题:链接⾥应该包含yyy参数,servlet?nick=yyysay = "<a href='NickServlet?nickname="+nickname+"'target='_parent'>"+nickname+"</a>"+":"+text;8.多⼈聊天实现:多种类型浏览器关键代码login.jsp昵称:<input type="text" name="nickname"/><br> <br><br><input type="submit" value="登录"/><input type="reset" value="取消"/>input.jsp<form action="input.do" method="post"><input type="text" size="50" name="text"/><input type="submit" value="发送"><br><br><br><br><a href="login.jsp" rel="external nofollow" rel="external nofollow" target="_top">退出聊天室</a></form>message.jsp<h3>⼀起来聊天吧</h3>${says}LoginServlet.javapackage chatting;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;@WebServlet(name = "LoginServlet2",urlPatterns = {"/login.do"})public class LoginServlet2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //避免乱码response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");//nickname保存⽤户昵称String nickname = request.getParameter("nickname");//nickname存储到session变量中HttpSession session = request.getSession();session.setAttribute("nickname",nickname);//对nickname进⾏合法性判断if(nickname.length()!=0){//昵称合法,则进⼊聊天室页⾯request.getRequestDispatcher("/chatroom.jsp").forward(request,response);}else{//昵称不合法,返回登陆页⾯request.getRequestDispatcher("/login.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}ChatServlet.javapackage chatting;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.util.Vector;@WebServlet(name = "ChatServlet",urlPatterns = "/input.do")public class ChatServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //防⽌乱码request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");HttpSession session = request.getSession();String text = request.getParameter("text");//text存储聊天信息,并进⾏合法性判断if (text.length()!=0) {String say =new String();//获取session中的昵称String nickname = (String)session.getAttribute("nickname");//将昵称作为链接,并传参say = "<a href='NickServlet?nickname="+nickname+"'target='_parent'>"+nickname+"</a>"+":"+text;String says = new String();//将昵称和聊天信息⼀起放在上下⽂变量ServletContext context = getServletContext();if(context.getAttribute("says")!=null){says = context.getAttribute("says") + say + "<br>";}else{says = say + "<br>";}context.setAttribute("says", says);request.setAttribute("says", says);}//转发RequestDispatcher dispatcher = request.getRequestDispatcher("/input.jsp");dispatcher.forward(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}NickServlet.javapackage chatting;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;@WebServlet(name = "NickServlet",urlPatterns = "/NickServlet")public class NickServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");request.setCharacterEncoding("utf-8");//将拍⼀拍放到上下⽂变量says中⼀起输出HttpSession session = request.getSession();//nickname存储当前⽤户昵称String nickname = (String)session.getAttribute("nickname");//name存储连接中传递的参数,即被拍的⽤户昵称String name = .URLDecoder.decode(request.getParameter("nickname"),"UTF-8");String pick = nickname+"拍了拍"+name+"<br>";ServletContext context = request.getServletContext();String says = context.getAttribute("says")+pick;context.setAttribute("says",says);RequestDispatcher dispatcher = request.getRequestDispatcher("/chatroom.jsp");dispatcher.forward(request, response);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
JAVA写一网络聊天程序
JAVA写一网络聊天程序JAVA写一网络聊天程序:要求:聊天室服务器、聊天室客户端;客户端之间可以聊天。
因为我是初级选手,想借此程序分析学习java,所以代码最好多一点注释...分数有限,望大家不吝赐教!!问题补充:需要图形用户界面哦,最好用swing组件服务器端:采用多线程,可以向客户广播:当前聊天室人数,客户名称列表,客户进入离开提示;客户端:可以设定昵称,性别,客户间可以私聊服务器端:import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import .*;public class Server extends JFrame implements ActionListener{JPanel contentPane;JLabel jLabel2 = new JLabel();JTextField jTextField2 = new JTextField("4700");JButton jButton1 = new JButton();JLabel jLabel3 = new JLabel();JTextField jTextField3 = new JTextField();JButton jButton2 = new JButton();JScrollPane jScrollPane1 = new JScrollPane();JTextArea jTextArea1 = new JTextArea();ServerSocket server = null;Socket socket = null;BufferedReader instr =null;PrintWriter os=null ;//Construct the framepublic Server() {jbInit();}class MyThread extends Thread{//该线程负责接受数据public void run(){try{while(true){this.sleep(100);instr= new BufferedReader(newInputStreamReader(socket.getInputStream()));if(instr.ready()){ //检查是否有数据jTextArea1.append("客户端: "+instr.readLine()+"\n");}}}catch(Exception ex){}}}public void actionPerformed(ActionEvent e){if(e.getSource()==jButton1){int port=Integer.parseInt(jTextField2.getText().trim());listenClient(port);}if(e.getSource()==jButton2){String s=this.jTextField3.getText().trim();sendData(s);}}private void listenClient(int port){//侦听try{if(jButton1.getText().trim().equals("侦听")){server = new ServerSocket(port);jButton1.setText("正在侦听...");socket=server.accept();//等待,一直到客户端连接才望下执行sendData("已经成功连接。
JAVA局域网聊天软件设计
JAVA局域网聊天软件设计局域网聊天软件是一种在局域网内进行实时通信的应用程序。
它允许局域网中的用户通过文本、图片、音频和视频等多种方式进行交流。
在设计JAVA局域网聊天软件时,需要考虑到以下几个方面:1. 网络通信:软件需要通过网络实现用户之间的通信。
可以使用Socket套接字实现网络通信,通过TCP/IP协议来传输数据。
同时,为了提高效率,可以使用多线程来处理客户端的请求和消息的传输。
2.用户注册和登录:软件应该提供用户注册和登录的功能。
用户需要提供用户名和密码进行注册,并使用已注册的账号进行登录。
为了保护用户隐私和安全,密码应该进行加密存储,并进行合适的验证和授权。
3.用户列表和好友关系:软件应该提供用户列表,显示当前在线的用户。
用户可以添加好友并建立好友关系。
在用户列表中显示用户的在线状态和好友关系。
4.聊天功能:软件应该提供实时聊天的功能。
用户可以选择一些好友进行聊天,并发送文本、图片、音频和视频等内容。
软件需要实现消息的接收和发送,同时提供聊天记录的保存和查看功能。
5.群聊功能:软件还应该提供群聊的功能。
用户可以创建群聊并邀请好友进行加入。
在群聊中,用户可以发送消息和接收消息,实现实时的群组通信。
6.图形界面设计:为了提供良好的用户体验,软件应该设计友好的图形界面。
界面应该清晰明了,功能模块布局合理,且具有一定的美观性。
用户可以通过图形界面进行注册、登录、选择好友、发送消息等操作。
7.安全性和可靠性:在设计过程中需要考虑数据的安全性和软件的可靠性。
可以采用加密算法对数据进行加密,进行合适的输入验证和异常处理。
同时,应该进行充分的测试和调试,确保软件的稳定性和可靠性。
总结起来,设计JAVA局域网聊天软件需要考虑网络通信、用户注册和登录、用户列表和好友关系、聊天和群聊功能、图形界面设计以及安全性和可靠性等方面。
通过合理的软件架构和技术实现,可以开发出功能完善、稳定可靠的局域网聊天软件。
Java基于UDP协议实现简单的聊天室程序
Java基于UDP协议实现简单的聊天室程序最近⽐较闲,⼀直在抽空回顾⼀些Java⽅⾯的技术应⽤。
今天没什么事做,基于UDP协议,写了⼀个⾮常简单的聊天室程序。
现在的⼯作,很少⽤到socket,也算是对Java⽹络编程⽅⾯的⼀个简单回忆。
先看⼀下效果:实现的效果可以说是⾮常⾮常简单,但还是可以简单的看到⼀个实现原理。
“聊天室001”的⽤户,⼩红和⼩绿相互聊了两句,“聊天室002”的⼩⿊⽆⼈理会,在⼀旁寂寞着。
看⼀下代码实现:1、⾸先是消息服务器的实现,功能很简单:•将客户端的信息(进⼊了哪⼀个聊天室等)进⾏登记;•构造UDP协议套接字对象,接受各个客户端发送的消息;•解析消息内容,将聊天信息推送回对应聊天室的各个客户端;package com.tsr.simplechat.receive_server;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .SocketException;import java.util.ArrayList;import java.util.HashMap;import com.google.gson.Gson;import com.tsr.simplechat.bean.MessageEntity;import com.tsr.simplechat.client.ChatClient;//聊天服务器public class ChatServer extends Thread {// 程序占⽤端⼝号private static final int PORT = 10000;// 消息接受套接字对象private static DatagramSocket server = null;// 字典对象(Key:聊天室ID,Value:该聊天室下的客户端⽤户集合);private static HashMap<String, ArrayList<ChatClient>> groups = new HashMap<String, ArrayList<ChatClient>>();// 构造器public ChatServer() {try {// 消息接受套接字对象的构造初始化server = new DatagramSocket(PORT);} catch (SocketException e) {e.printStackTrace();}}// 注册聊天室新登录⽤户public static void logInGroup(String groupID, ChatClient client) {// 通过聊天室ID,获取该聊天室的所有在线⽤户ArrayList<ChatClient> clients = groups.get(groupID);if (clients == null) {clients = new ArrayList<ChatClient>();}// 将此次进⼊聊天室的⽤户登记clients.add(client);// 更新聊天室信息groups.put(groupID, clients);}// 循环接收消息@Overridepublic void run() {while (true) {receiveMessage();}}private void receiveMessage() {// UDP数据包byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);while (true) {try {// 接受数据包server.receive(packet);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 解析数据包,获取聊天信息String content = new String(packet.getData(), 0, packet.getLength()); // 通过第三⽅包解析json数据Gson gson = new Gson();MessageEntity me = gson.fromJson(content, MessageEntity.class); // 解析消息内容,通过聊天室ID,获取该聊天室的所有在线⽤户ArrayList<ChatClient> clients = groups.get(me.getGroupId());// 将接收到的消息推送回该聊天室的各个⽤户for (ChatClient client : clients) {client.pushBackMessage(me);}}}}2、客户端程序,依然很简单:•简单的定义客户端聊天室界⾯。
JAVA WEB制作简易聊天室2
1.登陆界面<%@ page language="java" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>用户登陆</title></head><body><form action="chart.jsp" method="post">帐号<input type="text" name="userName"/>口令<input type="password" name="passwd"/><input type="submit" value="确认"/></form></body></html>2.<%@ page contentType="text/html; charset=gb2312" import="erId,java.util.*"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerP ort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>My JSP 'chart.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--><%response.setIntHeader("Refresh",10); %></head><body><%/**程序目的:模拟一个聊天室程序测试方法,请在本机上打开3个IE窗口,从登陆界面进去。
基于java的局域网聊天系统(可编辑)
基于Java的局域网聊天系统引论交流对于现代社会及其每个社会的成员都非常重要。
直接交流的方式有许多,包括语言交流、书面文字交流、肢体动作交流等,而远程通讯交流则还需借助于一些先进的高级工具,诸如移动电话、固定电话、网络等。
而本篇论文研究的则是网络即时通讯系统。
计算机网络技术发展到今天,已经非常的发达非常的普及了,网络带给人们的通讯交流方式也更加受到各个层次人们的青睐。
功能齐全的网络通讯交流设备不仅可以实现文本传输而且可以使人们进行音频视频的直观交流,在利用现代多媒体的技术的同时,它还有助于使用者对工作中各种信息进行分类和处理。
大家都知道,QQ是目前国内最火爆的网络通讯设备。
QQ最大的特点就是方便即时,只要记得对方的QQ号码,添加他为好友,就可以随时随地实现聊天、沟通、视频远程操作协助语音通话等功能,是比较现代化的通讯技术之一。
在现代信息科学技术社会,通讯系统推陈出新,功能强大。
该论文现在要探讨的即时通讯系统,是目标定位到企业内部网络,以方便解决企业公司内部的沟通交流等问题,可以大大提高企业公司的工作效率。
该通讯设备方便内部员工进行沟通交流,例如文字传送,语音聊天,视频通话等等。
该即时通讯系统由客户端程序与服务器端程序两部分组成,支持局域网和以太网。
而这样企业员工就可以在任何有网络覆盖的地方进行随时进行意见的交流和文件的传送等。
使人们不用浪费时间,花费金钱在固定的地点交流。
QQ等工具公共通讯系统,因为具有聊天内容和对象不可控的特点,可能会减低员工的工作效率。
由于该即时通讯系统用于企业内部,因此服务器端也安装在企业内部,并且只有系统管理员才能进行人员名称数目的创建,这样就助于更好的解决公共通讯系统存在的问题。
即时通讯具有良好的互动性,互动性可体现在人们在交流不同的问题意见时,发现听取对方的建议是效果更好。
通过使用及时通讯系统,人们可以在网络覆盖的地方和有电脑的情况下不借助其他外在设备,在线工作交流。
java实现简易局域网聊天功能代码介绍
java实现简易局域网聊天功能代码介绍局域网通常是分布在一个有限地理范围内的网络系统,一般所涉及的地理范围只有几公里。
局域网专用性非常强,具有比较稳定和规范的拓扑结构。
这篇文章主要为大家详细介绍了java实现简易局域网聊天功能,使用UDP模式编写一个聊天程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下Java代码:/某使用UDP模式,编写一个聊天程序有发送和接收数据2部分,一个线程接收,一个线程发送由于发送和接收动作是不一致的,所以要使用2个run方法而且这两个方法要封装到不同的类中本程序忽略了部分异常的处理,也未加入UI组件这样比较简洁发送端口9998接受端口9999用的是局域网广播地址,所以自己发的消息自己也收到了[示例]:简易控制台聊天程序某/import .某;import java.io.某;class Demo{public static void main(String[] args) throws E某ception{DatagramSocket sendSocket = new DatagramSocket(9998); //发送端DatagramSocket receSocket = new DatagramSocket(9999); //接收端new Thread(new MsgSend(sendSocket)).start(); //发送线程 new Thread(new MsgRece(receSocket)).start(); //接受线程 }}class MsgSend implements Runnable //发送{private DatagramSocket dsock;public MsgSend(DatagramSocket dsock){this.dsock= dsock;}public void run(){BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String lineStr = null;try{while(true){lineStr = bufr.readLine();if(lineStr!=null){if(lineStr.equals("over886")){break;}else{byte[] dataBuf = lineStr.getBytes();DatagramPacket dataPack = //数据打包new DatagramPacket( dataBuf,dataBuf.length,InetAddress.getByName("192.168.1.255"), //广播 9999 //目标端口);dsock.send(dataPack);}}}bufr.close();dsock.close();}catch(E某ception e){throw new RuntimeE某ception("发送失败!"); }}}class MsgRece implements Runnable //接收{private DatagramSocket dsock;public MsgRece(DatagramSocket dsock){this.dsock= dsock;}public void run(){try{while(true){byte[] dataBuf = new byte[1024];DatagramPacket dataPack = newDatagramPacket(dataBuf,dataBuf.length);dsock.receive(dataPack); //将获取的数据保存到指定的数据包 String ip = dataPack.getAddress().getHostAddress();String data = newString(dataPack.getData(),0,dataPack.getLength());int port = dataPack.getPort();System.out.println();System.out.println("来自ip为 "+ip+" : "+port+" 的消息"); System.out.println(data);}}catch(E某ception e){throw new RuntimeE某ception("接受失败!");}finally{dsock.close();}}}补充:局域网、校园网安全维护方法校园网络分为内网和外网,就是说他们可以上学校的内网也可以同时上互联网,大学的学生平时要玩游戏购物,学校本身有自己的服务器需要维护;在大环境下,首先在校园网之间及其互联网接入处,需要设置防火墙设备,防止外部攻击,并且要经常更新抵御外来攻击;由于要保护校园网所有用户的安全,我们要安全加固,除了防火墙还要增加如ips,ids等防病毒入侵检测设备对外部数据进行分析检测,确保校园网的安全;外面做好防护措施,内部同样要做好防护措施,因为有的学生电脑可能带回家或者在外面感染,所以内部核心交换机上要设置vlan隔离,旁挂安全设备对端口进行检测防护;内网可能有ddos攻击或者arp病毒等传播,所以我们要对服务器或者电脑安装杀毒软件,特别是学校服务器系统等,安全正版安全软件,保护重要电脑的安全;对服务器本身我们要安全server版系统,经常修复漏洞及更新安全软件,普通电脑一般都是拨号上网,如果有异常上层设备监测一般不影响其他电脑。
JAVA课程设计之简单聊天室
课程设计报告课程名称: socket程序设计课程代码:题目: 仿QQ聊天程序年级/专业/班:学生姓名: 邱吉祥(201230760319)欧思源()李运()指导老师: 蔡贤资开题时间:完成时间:目录摘要及小组成员分工 (I)1 引言 (1)2 设计任务与目的 (1)3 需求分析 (1)3.1 系统用例图 (1)3.2 主要用例分析 (2)4 系统设计 (2)4.1 总体设计 (2)4.1.1 系统类图 (2)4.1.2 主要时序图 (3)4.2 详细设计 (10)4.2.1 ChatServer类.................................................................................... 错误!未定义书签。
4.2.2 ServerListen类.................................................................................. 错误!未定义书签。
4.2.3 ServerReceive类............................................................................... 错误!未定义书签。
4.2.4 PortConf类 ....................................................................................... 错误!未定义书签。
4.2.5 Help类 .............................................................................................. 错误!未定义书签。
4.2.6 UserLinkList类................................................................................. 错误!未定义书签。
JavaWebSocket实现网络聊天室(群聊+私聊)
JavaWebSocket实现⽹络聊天室(群聊+私聊)1、简单说明谢谢博主的⽂章和项⽬,我是抱着学习的态度,若有理解错的地⽅,请指正。
2、项⽬内容项⽬的功能说明去原博主博客看吧,项⽬上改进的地⽅,我具体做以下说明。
(1)webSocket服务对于webSocket服务代码,我进⾏⼀部分的封装和优化,主要是消息内容的封装、⽤户信息封装。
页⾯显⽰⽤户的昵称,指定⽤户昵称进⾏消息发送。
ChatServer.javapackage q.webSocket;import er;import monDate;import net.sf.json.JSONObject;import org.apache.log4j.Logger;import javax.servlet.http.HttpSession;import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/*** @author ccq* @Description webSocket服务* @date 2017/12/16 17:31*/@ServerEndpoint(value="/chatServer/{userid}", configurator = HttpSessionConfigurator.class)public class ChatServer {private static Logger logger = Logger.getLogger(ChatServer.class);private static int onlineCount = 0; // 记录连接数⽬// Map<⽤户id,⽤户信息>private static Map<String, OnlineUser> onlineUserMap = new ConcurrentHashMap<String, OnlineUser>(); //在线⽤户/*** 连接成功调⽤的⽅法*/@OnOpenpublic void onOpen(@PathParam("userid") String userid , Session session, EndpointConfig config){("[ChatServer] connection : userid = " + userid + " , sessionId = " + session.getId());// 增加⽤户数量addOnlineCount();// 获取当前⽤户的sessionHttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());User user = (User) httpSession.getAttribute("user"); // 获得当前⽤户信息// 将当前⽤户存到在线⽤户列表中OnlineUser onlineUser = new OnlineUser(user.getUserid(),user.getNickname(),session);onlineUserMap.put(user.getUserid(),onlineUser);// 通知所有在线⽤户,当前⽤户上线String content = "[" + CommonDate.getTime24() + " : " + user.getNickname() + "加⼊聊天室,当前在线⼈数为 " + getOnlineCount() + "位" + "]";JSONObject msg = new JSONObject();msg.put("content",content);String message = Message.getMessage(msg.toString(),Message.NOTICE,onlineUserMap.values());Message.broadcast(message,onlineUserMap.values());}/*** 连接关闭⽅法*/@OnClosepublic void onClose(@PathParam("userid") String userid,Session session,CloseReason closeReason){("[ChatServer] close : userid = " + userid + " , sessionId = " + session.getId() +" , closeCode = " + closeReason.getCloseCode().getCode() + " , closeReason = " +closeReason.getReasonPhrase());// 减少当前⽤户subOnlienCount();// 移除的⽤户信息OnlineUser removeUser = onlineUserMap.remove(userid);onlineUserMap.remove(userid);// 通知所有在线⽤户,当前⽤户下线String content = "["+ CommonDate.getTime24() + " : " + removeUser.getNickname() + " 离开聊天室,当前在线⼈数为 " + getOnlineCount() + "位" + "]";JSONObject msg = new JSONObject();msg.put("content",content);if(onlineUserMap.size() > 0){String message = Message.getMessage(msg.toString(), Message.NOTICE, onlineUserMap.values());Message.broadcast(message,onlineUserMap.values());}else{("content : ["+ CommonDate.getTime24() + " : " + removeUser.getNickname() + " 离开聊天室,当前在线⼈数为 " + getOnlineCount() + "位" + "]"); }}/*** 接收客户端的message,判断是否有接收⼈⽽选择进⾏⼴播还是指定发送* @param data 客户端发来的消息*/@OnMessagepublic void onMessage(@PathParam("userid") String userid,String data){("[ChatServer] onMessage : userid = " + userid + " , data = " + data);JSONObject messageJson = JSONObject.fromObject(data);JSONObject message = messageJson.optJSONObject("message");String to = message.optString("to");String from = message.optString("from");// 将⽤户id转换为名称to = erIdCastNickName(to);OnlineUser fromUser = onlineUserMap.get(from);String sendMessage = Message.getContent(fromUser,to,message.optString("content"),message.optString("time"));String returnData = Message.getMessage(sendMessage, messageJson.optString("type"),null);if(to == null || to.equals("")){ // 进⾏⼴播Message.broadcast(returnData.toString(),onlineUserMap.values());}else{Message.singleSend(returnData.toString(), onlineUserMap.get(from)); // 发送给⾃⼰String[] useridList = message.optString("to").split(",");for(String id : useridList){if(!id.equals(from)){Message.singleSend(returnData.toString(), onlineUserMap.get(id)); // 分别发送给指定的⽤户}}}}/*** 发⽣错误* @param throwable*/@OnErrorpublic void onError(@PathParam("userid") String userid,Session session,Throwable throwable){("[ChatServer] close : userid = " + userid + " , sessionId = " + session.getId() +" , throwable = " + throwable.getMessage() );}public static int getOnlineCount() {return onlineCount;}public synchronized void addOnlineCount(){onlineCount++;}public synchronized void subOnlienCount(){onlineCount--;}/*** 将⽤户id转换为名称* @param userIds* @return*/private String userIdCastNickName(String userIds){String niceNames = "";if(userIds != null && !userIds.equals("")){String[] useridList = userIds.split(",");String toName = "";for (String id : useridList){toName = toName + onlineUserMap.get(id).getNickname() + ",";}niceNames = toName.substring(0,toName.length() - 1);}return niceNames;}}OnlineUser.javapublic class OnlineUser {private String userid;private String nickname;private Session session;} Message.javapackage q.webSocket;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import mons.collections.CollectionUtils;import org.apache.log4j.Logger;import javax.websocket.Session;import java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.List;/*** @author ccq* @Description 消息类* @date 2017/12/16 19:08*/public class Message {private static Logger logger = Logger.getLogger(Message.class);/*** 消息类型*/public static String NOTICE = "notice"; //通知public static String MESSAGE = "message"; //消息/*** 组装信息返回给前台* @param message 交互信息* @param type 信息类型* @param userList 在线列表* @return** "massage" : {* "from" : "xxx",* "to" : "xxx",* "content" : "xxx",* "time" : "xxxx.xx.xx"* },* "type" : {notice|message},* "list" : {[xx],[xx],[xx]}*/public static String getMessage(String message,String type,Collection<OnlineUser> userList){JSONObject msg = new JSONObject();msg.put("message",message);msg.put("type", type);if(CollectionUtils.isNotEmpty(userList)){List<String> propertys = new ArrayList<String>();propertys.add("session");JSONArray userListArray = JSONArray.fromObject(userList,JsonConfigUtils.getJsonConfig(propertys)); msg.put("list", userListArray);}return msg.toString();}/*** 消息内容* @param fromUser* @param to* @param content* @param time* @return* {* "from" : "xxx",* "to" : "xxx",* "content" : "xxx",* "time" : "xxxx.xx.xx"* }*/public static String getContent(OnlineUser fromUser,String to,String content,String time){JSONObject contentJson = new JSONObject();// 转化为json串时去掉session,⽤户session不能被序列化List<String> propertys = new ArrayList<String>();propertys.add("session");contentJson.put("from",JSONObject.fromObject(fromUser,JsonConfigUtils.getJsonConfig(propertys)));contentJson.put("to",to);contentJson.put("content",content);contentJson.put("time",time);return contentJson.toString();}/*** ⼴播消息* @param message 消息* @param onlineUsers 在线⽤户*/public static void broadcast(String message,Collection<OnlineUser> onlineUsers){/***************************在线⽤户***************************/StringBuffer userStr = new StringBuffer();for(OnlineUser user : onlineUsers){userStr.append(user.getNickname() + ",");}userStr.deleteCharAt(userStr.length()-1);("[broadcast] message = " + message + ", onlineUsers = " + userStr.toString());/***************************在线⽤户***************************/for(OnlineUser user : onlineUsers){try {user.getSession().getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();("消息发送失败!" + e.getMessage());continue;}}}/*** 对特定⽤户发送消息* @param message* @param onlineUser*/public static void singleSend(String message, OnlineUser onlineUser){("[singleSend] message = " + message + ", toUser = " + onlineUser.getNickname());try {onlineUser.getSession().getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();("消息发送失败!" + e.getMessage());}}}(2)⽤户头像上传确实⽐较好⽤,贴⼀下主要代码@RequestMapping(value = "{userid}/upload", method = RequestMethod.POST,produces = "application/json; charset=utf-8")@ResponseBodypublic String updateUserPassword(@PathVariable("userid") String userid,String image,HttpServletRequest request){JSONObject responseJson = new JSONObject();String filePath = "I:\\IDEA2017-02\\img\\";String PicName= UUID.randomUUID().toString()+".png";String header ="data:image";String[] imageArr=image.split(",");if(imageArr[0].contains(header)) {//是img的// 去掉头部image=imageArr[1];// 修改图⽚BASE64Decoder decoder = new BASE64Decoder();try {byte[] decodedBytes = decoder.decodeBuffer(image); // 将字符串格式的image转为⼆进制流(biye[])的decodedBytesString imgFilePath = filePath + PicName; //指定图⽚要存放的位File targetFile = new File(filePath);if(!targetFile.exists()){targetFile.mkdirs();}FileOutputStream out = new FileOutputStream(imgFilePath);//新建⼀个⽂件输出器,并为它指定输出位置imgFilePathout.write(decodedBytes); //利⽤⽂件输出器将⼆进制格式decodedBytes输出out.close();// 修改图⽚User user = userService.getUserById(userid);user.setProfilehead(PicName);int flag = userService.updateUser(user);if(flag > 0){Log log = LogUtil.setLog(userid, CommonDate.getTime24(), WordDefined.LOG_TYPE_UPDATE,WordDefined.LOG_DETAIL_UPDATE_PROFILEHEAD, NetUtil.getIpAddress(request)); logService.insertLog(log);}else{responseJson.put("result","error");responseJson.put("msg","上传失败!");}} catch (IOException e) {e.printStackTrace();}}responseJson.put("result","ok");responseJson.put("msg","上传成功!");responseJson.put("fileUrl","/pic/" + PicName);return responseJson.toString();}3、改进的图⽚4、源码地址(2017-12-17晚更新)由于⼩弟刚学会使⽤github,所以现在才把修改的代码地址放出来。
基于java编写局域网多人聊天室
基于java编写局域⽹多⼈聊天室由于需要制作⽹络计算机⽹络课程设计,并且不想搞⽹络布线或者局域⽹路由器配置等等这种完全搞不懂的东西,最后决定使⽤socket基于java编写⼀个局域⽹聊天室:关于socket以及⽹络编程的相关知识详见我另⼀篇⽂章:程序基于C/S结构,即客户端服务器模式。
服务器:默认ip为本机ip需要双⽅确定⼀个端⼝号可设置最⼤连接⼈数可启动与关闭界⾯显⽰在线⽤户⼈以及姓名(本机不在此显⽰)客户端:需要⼿动设置服务器ip地址(局域⽹)⼿动设置端⼝号输⼊姓名可连接可断开程序运⾏界⾯如下:服务器:客户端:具体代码我会在最后上传。
软件有很多不⾜,其中⽐如:没有与数据库有任何交集优化:可将所有⽤户存放在数据库中,以及将聊天记录也放⼊数据库中没有实现⼀对⼀聊天优化:需重新定义⼀对⼀聊天的⽅法还有许多不⾜的地⽅,⽇后有兴趣再回来慢慢研究下⾯为该程序三个代码:User.javapublic class User{/*** ⽤户信息类* ⽤于记录⽤户个⼈信息:姓名以及IP*/private String name;private String ip;public User(String name, String ip) { = name;this.ip = ip;}public String getName() {return name;}public void setName(String name) { = name;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}}Server_more.javaimport java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .BindException;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.util.StringTokenizer;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.TitledBorder;public class Server_more {private JFrame frame;private JTextArea contentArea; //⽂本域private JTextField txt_message; //⽤于显⽰⽂本信息private JTextField txt_max; //设置最⼤连接⼈数private JTextField txt_port; //设置端⼝号private JButton btn_start; //开始按钮private JButton btn_stop; //断开按钮private JButton btn_send; //发送按钮private JPanel northPanel; //北⽅⾯板private JPanel southPanel; //南⽅⾯板private JScrollPane rightPanel; //左边滚动条private JScrollPane leftPanel; //右边滚动条private JSplitPane centerSplit; //分割线private JList userList; //列表组件private DefaultListModel listModel;private ServerSocket serverSocket;private ServerThread serverThread;private ArrayList<ClientThread> clients;private boolean isStart = false;// 主⽅法,程序执⾏⼊⼝public static void main(String[] args) {new Server_more();}// 执⾏消息发送public void send() {if (!isStart) {JOptionPane.showMessageDialog(frame, "服务器还未启动,不能发送消息!", "错误", JOptionPane.ERROR_MESSAGE);return;}if (clients.size() == 0) {JOptionPane.showMessageDialog(frame, "没有⽤户在线,不能发送消息!", "错误", JOptionPane.ERROR_MESSAGE);return;}String message = txt_message.getText().trim();if (message == null || message.equals("")) {JOptionPane.showMessageDialog(frame, "消息不能为空!", "错误",JOptionPane.ERROR_MESSAGE);return;}sendServerMessage(message);// 群发服务器消息contentArea.append("服务器:" + txt_message.getText() + "\r\n");txt_message.setText(null);}// 构造放法public Server_more() {frame = new JFrame("服务器");// 更改JFrame的图标://frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png"))); //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("qq.png"))); contentArea = new JTextArea();contentArea.setEditable(false);contentArea.setForeground(Color.blue);txt_message = new JTextField();txt_max = new JTextField("30");txt_port = new JTextField("6666");btn_start = new JButton("启动");btn_stop = new JButton("停⽌");btn_send = new JButton("发送");btn_stop.setEnabled(false);listModel = new DefaultListModel();userList = new JList(listModel);southPanel = new JPanel(new BorderLayout());southPanel.setBorder(new TitledBorder("写消息"));southPanel.add(txt_message, "Center");southPanel.add(btn_send, "East");leftPanel = new JScrollPane(userList);leftPanel.setBorder(new TitledBorder("在线⽤户"));rightPanel = new JScrollPane(contentArea);rightPanel.setBorder(new TitledBorder("消息显⽰区"));centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,rightPanel);centerSplit.setDividerLocation(100);northPanel = new JPanel();northPanel.setLayout(new GridLayout(1, 6));northPanel.add(new JLabel("⼈数上限"));northPanel.add(txt_max);northPanel.add(new JLabel("端⼝"));northPanel.add(txt_port);northPanel.add(btn_start);northPanel.add(btn_stop);northPanel.setBorder(new TitledBorder("配置信息"));frame.setLayout(new BorderLayout());frame.add(northPanel, "North");frame.add(centerSplit, "Center");frame.add(southPanel, "South");frame.setSize(600, 400);//frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());//设置全屏int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;frame.setLocation((screen_width - frame.getWidth()) / 2,(screen_height - frame.getHeight()) / 2);frame.setVisible(true);// 关闭窗⼝时事件frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {if (isStart) {closeServer();// 关闭服务器}System.exit(0);// 退出程序}});// ⽂本框按回车键时事件txt_message.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {send();}});// 单击发送按钮时事件btn_send.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {send();});// 单击启动服务器按钮时事件btn_start.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (isStart) {JOptionPane.showMessageDialog(frame, "服务器已处于启动状态,不要重复启动!", "错误", JOptionPane.ERROR_MESSAGE);return;}int max;int port;try {try {max = Integer.parseInt(txt_max.getText());} catch (Exception e1) {throw new Exception("⼈数上限为正整数!");}if (max <= 0) {throw new Exception("⼈数上限为正整数!");}try {port = Integer.parseInt(txt_port.getText());} catch (Exception e1) {throw new Exception("端⼝号为正整数!");}if (port <= 0) {throw new Exception("端⼝号为正整数!");}serverStart(max, port);contentArea.append("服务器已成功启动!⼈数上限:" + max + ",端⼝:" + port+ "\r\n");JOptionPane.showMessageDialog(frame, "服务器成功启动!");btn_start.setEnabled(false);txt_max.setEnabled(false);txt_port.setEnabled(false);btn_stop.setEnabled(true);} catch (Exception exc) {JOptionPane.showMessageDialog(frame, exc.getMessage(),"错误", JOptionPane.ERROR_MESSAGE);}}});// 单击停⽌服务器按钮时事件btn_stop.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (!isStart) {JOptionPane.showMessageDialog(frame, "服务器还未启动,⽆需停⽌!", "错误",JOptionPane.ERROR_MESSAGE);return;}try {closeServer();btn_start.setEnabled(true);txt_max.setEnabled(true);txt_port.setEnabled(true);btn_stop.setEnabled(false);contentArea.append("服务器成功停⽌!\r\n");JOptionPane.showMessageDialog(frame, "服务器成功停⽌!");} catch (Exception exc) {JOptionPane.showMessageDialog(frame, "停⽌服务器发⽣异常!", "错误",JOptionPane.ERROR_MESSAGE);}}});}// 启动服务器public void serverStart(int max, int port) throws .BindException {try {clients = new ArrayList<ClientThread>();serverSocket = new ServerSocket(port);serverThread = new ServerThread(serverSocket, max);serverThread.start();} catch (BindException e) {isStart = false;throw new BindException("端⼝号已被占⽤,请换⼀个!");} catch (Exception e1) {e1.printStackTrace();isStart = false;throw new BindException("启动服务器异常!");}}// 关闭服务器@SuppressWarnings("deprecation")public void closeServer() {try {if (serverThread != null)serverThread.stop();// 停⽌服务器线程for (int i = clients.size() - 1; i >= 0; i--) {// 给所有在线⽤户发送关闭命令clients.get(i).getWriter().println("CLOSE");clients.get(i).getWriter().flush();// 释放资源clients.get(i).stop();// 停⽌此条为客户端服务的线程clients.get(i).reader.close();clients.get(i).writer.close();clients.get(i).socket.close();clients.remove(i);}if (serverSocket != null) {serverSocket.close();// 关闭服务器端连接}listModel.removeAllElements();// 清空⽤户列表isStart = false;} catch (IOException e) {e.printStackTrace();isStart = true;}}// 群发服务器消息public void sendServerMessage(String message) {for (int i = clients.size() - 1; i >= 0; i--) {clients.get(i).getWriter().println("服务器:" + message + "(多⼈发送)"); clients.get(i).getWriter().flush();}}// 服务器线程class ServerThread extends Thread {private ServerSocket serverSocket;private int max;// ⼈数上限// 服务器线程的构造⽅法public ServerThread(ServerSocket serverSocket, int max) {this.serverSocket = serverSocket;this.max = max;}public void run() {while (true) {// 不停的等待客户端的链接try {Socket socket = serverSocket.accept();if (clients.size() == max) {// 如果已达⼈数上限BufferedReader r = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter w = new PrintWriter(socket.getOutputStream());// 接收客户端的基本⽤户信息String inf = r.readLine();StringTokenizer st = new StringTokenizer(inf, "@");User user = new User(st.nextToken(), st.nextToken());// 反馈连接成功信息w.println("MAX@服务器:对不起," + user.getName()+ user.getIp() + ",服务器在线⼈数已达上限,请稍后尝试连接!"); w.flush();w.close();socket.close();continue;}ClientThread client = new ClientThread(socket);client.start();// 开启对此客户端服务的线程clients.add(client);listModel.addElement(client.getUser().getName());// 更新在线列表 contentArea.append(client.getUser().getName()+ client.getUser().getIp() + "上线!\r\n");} catch (IOException e) {e.printStackTrace();}}}}// 为⼀个客户端服务的线程class ClientThread extends Thread {private Socket socket;private BufferedReader reader;private PrintWriter writer;private User user;public BufferedReader getReader() {return reader;}public PrintWriter getWriter() {return writer;}public User getUser() {return user;}// 客户端线程的构造⽅法public ClientThread(Socket socket) {try {this.socket = socket;reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));writer = new PrintWriter(socket.getOutputStream());// 接收客户端的基本⽤户信息String inf = reader.readLine();StringTokenizer st = new StringTokenizer(inf, "@");user = new User(st.nextToken(), st.nextToken());// 反馈连接成功信息writer.println(user.getName() + user.getIp() + "与服务器连接成功!"); writer.flush();// 反馈当前在线⽤户信息if (clients.size() > 0) {String temp = "";for (int i = clients.size() - 1; i >= 0; i--) {temp += (clients.get(i).getUser().getName() + "/" + clients.get(i).getUser().getIp())+ "@";}writer.println("USERLIST@" + clients.size() + "@" + temp);writer.flush();}// 向所有在线⽤户发送该⽤户上线命令for (int i = clients.size() - 1; i >= 0; i--) {clients.get(i).getWriter().println("ADD@" + user.getName() + user.getIp());clients.get(i).getWriter().flush();}} catch (IOException e) {e.printStackTrace();}}@SuppressWarnings("deprecation")public void run() {// 不断接收客户端的消息,进⾏处理。
JAVAWEB设计一个简易聊天室实验报告
var str1=.value;
var str2=login.pwd.value;
var str3=login.sex.value;
var str4=login.pwd.value;
var str5=login.pwd2.value;
if(str1=="")
{
alert("请输入用户名!");
out.println(juzhu[i] + " <br> ");
}
//接收checkbox类信息
out.print("爱好:");
String job[] = request.getParameterValues("JOB");
if(job != null) {
for(int i=0; i<job.length; i++)
<frameset rows="*,150">
<frame src ="message.jsp">
<frame src ="talk.jsp">
</frameset>
</HTML>
(2)显示聊天内容及刷新
<%@ page language="java" contentType="text/html;charset=gb2312"%>
application.setAttribute("msg",name);
application.setAttribute("msg1",pwd);
最新简单局域网聊天java
//建立Dlientimport java.io.DataOutputStream;import java.io.IOException;import .Socket;import .UnknownHostException;import java.util.Scanner;public class Dlient {public void init(){try {Socket sk=new Socket("127.0.0.1",9000);DataOutputStream dout=new DataOutputStream(sk.getOutputStream());Scanner sc=new Scanner(System.in);while(true){System.out.println("输入数据!");String str= sc.nextLine();dout.write(str.getBytes());System.out.println("成功!");}} catch (Exception e) {}}public static void main(String[] args) {Dlient sc=new Dlient();sc.init();}}//建立Serverimport java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import javax.swing.plaf.basic.BasicTreeUI.TreeCancelEditingAction;public class Server {public void init(){try {while(true){ServerSocket ser=new ServerSocket(9000);System.out.println("正在连接。
一个简单的java聊天室程序功能齐全
聊天室使用说明一、开发语言:Java高级语言编程二、开发环境:JCreator Pro三、运行环境:JCreator Pro四、使用流程:首先在JCreator Pro环境中编译,然后打开运行即可。
效果图浏览:服务器端代码import .*;import .*;import .*;import class ChatServer extends Frame{TextArea ta=new TextArea(20,52);etHostAddress();("[" + name + "]进入聊天室\n");returnMsg = "[主人]:欢迎" + name + "进入聊天室";;import .*;import .*;public class ChatClient extends Frame{TextArea ta=new TextArea(10,40);//消息接收显示框TextField tf=new TextField(20);//消息编写框TextField ipInput=new TextField("localhost",10);//IP输入框TextField portInput=new TextField("4444",2);//输入端口TextField nameInput=new TextField("user",5);//输入端口Button conn=new Button("登录");Button b=new Button("发送");//发送消息按钮Socket client=null;public ChatClient() {super("丁丁猫聊天室客户端");(new Color(110,150,120));;(false);(ta,;Panel p=new Panel();(new Label("IP"));(ipInput);(new Label("Port"));(portInput);(new Label("Name"));(nameInput);(conn);(tf);(b);(p,;(true);//不能调节窗口大小MyActionListener lis=new MyActionListener();(lis);(lis);//给登录按钮添加事件处理器(lis);();();}public static void main(String[] args) {ChatClient cc = new ChatClient();}//内部类,做事件处理class MyActionListener extends WindowAdapter implements ActionListener{public void actionPerformed(ActionEvent e){String cmd=();if("登录")){String tmp=null;try {//创建到指定服务器的socket连接client = new Socket(),()));tmp="[系统消息]:连接成功\n";ReadMsg reader=new ReadMsg();();}catch (Exception ex){tmp="[系统消息]:连接失败\n";}(tmp);//显示登录成功或失败信息}if("发送")){OutputStream os =null;PrintStream ps =null;try {os = ();ps = new PrintStream(os);());} catch (Exception ex1) {//();("[系统消息]:发送失败\n");}}}public void windowClosing(WindowEvent e){(0);//关闭窗口,退出程序}}//内部类,负责接收从服务器上转发回的消息class ReadMsg extends Thread{public void run(){InputStream is =null;BufferedReader br=null;String msg = null;OutputStream os = null;PrintStream ps = null;try {is = ();br = new BufferedReader(new InputStreamReader(is));//客户端连接成功后,首先发送昵称过去 os = ();ps = new PrintStream(os);());}catch (Exception ex1){//();}while(true){try {while ((msg = ()) != null){(msg + "\n");}}catch (Exception ex) {//();}}}}}。
java实现小型局域网群聊功能(CS模式)
java实现⼩型局域⽹群聊功能(CS模式)本⽂实例为⼤家分享了java群聊功能,供⼤家参考,具体内容如下Java 对TCP协议的⽀持:--> 包中定义了两个类ServerSocket 和Socket ,分别⽤来实现双向连接的server 端和client 端。
--> Client 类定义客户端package com.dragon.java.tcpchat;import java.io.IOException;import .Socket;import .UnknownHostException;/*** 客户端** @author Auser**/public class Client {public static void main(String args[]) throws UnknownHostException,IOException {Socket client = new Socket("192.168.1.188", 10000);// 穿件发送信息的线程new ClientSend(client).start();// 创建接收信息的线程new ClientReceive(client).start(); // 因为要实现聊天功能,⽽不是只发送⼀次信息,所以输出流和客户端都不能关闭。
// client.shutdownOutput();// client.close();}}--> ClientSend 类定义客户端向服务端发送信息的线程package com.dragon.java.tcpchat;import java.io.IOException;import java.io.PrintStream;import .Socket;import java.util.Scanner;/*** 客户端向服务端发送信息的线程** @author Auser**/public class ClientSend extends Thread {private Scanner scanner;private Socket socket;public ClientSend(Socket socket) {this.socket = socket;}@Overridepublic void run() {scanner = new Scanner(System.in);try {PrintStream ps = new PrintStream(socket.getOutputStream());String line = "";// 阻塞式发送信息while ((line = scanner.nextLine()) != null) {ps.println(line);}} catch (IOException e) {e.printStackTrace();}}--> ClientReceive 类定义客户端接收服务端信息的线程package com.dragon.java.tcpchat;import java.io.BufferedReader;import java.io.InputStreamReader;import .Socket;/*** 客户端接收信息的线程** @author Auser**/public class ClientReceive extends Thread {private Socket socket;public ClientReceive(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader br = new BufferedReader(new InputStreamReader( socket.getInputStream()));// 按⾏接收信息String line = "";while ((line = br.readLine()) != null) {System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}}--> Server 类定义服务端package com.dragon.java.tcpchat;import java.io.IOException;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.util.List;/*** 服务器** @author Auser**/public class Server {public static void main(String[] args) throws IOException,InterruptedException {List<Socket> list = new ArrayList<>();// 创建服务器端的套接字ServerSocket server = new ServerSocket(10000);while (true) {// 接收客户端的阻塞⽅法Socket socket = server.accept();// 设计到多个线程可能会对集合进⾏增删的操作,要进⾏同步的处理 synchronized (list) {list.add(socket);}// 启动⼀个新的线程去处理这个客户端的交流new HandleSocket(socket, list).start(); // 因为不知道客户端什么时候发送信息,所以服务端要⼀直开启不能关闭。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color;import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.Panel; import java.awt.Point; import java.awt.TextArea; importjava.awt.TextField;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File;import java.io.FileWriter; import java.io.IOException;import .DatagramPacket; import .DatagramSocket; import.InetAddress;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class GUI_Chat extends Frame {private static final long serialVersionUID = 1L;private TextArea viewTextArea = new TextArea(20, 1; private TextArea sendTextArea = new TextArea(; private TextField ipTextField = new TextField(20; private Button sendButton = new Button(" 发送" ; private Button clearButton = new Button(" 清屏" ; private Button logButton = new Button(" 记录" ; private Button shakeButton = new Button(" 震动" ; private Panel panel = new Panel(; private DatagramSocket socket ;private Lock lock = new ReentrantLock(; private FileWriter fw ;public GUI_Chat( throws Exception {socket = new DatagramSocket(20000;fw = new FileWriter("log.txt" , true ;generateUI(; addListener(;new ReceiveThread(.start(;// 开启接收数据的线程}private void generateUI( { setTitle("GUI 聊天室" ; setSize(400, 600; setLocation(600, 50;setMinimumSize(new Dimension(400, 600; // 设置最小尺寸Font font = new Font("Courier New", Font.PLAIN , 15;viewTextArea .setFont(font; // 设置字体viewTextArea .setEditable(false ; // 设置不可编辑(会改变背景色viewTextArea .setBackground(Color.WHITE ; // 设置背景色add(viewTextArea , BorderLayout.NORTH ; // 把viewTextArea 放在上面sendTextArea .setFont(font;add(sendTextArea , BorderLayout.CENTER ; // 把sendTextArea 放在中间panel .add(ipTextField ; panel .add(sendButton ; panel .add(clearButton ; panel .add(logButton ;panel .add(shakeButton ;add(panel , BorderLayout.SOUTH ;// 把Panel 放在下面}private void addListener( { addWindowListener(new WindowAdapter( { // 关闭窗体public void windowClosing(WindowEvent e { try {fw .close(;} catch (IOException e1 { e1.printStackTrace(; }System. exit (0; } };sendButton .addActionListener(new ActionListener( { // 发送功能public void actionPerformed(ActionEvent e {send(;} };sendTextArea .addKeyListener(new KeyAdapter( { // 处理快捷键 public void keyPressed(KeyEvent e {if (e.isControlDown( && e.getKeyCode( == KeyEvent. VK_ENTER ||e.isAltDown( && e.getKeyCode( == KeyEvent.VK_S { send(; e.consume(; // 取消当前事件 } } };clearButton .addActionListener(new ActionListener( { // 清屏功能 public void actionPerformed(ActionEvent e { viewTextArea .setText("" ; } };logButton .addActionListener(new ActionListener( { // 聊天记录public void actionPerformed(ActionEvent e { showLog(; } };shakeButton .addActionListener(new ActionListener( { public void actionPerformed(ActionEvent e { sendShake(; } }; }private void sendShake( { try {String ip = ipTextField .getText(; sendData(ip, new byte [] { -1 }; // 向执行IP 发送一个特殊的消息 } catch (Exception e { e.printStackTrace(; }}private void showLog( {try (Scanner scanner = new Scanner(new File("log.txt" ;{ viewTextArea .setText("" ; // 清屏fw .flush(;// 把未保存的数据写入文件while (scanner.hasNextLine( // 如过文件中有数据就进入循环viewTextArea .append(scanner.nextLine( + "\r\n"; // 从文件读取一行, 追加到viewTextArea 中} catch (Exception e { e.printStackTrace(; } }private void send( { try { String msg = sendTextArea .getText(; // 获取要发的内容String ip = ipTextField .getText(; // 获取目标地址ip = ip.trim(.length( == 0 ? "255.255.255.255" : ip;String content = getTime( + " 我对 <" + (ip.equals("255.255.255.255" ? " 所有人" : ip + "> 说: \r\n" + msg + "\r\n\r\n";lock .lock(; // 开始同步 sendData(ip, msg.getBytes(; // 发送数据sendTextArea .setText("" ; // 清空viewTextArea .append(content; // 把要显示的内容追加到viewTextArea 中fw .write(content; // 保存聊天记录 lock .unlock(; // 结束同步 } catch (Exception e { e.printStackTrace(; } }private void sendData(String ip, byte [] data throws Exception { DatagramPacket packet = new DatagramPacket(data, data. length , InetAddress. getByName (ip, 20000; socket .send(packet;// UDP发送数据}private String getTime( { Date date = new Date(;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"; return sdf.format(date; // 返回当前时间字符串 }private class ReceiveThread extends Thread { public void run( {DatagramPacket packet = new DatagramPacket(new byte [8192], 8192; while (true { try {socket .receive(packet;byte [] arr = packet.getData(; int length = packet.getLength(;String s = new String(arr, 0, length; // 接收到的字符串String ip = packet.getAddress(.getHostAddress(;String content = getTime( + " <" + ip + "> 对我说:\r\n" + s + "\r\n\r\n"; // 在viewTextArea 中显示的内容if (length == 1 && arr[0] == -1 { // 判断是否收到震动消息 doShake(; // 震动(改变位置 continue ; // 进入下一次循环 }lock .lock(; // 开始同步viewTextArea .append(content;fw .write(content; // 保存聊天记录 lock .unlock(;// 结束同步} catch (IOException e { e.printStackTrace(; }}}}private void doShake( { //震动方法 (通过改变窗体的位置实现 try {Point point = getLocation(; for (int i = 0; i < 5; i++ { Thread. sleep (30;setLocation(point.x + 5, point.y ; Thread. sleep (30;setLocation(point.x - 5, point.y + 5; }setLocation(point;} catch (InterruptedException e { e.printStackTrace(; } }public static void main(String[] args throws Exception { new GUI_Chat(.setVisible(true ; }}。