聊天程序java
SimpleChat程序(一对多聊天源代码 java)

package com.wyh.chatRoom;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .InetAddress;import .ServerSocket;import .Socket;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTabbedPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.JToolBar;public class wyhChatRoom extends JFrame implements ActionListener{ private String name; //服务器聊天室的图形用户界面private JComboBox combox; //网名private JTextField text; //输入IP地址或域名的组合框private JTabbedPane tab; //选项卡窗格,每页与一个Socket通信public wyhChatRoom(int port ,String name) throws IOException{super("聊天室"+name+" "+InetAddress.getLocalHost()+"端口:"+port);this.setBounds(320, 240, 440, 240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);JToolBar toolbar=new JToolBar(); //工具栏this.getContentPane().add(toolbar,"North");toolbar.add(new JLabel("主机"));combox=new JComboBox();combox.addItem("127.0.0.1");toolbar.add(combox);combox.setEditable(true);toolbar.add(new JLabel("端口"));text=new JTextField("1251");toolbar.add(text);JButton button_connect=new JButton("连接");button_connect.addActionListener(this);toolbar.add(button_connect);tab=new JTabbedPane(); //选项卡窗口this.setBackground(Color.blue);this.getContentPane().add(tab);this.setVisible(true);=name;while(true){Socket client=new ServerSocket(port).accept();//等待接受客户端的连接申请tab.addTab(name, new TabPageJPanel(client));//tab添加页,页中添加内部类面板tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选择状态port++;}}public void actionPerformed(ActionEvent e){if(e.getActionCommand()=="连接"){String host=(String)combox.getSelectedItem();int port=Integer.parseInt(text.getText());try{tab.addTab(name, new TabPageJPanel(new Socket(host,port)));//连接成功tab添加页tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选中状态}catch(IOException e1){e1.printStackTrace();}}}//面板内部类,每个对象表示选项卡窗格的一页,包含一个Socket和一个线程private class TabPageJPanel extends JPanel implements Runnable,ActionListener{Socket socket;Thread thread;JTextArea text_receiver;//显示对话内容的文本区JTextField text_sender; //输入发送内容的文本行JButton buttons[]; //发送‘离线’删除页按钮PrintWriter cout; //字符输出流对象int index;TabPageJPanel(Socket socket) {super(new BorderLayout());this.text_receiver=new JTextArea();this.text_receiver.setEditable(false);this.add(new JScrollPane(this.text_receiver));JPanel panel=new JPanel();this.add(panel,"South");this.text_sender=new JTextField(16);panel.add(this.text_sender);this.text_sender.addActionListener(this);String strs[]={"发送","离线","删除页"};buttons =new JButton[strs.length];for (int i = 0; i < buttons.length; i++) {buttons[i]=new JButton(strs[i]);panel.add(buttons[i]);buttons[i].addActionListener(this);}buttons[2].setEnabled(false);this.socket=socket;this.thread=new Thread(this);this.thread.start();}@Overridepublic void run() {try {this.cout =new PrintWriter(socket.getOutputStream(),true);this.cout.println(name);//发送自己网名给对方BufferedReader cin=new BufferedReader(new InputStreamReader(socket.getInputStream()));String name=cin.readLine(); //接收对方网名index=tab.getSelectedIndex();tab.setTitleAt(index, name);String aline=cin.readLine();while(aline!=null && !aline.equals("bye")){tab.setSelectedIndex(index);text_receiver.append(aline+"\r\n");Thread.sleep(1000);aline=cin.readLine();}cin.close();cout.close();socket.close();buttons[0].setEnabled(false);//接收方的发送按钮无效buttons[1].setEnabled(false);//接收方的离线按钮无效buttons[2].setEnabled(false);//接收方的删除按钮无效} catch (Exception e) {e.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getActionCommand()=="发送"){this.cout.println(name+"说:"+text_sender.getText());text_receiver.append("我说:"+text_sender.getText()+"\n");text_sender.setText("");}if(e.getActionCommand()=="离线"){text_receiver.append("我离线\n");this.cout.println(name+"离线\n"+"bye");buttons[0].setEnabled(false);buttons[1].setEnabled(false);buttons[2].setEnabled(false);}}}public static void main(String[] args) throws IOException {new wyhChatRoom(2001, "航哥哥");//启动服务端,约定端口,指定网名}}。
本科毕业论文-基于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聊天室部分主要代码

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地址。
基于websocket和java的多人聊天室

最新基于websocket与java的多人聊天室实现架构html5+websocket+javaEE7+tomcat8JavaEE7 最新的websocket1.0 APITomcat8开始支持websocket1.0 API【Tomcat implements the Java WebSocket 1.0 API defined by JSR-356】在编写代码之前你要导入javaEE7的jar包以便使用websocket API,将此项目部署到tomcat8里面。
具体代码如下:Java端:ChatAnnotation类;使用的是注解的方式。
package websocket.chat;import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;import java.util.concurrent.atomic.AtomicInteger;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import org.apache.juli.logging.Log;import org.apache.juli.logging.LogFactory;import util.HTMLFilter;@ServerEndpoint(value = "/websocket/chat")public class ChatAnnotation {private static final Log log =LogFactory.getLog(ChatAnnotation.class);private static final String GUEST_PREFIX = "Guest";private static final AtomicInteger connectionIds = new AtomicInteger(0);private static final Set<ChatAnnotation> connections =new CopyOnWriteArraySet<>();private final String nickname;private Session session;public ChatAnnotation() {nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); }@OnOpenpublic void start(Session session) {this.session = session;connections.add(this);String message = String.format("* %s %s", nickname, "has joined.");broadcast(message);}@OnClosepublic void end() {connections.remove(this);String message = String.format("* %s %s",nickname, "has disconnected.");broadcast(message);}@OnMessagepublic void incoming(String message) {// Never trust the clientString filteredMessage = String.format("%s: %s",nickname, HTMLFilter.filter(message.toString()));broadcast(filteredMessage);}@OnErrorpublic void onError(Throwable t) throws Throwable {log.error("Chat Error: " + t.toString(), t);}private static void broadcast(String msg) {for (ChatAnnotation client : connections) {try {synchronized (client) {client.session.getBasicRemote().sendText(msg);}} catch (IOException e) {log.debug("Chat Error: Failed to send message to client", e);connections.remove(client);try {client.session.close();} catch (IOException e1) {// Ignore}String message = String.format("* %s %s",client.nickname, "has been disconnected."); broadcast(message);}}}}里面的juli.jar包可以百度一下自行下载。
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聊天工具代码

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和WebSocket实现网页聊天室实例代码
使⽤Java和WebSocket实现⽹页聊天室实例代码在没介绍正⽂之前,先给⼤家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以⼀定程度上模拟双向通信,但效率较低,并需要服务器有较好的⽀持; flash中的socket 和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使⽤这两项功能. 可以预见,如果websocket⼀旦在浏览器中得到实现,将会替代上⾯两项技术,得到⼴泛的使⽤.⾯对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。
在JavaEE7中也实现了WebSocket协议。
原理WebSocket protocol 。
现很多⽹站为了实现即时通讯,所⽤的技术都是轮询(polling)。
轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。
这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的有⽤数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽。
⽽⽐较新的技术去做轮询的效果是Comet – ⽤了AJAX。
但这种技术虽然可达到全双⼯通信,但依然需要发出请求。
在 WebSocket API,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。
两者之间就直接可以数据互相传送。
在此WebSocket 协议中,为我们实现即时服务带来了两⼤好处:1. Header互相沟通的Header是很⼩的-⼤概只有 2 Bytes2. Server Push服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,⽽是在有新数据时就主动推送给浏览器。
简易的聊天软件代码
GetMessage.java服务端:import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;public class GetMessage extends Thread{ private int i;String v;JLabel label=null;private JTextArea text;public GetMessage(int i,JTextArea text) {this.i=i;this.text=text;}public void run(){try {ServerSocket so = newServerSocket(i);Socket s = so.accept();while(true){InputStreamReader i = new InputStreamReader(s.getInputStream());BufferedReader b = new BufferedReader(i);v= b.readLine();text.append("对方说"+v+"\n");}} catch (IOException e) {//label.setText("对方已经下线");text.append();}}}SendMessage.java客户端:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; import java.io.PrintStream;import .Socket;public class SendMessage extends Thread {private String ip;private int i;Socket s = null;JLabel label=null;JTextField text;JTextArea text1;public SendMessage(String ip,inti,JTextArea text1) {// TODO Auto-generated constructor stubthis.ip=ip;this.i=i;this.text1=text1;}public void run(){while(true){try {s = new Socket(ip,i);text1.setText("连接成功"+"\n");break;} catch (Exception e) {try {Thread.sleep(1000);} catch(InterruptedException e1) {System.out.println("出错了。
Chat—qq聊天系统
学java se也有一段时间了,初接触java时,其一些语法while,for,if,swich等语句跟C语言大同小异,只是这些语句是在类里面执行而已。
这个聊天程序,基本囊括java SE的内容:继承,重写,多态,接口,多线程,IO输入输出流,GUI。
所以,学完java SE后做一个类似qq的聊天程序是对java se最好的复习,也为以后做大项目打好基础。
以下是对聊天程序的简介:这个聊天程序功能比较多点,不是纯粹的两个聊天窗口而已,包括启动服务器,登录客户端,客户端之间的通讯。
所以,建了三个包,一个是Server包,一个是Client包,另一个是用来处理数据信息传递和交换的Util包。
本聊天程序处理数据信息,运用到的XML技术和IO输入输出流,因为学java se里并没有的XML的知识点,所以为了理解和能做出这个聊天程序,我后来花了几天学了XML技术,XML很重要,以后学到java ee时做项目很多时候药运用到XML的知识。
聊天的界面主要是运用GUI那章的知识:swt和swing。
首先,Server包定义三个类,分别是:Server,ServerConnection,ServerMessageThreadServer类主要是作为服务器,要运行聊天程序时,得先启动服务器,然后才能运行Client 客户端,如果学了java 网络那章的话,应该就理解为什么这样做了。
而ServerConnection是用来进行服务器的链接,ServerMessageThread是用来启动服务器线程,并接收客户端传来的登录信息。
其代码如下:Server类:package Server;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Collection;import java.util.HashMap;import java.util.Map;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import Util.XMLUtil;public class Server extends JFrame{private JLabel jLabel1;private JLabel jLabel2;private JLabel jLabel3;private JButton jButton;private JPanel jPanel1;private JPanel jPanel2;private JScrollPane jScrollPane;private JTextArea jTextArea;private JTextField jTextField;private Map<String, ServerMessageThread> map = new HashMap<String, ServerMessageThread>();public Server(String name){super(name);this.initComponents(); //initialize UI}public Map<String, ServerMessageThread> getMap(){return map;}public JLabel getJLabel2(){return jLabel2;}public JButton getJButton(){return jButton;}public JTextArea getJTextArea(){return jTextArea;}public JTextField getJTextField(){return jTextField;}public void setJTextField(JTextField textField){jTextField = textField;}private void initComponents(){jPanel1 = new JPanel();jPanel2 = new JPanel();jLabel1 = new JLabel();jLabel2 = new JLabel();jLabel3 = new JLabel();jTextField = new JTextField(10);jButton = new JButton();jScrollPane = new JScrollPane();jTextArea = new JTextArea();jPanel1.setBorder(BorderFactory.createTitledBorder("服务器信息"));jPanel2.setBorder(BorderFactory.createTitledBorder("在线用户列表"));jTextField.setText("5000");jLabel1.setText("服务器状态");jLabel2.setText("停止");jLabel2.setForeground(new Color(204, 0, 51));jLabel3.setText("端口号");jButton.setText("启动服务器");jButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){Server.this.execute(event);}});this.addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e){try{Collection<ServerMessageThread> cols = Server.this.map.values();String messageXML =XMLUtil.constructCloseServerWindowXML();for(ServerMessageThread smt : cols){smt.sendMessage(messageXML);}}catch(Exception ex){ex.printStackTrace();}finally{System.exit(0);}}});jPanel1.add(jLabel1);jPanel1.add(jLabel2);jPanel1.add(jLabel3);jPanel1.add(jTextField);jPanel1.add(jButton);jTextArea.setEditable(false); //不允许用户手动修改在线用户列表jTextArea.setRows(20);jTextArea.setColumns(30);jTextArea.setForeground(new Color(0, 51, 204));jScrollPane.setViewportView(jTextArea); //将JTextArea放置到JScrollPane中jPanel2.add(jScrollPane);this.getContentPane().add(jPanel1, BorderLayout.NORTH);this.getContentPane().add(jPanel2, BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setAlwaysOnTop(true);this.setResizable(false);this.pack();this.setVisible(true);}private void execute(ActionEvent evt){int port = Integer.parseInt(this.getJTextField().getText());new ServerConnection(this, port).start();}public static void main(String[] args){new Server("服务器");}}ServerConnection类:package Server;import java.io.InputStream;import java.io.OutputStream;import .ServerSocket;import .Socket;import javax.swing.JOptionPane;import Util.XMLUtil;public class ServerConnection extends Thread{private ServerSocket serverSocket;private Server server;public ServerConnection(Server server, int port){try{this.server = server;this.serverSocket = new ServerSocket(port);// 下面两行代码不能放到上面一行代码之前// 因为服务器启动时有可能会抛出异常// 如果放在上面,则发生异常时也会导致label上的文本发生变化// 这与实际情况不符this.server.getJLabel2().setText("运行");this.server.getJButton().setEnabled(false);}catch(Exception ex){ex.printStackTrace();JOptionPane.showMessageDialog(this.server, "端口号被占用!", "警告", JOptionPane.ERROR_MESSAGE);}}@Overridepublic void run(){while(true){try{Socket socket = this.serverSocket.accept();InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();byte[] buf = new byte[5000];int length = is.read(buf);//客户端发来的连接信息(包括了用户名)String loginXML = new String(buf, 0, length);// 从客户端登录数据中提取出用户名信息(username)String username =XMLUtil.extractUsername(loginXML);String loginResult = null;// 判断用户是否登录成功boolean isLogin = false;// 判断用户名是否重复// 用户名重复if(this.server.getMap().containsKey(username)){loginResult = "failure";}// 用户名不重复else{loginResult = "success";isLogin = true;}String xml =XMLUtil.constructLoginResultXML(loginResult);os.write(xml.getBytes());// 如果用户登录成功,启动线程if(isLogin){// 准备创建新的线程,用于处理用户的聊天数据,每一个连接上的用户都会对应一个该线程ServerMessageThread serverMessageThread = new ServerMessageThread(this.server, socket);//将用户名及与之对应的线程对象放到Map中this.server.getMap().put(username, serverMessageThread);//更新用户列表(服务器端+客户端)serverMessageThread.updateUserList();serverMessageThread.start();}}catch(Exception ex){ex.printStackTrace();}}}}ServerMessagetThread类:package Server;import java.io.InputStream;import java.io.OutputStream;import .Socket;import java.util.Collection;import java.util.Map;import java.util.Set;import Util.CharacterUtil;import Util.XMLUtil;public class ServerMessageThread extends Thread{private Server server;private InputStream is;private OutputStream os;public ServerMessageThread(Server server, Socket socket) {try{this.server = server;this.is = socket.getInputStream();this.os = socket.getOutputStream();}catch(Exception ex){}}// 更新用户列表// 首先更新服务器端的用户列表// 然后更新客户端的用户列表public void updateUserList(){//获得用户名的集合Set<String> users = this.server.getMap().keySet();//构造向客户端发送的在线用户列表数据xmlString xml = XMLUtil.constructUserList(users);String str = "";for(String user : users){str += user + "\n";}//首先更新服务器端的用户列表this.server.getJTextArea().setText(str);Collection<ServerMessageThread> cols =this.server.getMap().values();//遍历与每一个客户端对应的线程,向每一个客户端发送在线用户列表for(ServerMessageThread smt : cols){smt.sendMessage(xml);}}//向客户端发送数据public void sendMessage(String message){try{os.write(message.getBytes());}catch(Exception ex){ex.printStackTrace();}}@Overridepublic void run(){while(true){try{byte[] buf = new byte[5000];int length = this.is.read(buf);//客户端发来的消息String xml = new String(buf,0,length);int type =Integer.parseInt(XMLUtil.extractType(xml));// 聊天数据if(CharacterUtil.CLIENT_MESSAGE == type){//用户名(谁发来的消息)String username =XMLUtil.extractUsername(xml);//聊天的文本内容String content = XMLUtil.extractContent(xml);//构造向所有客户端发送的消息String message = username + " : " + content;//向所有客户端发送的XML聊天数据String messageXML =XMLUtil.constructServerMessageXML(message);Map<String, ServerMessageThread> map =this.server.getMap();Collection<ServerMessageThread> cols =map.values();for(ServerMessageThread smt : cols){//向XML聊天数据发送给每一个客户端smt.sendMessage(messageXML);}}// 关闭客户端窗口else if(CharacterUtil.CLOSE_CLIENT_WINDOW == type){String username =XMLUtil.extractUsername(xml);//获得待删除用户所对应的线程对象ServerMessageThread smt =this.server.getMap().get(username);//构造出向客户端确认关闭的XML信息String confirmationXML =XMLUtil.constructCloseClientWindowConfirmationXML();//向客户端发送任意一条确认信息smt.sendMessage(confirmationXML);// 从用户列表的Map中将该用户去除this.server.getMap().remove(username);// 更新在线用户列表this.updateUserList();this.is.close();this.os.close();break; // 结束该线程}}catch(Exception ex){}}}}第二:Client包Client包定义三个类,分别是:Client,ChatClient,ClientConnection。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录前言 ............................................................................................................................................. - 1 - 工程概况...................................................................................................................................... - 1 - 正文 ............................................................................................................................................. - 1 - 2.1课程任务及要求.................................................................................................................... - 1 - 2.2选题意义................................................................................................................................ - 2 - 2.3 程序需求分析....................................................................................................................... - 2 - 2.3.1可行性分析......................................................................................................................... - 2 - 2.3.2 服务器端............................................................................................................................ - 2 - 2.3.3 客户端................................................................................................................................ - 3 - 2.4 算法设计............................................................................................................................... - 3 - 2.4.1 UML图如下:................................................................................................................... - 3 - 2.4.2 C/S模式套接字的连接...................................................................................................... - 4 - 2.4.3 文字聊天的实现.............................................................................................................. - 4 - 2.5 程序设计与实现................................................................................................................... - 5 - 2.5.1建立连接............................................................................................................................. - 5 - 2.5.2断开连接........................................................................................................................... - 5 - 2.5.3 C/S模式套接字的连接................................................................................................... - 6 - 2.6程序测试与分析.................................................................................................................... - 8 - 2.6.1启动服务器......................................................................................................................... - 8 - 2.6.2启动客户端......................................................................................................................... - 8 - 2.6.3成功启动客户端................................................................................................................. - 8 - 2.6.4聊天过程............................................................................................................................. - 9 - 2.6.5 断开连接............................................................................................................................ - 9 - 2.7课程设计小结...................................................................................................................... - 10 - 参考文献.................................................................................................................................... - 10 - 课程设计总结............................................................................................................................ - 11 - 致谢 ........................................................................................................................................... - 12 - 附录 ........................................................................................................................................... - 13 -前言《JAVA程序设计教程》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。
其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。
Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
工程概况一般来说,聊天工具大多数由客户端和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Socket类来链接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点的,而Java提供的多线程功能用多线程可完成多点的聊天。