实例介绍
【实例简介】一个简单的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) 盖楼(回复)