实例介绍
【实例简介】一个简单的P2P即时聊天系统,实现功能如下: 1) 点对点的单人聊天 2) 多人同时聊天 3) 用户可以自由加入和退出
【实例截图】
服务端如下:
客户端聊天记录为:
【核心代码】
package netchat; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.text.SimpleDateFormat; //import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.io.*; import java.net.*; import netchat.clientInfo; public class Server extends JFrame implements ActionListener{ JButton sendButton,cleanButton,closeButton,startButton; TextArea taRecord,taInput; TextField textfield; List list; clientInfo clientinfo; ServerSocket serversocket; Socket socket; //ServerListenThread serverlistenthread; ObjectOutputStream out; ObjectInputStream in; ArrayList<ObjectOutputStream> allOut; static InetAddress ip; static int port; static boolean isStop; SimpleDateFormat date=new SimpleDateFormat("yyyy-MM-dd hh:mm EEEE"); Date time=new Date(); static Server server; public static void main(String[] args) { server=new Server(); } public Server() { //初始化allOuts this.allOut = new ArrayList<ObjectOutputStream>(); sendButton=new JButton("发送"); sendButton.setMnemonic('S'); cleanButton=new JButton("清除"); closeButton=new JButton("关闭"); startButton=new JButton("启动"); closeButton.setEnabled(false); sendButton.setEnabled(false); cleanButton.setEnabled(false); taRecord=new TextArea("",14,50); taRecord.setBackground(Color.lightGray); taInput=new TextArea("",4,50); taInput.setBackground(Color.lightGray); textfield=new TextField(); textfield.setBackground(Color.lightGray); taRecord.setEditable(false); //list.setEnabled(false); textfield.setEditable(false); //DefaultListModel model=new DefaultListModel(); list=new List(); Panel p1=new Panel(); p1.setLayout(new BorderLayout()); p1.add(new Label("在线列表"),BorderLayout.NORTH); p1.add(textfield,BorderLayout.CENTER); Panel p2=new Panel(); p2.setLayout(new BorderLayout()); p2.add(p1,BorderLayout.NORTH); p2.add(list,BorderLayout.CENTER); Panel p3=new Panel(); p3.setLayout(new GridLayout(1,2,90,4)); p3.add(startButton); p3.add(closeButton); Panel p4=new Panel(); p4.setLayout(new BorderLayout()); p4.add(new Label("聊天记录"),BorderLayout.NORTH); p4.add(taRecord,BorderLayout.CENTER); Panel p9=new Panel(); p9.setLayout(new BorderLayout()); p9.add(p3,BorderLayout.NORTH); p9.add(p4,BorderLayout.CENTER); Panel p5=new Panel(); p5.setLayout(new BorderLayout(5,9)); p5.add(p9,BorderLayout.CENTER); p5.add(taInput,BorderLayout.SOUTH); Panel p6=new Panel(); p6.setLayout(new GridLayout(1,2,90,50)); p6.add(sendButton); p6.add(cleanButton); Panel p7=new Panel(); p7.setLayout(new BorderLayout()); p7.add(p5,BorderLayout.CENTER); p7.add(p6,BorderLayout.SOUTH); Panel p8=new Panel(); p8.setLayout(new BorderLayout()); p8.add(p2,BorderLayout.WEST); p8.add(p7,BorderLayout.CENTER); setLayout(new BorderLayout()); add(p8,BorderLayout.CENTER); setSize(450,450); setTitle("chatRoom"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); setVisible(true); sendButton.addActionListener(this); cleanButton.addActionListener(this); closeButton.addActionListener(this); startButton.addActionListener(this); } public void actionPerformed(ActionEvent e) { if(e.getSource()==startButton) { startServer(); } else if(e.getSource()==closeButton) { stopServer(); System.exit(0); } else if(e.getSource()==sendButton) { if(taInput.getText().equalsIgnoreCase("")||taInput.getText()==null) { JOptionPane.showMessageDialog(this, "尚未输入系统信息!","Information" , JOptionPane.INFORMATION_MESSAGE); } sendSystemMessage(); } else if(e.getSource()==cleanButton) { taInput.setText(""); } } public void startServer() { try { serversocket=new ServerSocket(1234); taRecord.append("等待连线....." "\n"); startButton.setEnabled(false); closeButton.setEnabled(true); sendButton.setEnabled(true); cleanButton.setEnabled(true); this.isStop=false; clientinfo=new clientInfo(); ServerListenThread serverlistenthread=new ServerListenThread(serversocket,taRecord,textfield,list,clientinfo); serverlistenthread.start(); } catch(Exception e) { taRecord.append("error0"); } } public void stopServer() { try { this.isStop=true; serversocket.close(); socket.close(); list.removeAll(); } catch(Exception e) { taRecord.append("close"); } } public void sendSystemMessage() { String message=taInput.getText(); taRecord.append("系统消息 " taInput.getText() "\n"); taInput.setText(""); try { Iterator<ObjectOutputStream> it = this.allOut.iterator(); while(it.hasNext()){ ObjectOutputStream tout = it.next(); tout.writeObject("系统消息"); tout.flush(); tout.writeObject(message); tout.flush(); } } catch(Exception e) { taRecord.append("error92" e.toString()); } } public class ServerListenThread extends Thread{ ServerSocket serversocket; TextArea taRecord; List list; TextField textfield; clientInfo clientinfo; Node node; //Socket socket; //ObjectOutputStream out; //ObjectInputStream in; ServerReceiveThread serverreceivethread; public ServerListenThread(ServerSocket serversocket,TextArea taRecord,TextField textfield,List list,clientInfo clientinfo) { this.serversocket=serversocket; this.taRecord=taRecord; this.textfield=textfield; this.list=list; this.clientinfo=clientinfo; } public void run() { while(!isStop&&!serversocket.isClosed()) { try { node=new Node(); socket=serversocket.accept(); InetAddress ip=socket.getInetAddress().getByName(socket.getInetAddress().getHostAddress()); server.setIp(ip); node.ip=ip; ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream()); allOut.add(out); in=new ObjectInputStream(socket.getInputStream()); node.username=(String)in.readObject(); node.port = in.readInt(); taRecord.append("恭喜你!" node.username "连线成功!" " " "the client " node.username "'s address is " ip ":" node.port "\n"); list.add(node.username); clientinfo.add(node); taRecord.append("用户" node.username "已上线\n"); String message="在线用户" clientinfo.getCount() "人\n"; textfield.setText(message); server.setOut(out); serverreceivethread=new ServerReceiveThread(socket,taRecord,textfield,list,node,clientinfo,in,out,Server.this.allOut,message); serverreceivethread.start(); } catch(Exception e) { taRecord.append("error85" e.toString()); } } } } public void setOut(ObjectOutputStream out) { this.out=out; } public ObjectOutputStream getOut() { return out; } public void setIp(InetAddress ip) { this.ip=ip; } public InetAddress getIp() { return ip; } public void setPort(int port) { this.port=port; } public int getPort() { return port; } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)