在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Java网络编程 → java实现的P2P即时聊天程序(源码+文档+jar运行包)

java实现的P2P即时聊天程序(源码+文档+jar运行包)

Java网络编程

下载此实例
  • 开发语言:Java
  • 实例大小:0.45M
  • 下载次数:118
  • 浏览次数:1900
  • 发布时间:2019-06-29
  • 实例类别:Java网络编程
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: java p2p 程序 聊天

实例介绍

【实例简介】一个简单的P2P即时聊天系统,实现功能如下: 1) 点对点的单人聊天 2) 多人同时聊天 3) 用户可以自由加入和退出

【实例截图】

服务端如下:

from clipboard

客户端聊天记录为:

from clipboard

【核心代码】

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;
    }
}

标签: java p2p 程序 聊天

实例下载地址

java实现的P2P即时聊天程序(源码+文档+jar运行包)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 sdnuqqzj 发表于: 2020-03-23 21:40 48
导入java项目为什么中文乱码啊,怎么解决请问

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警