基于Java和Socket实现局域网通讯的简易微信设计

资源下载地址:https://download.csdn.net/download/sheziqiong/85947114
资源下载地址:https://download.csdn.net/download/sheziqiong/85947114
摘 要
本系统是基于java8开发的简易微信。有用户注册、用户登陆、修改密码、忘记密码、添加好友、用户聊天(包括发送文字和图片)、显示好友列表、群发消息以及局域网客户端通信功能。
本项目是在java环境下,使用eclipse工具实现的基于Socket编程和mysql数据库的即时通信工具,并且在局域网内均有通信功能,但通信的内容只局限于文字和本地图片的发送。如果服务器还没有启动,则客户端的操作是不会有任何响应的,如果在运行过程中,服务器断开则系统会有提示,聊天对象如果下线发送消息后会有弹窗提示。本项目可以解决部分局域网通信的需求,但限于时间的关系并没有添加过多功能。
关键词:Socket编程、mysql数据库、Java、局域网
目 录

  1. 项目功能与平台介绍 3
    1.1 实现的功能 3
    1.1.1 基本功能 3
    1.1.2 附加功能 4
    1.2 使用平台与技术 4
    1.2.1 Java 4
    1.2.2 MySQL介绍 5
  2. 程序架构分析 6
    2.1 程序架构图 6
    2.2 程序结构分析 6
    2.3 程序流程图 7
    2.4 程序流程图分析 7
  3. 功能分析和设计方法 8
    3.1 注册功能 8
    3.2 登录功能 8
    3.3 忘记密码 9
    3.4 好友列表 10
    3.5 好友聊天 10
    3.6 添加好友 11
    3.7 修改密码 12
    3.8 好友消息群发 12
    3.9 局域网搜索与通话 13
  4. 数据库说明 15
    4.1 数据库表表结构 15
    4.1.1 用户信息表 15
    4.1.2 用户好友列表 15
    4.2 数据库表数据 16
    4.2.1 用户信息表 16
    4.2.2 用户关系表 16
    4.3 数据库相关的建表语句 16
    4.3.1 建立用户信息表 16
    4.3.2 插入第一个用户 17
    4.3.3 为相关用户建立其好友列表 17
  5. 项目总结 18
    1.1 实现的功能
    1.1.1 基本功能
    通讯录功能。通讯录按照字母表顺序显示。
    能添加新的朋友。A向服务器发送查询请求,并根据得到的信息,向B发出好友请求和验证信息,通过验证之后,将新的朋友添加到通讯录中。
    可以通过服务器与通讯录中的朋友进行即时通信。(双方可以互发信息,包括文字和图片),发送信息不成功时要有相应的提示。
    局域网发现功能。能够发现局域网中其他正在使用简易微信的用户,并且可以通过局域网发起临时会话。
    1.1.2 附加功能
    用户注册功能。用户可以创建自己的账号、密码来使用客户端。
    密码修改功能。用户可以修改自己账号的密码。
    忘记密码功能。用户注册的时候,会登记一个个人问题,并自己给出答案,使用忘记密码时,只需要记得自己的账号和问题的答案,即可修改自己的密码。
    好友消息群发功能。在逢年过节时,如果想要向所有好友群发消息,则可以使用这个功能,实现好友消息群发的功能。
    1.2 使用平台与技术
    此项目运行在Windows 10上,使用Eclipse作为IDE,用MySQL作为数据库。以Java为主要设计语言。
    1.2.1 Java
    ①Socket实现简便
    Java提供了较多的Socket相关的API,Socekt编程的时候可以方便地调用API来实现通信。
    ②面向对象
    Java提供了简单的类机制和动态的架构模型。对象中封装了它的状态变量和方法。很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
    Java同样支持继承特性,java的类可以从其他类中继承行为,但java只支持类的单重继承,即每个类只能从一个类中继承。
    Java支持界面,界面允许程序员定义方法但不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。
    ③多线程
    多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。多线程保证了较高的执行效率。
    客户端部分代码:
package UserSocket;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;

import Entity.ChatUIEntity;
import Entity.User;
import Frame.ChatUI;
import Frame.FriendsUI;
import _Util.ChatUIList;
import _Util.CommandTranser;
import java.util.*;
import java.net.*;
 
public class ChatTread extends Thread{
	private Client client;
	private boolean isOnline = true; //没用 ------待删
	private User user; //如果同意好友请求, 则刷新好友列表
	private FriendsUI friendsUI; //刷新好友列表用
	private String username; //如果创建新的聊天窗口(chatUI)那么必须将username传进去 用来发送消息
	private StyledDocument doc; 
	InetAddress ip;// = InetAddress.getLocalHost();
	public ChatTread(Client client, User user, FriendsUI friendsUI) throws UnknownHostException {
		this.client = client;
		this.user = user;
		this.friendsUI = friendsUI;
		this.username = user.getUsername();
		ip = InetAddress.getLocalHost();
		//this.chat_windows = chat_windows;
	}
	
	public boolean isOnline() {
		return isOnline;
	}
	//这里没用 以后删---------------------------------------
	public void setOnline(boolean isOnline) {
		 this.isOnline = true; 
	}
	
	//run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,
	//便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务
	@Override
	public void run() {
		if(!isOnline) {
			JOptionPane.showMessageDialog(null,  "unbelievable !!!");
			return;
		}
		while(isOnline) {
			//System.out.println("在线");
			CommandTranser cmd = client.getData();
			//与服务器端相同处理接收到的消息(命令)
			//这里处理来自服务器的消息(命令)
			if(cmd != null) {
				
				 try {
					execute(cmd);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			 //System.out.println(cmd.getCmd());	
			}
		}
	}
	
	//处理消息(命令)
	@SuppressWarnings("null")
	private void execute(CommandTranser cmd) throws IOException {
		//登录、忘记密码、注册消息未在此处处理
		//System.out.println("execute");
		System.out.println(cmd.getReceiver()+"收到的命令为:"+cmd.getCmd());
		System.out.println("数据类型为:"+cmd.getData().getClass().toString());
		//聊天消息请求 
		if("message".equals(cmd.getCmd())) {
			if(cmd.isFlag() == false) {
				JOptionPane.showMessageDialog(null, cmd.getResult()); 
				return;
			}
			
			//查询是否有与该好友的窗口该窗口
			String friendname = cmd.getSender();
			ChatUI chatUI = ChatUIList.getChatUI(friendname);
			if(chatUI == null) {
				chatUI = new ChatUI(username, friendname, username, client, user);
				ChatUIEntity chatUIEntity = new ChatUIEntity();
				chatUIEntity.setName(friendname);
				chatUIEntity.setChatUI(chatUI);
				ChatUIList.addChatUI(chatUIEntity);
			} else {
				chatUI.show(); //如果以前创建过仅被别的窗口掩盖了 就重新显示
			}
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat(
					"yy-MM-dd hh:mm:ss a");
			JTextPane chat_windows = chatUI.getChatWin();
			doc = chat_windows.getStyledDocument();
			String s = "123";
			ImageIcon i = null;
			System.out.println("s的数据类型为:"+s.getClass().toString());
			
			if(cmd.getData().getClass().toString().equals(s.getClass().toString())){//文字
				String message = friendname + "说:"
						+ (String) cmd.getData() + "\t" + sdf.format(date)
						+ "\n";
				try {
					doc.insertString(doc.getLength(), message, null);
				} catch (BadLocationException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				chat_windows.setCaretPosition(doc.getLength());//用来接到后面的位置 
			}else  {
				try {
					doc.insertString(doc.getLength(), friendname + "说:", null);
				} catch (BadLocationException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				ImageIcon I = (ImageIcon) cmd.getData();
				chat_windows.setCaretPosition(doc.getLength());//用来接到后面的位置  
			    chat_windows.insertIcon(I);
			    doc = chat_windows.getStyledDocument();
				try {
					doc.insertString(doc.getLength(), sdf.format(date) + "\n", null);
				} catch (BadLocationException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
			return;
		}
		
		if("not_online".equals(cmd.getCmd())){
			JOptionPane.showMessageDialog(null,  "对方不在线,请稍后再发!");
		}
		
		if("all_online".equals(cmd.getCmd())){
			System.out.println("客户端收到所有在线人员为"+cmd.getAllOnline());
			ArrayList all_online = cmd.getAllOnline();
			user.setAllOnline(all_online);
			
			//更新在线用户
			friendsUI.dispose();//关闭原来的窗口
			System.out.println("更新窗口");
			FriendsUI friendsUI = new FriendsUI(user, client);
			//使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候
			//(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
			friendsUI.validate();
			friendsUI.repaint();
			friendsUI.setVisible(true);
			this.friendsUI = friendsUI;
			return;
		}
		
		if("WorldChat".equals(cmd.getCmd())) {
//			if(cmd.isFlag() == false) {
//				JOptionPane.showMessageDialog(null, cmd.getResult()); 
//				return;
//			}
			//查询是否有与该好友的窗口该窗口
			String friendname = cmd.getSender();
			String sender = cmd.getSender();
			String receiver = cmd.getReceiver();
			ChatUI chatUI = ChatUIList.getChatUI(sender);
			
			if(chatUI == null) {
				chatUI = new ChatUI(receiver, sender, user.getUsername(), client, user);
				ChatUIEntity chatUIEntity = new ChatUIEntity();
				chatUIEntity.setName(sender);
				chatUIEntity.setChatUI(chatUI);
				ChatUIList.addChatUI(chatUIEntity);
			} else {
				chatUI.show(); //如果以前创建过仅被别的窗口掩盖了 就重新显示
			}
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat(
					"yy-MM-dd hh:mm:ss a");
			String message = friendname + "说:"
					+ (String) cmd.getData() + "\t" + sdf.format(date)
					+ "\n";
			JTextPane chat_windows = chatUI.getChatWin();
			doc = chat_windows.getStyledDocument();
			try {
				doc.insertString(doc.getLength(), message, null);
			} catch (BadLocationException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			chat_windows.setCaretPosition(doc.getLength());//用来接到后面的位置 
			return;
		}
		
		if("requeste_add_friend".equals(cmd.getCmd())) {
			if(cmd.isFlag() == false) {
				JOptionPane.showMessageDialog(null, cmd.getResult()); 
				return;
			}
			String sendername = cmd.getSender();
			int flag = JOptionPane.showConfirmDialog(null, "是否同意" + sendername + "的好友请求", "好友请求", JOptionPane.YES_NO_OPTION);
			System.out.println(flag);
			if(flag == 0) {
				cmd.setCmd("accept_add_friend");
			} else {
				cmd.setCmd("refuse_add_friend");			
			}
			cmd.setSender(username);
			cmd.setReceiver(sendername);
			client.sendData(cmd);
			return;
		}
		
//		if("successful".equals(cmd.getCmd())) {
//			JOptionPane.showMessageDialog(null, cmd.getResult()); 
//			return;
//		}
		
		if("accept_add_friend".equals(cmd.getCmd())) {
			//JOptionPane.showMessageDialog(null, cmd.getResult());
			System.out.println(cmd.getResult()+" 接收到添加命令");
			CommandTranser newcmd = new CommandTranser();
			System.out.println("接受好友:"+username);
			newcmd.setCmd("updatefriendlist");
			newcmd.setReceiver(username);
			newcmd.setSender(username);
			newcmd.setData(user);
			client.sendData(newcmd);
			return;
		}
		
		if("updatefriendlist".equals(cmd.getCmd())) {
			System.out.println(cmd.getCmd()+"判断");
			if(cmd.isFlag() == false) {
				JOptionPane.showMessageDialog(null, cmd.getResult()); 
				return;
			}
			User tmp = (User)cmd.getData();
			System.out.println(tmp.getUserpwd()+" 接收到更新命令");
			System.out.println(tmp.getFriend());
			user.setFriendsList(tmp.getFriend());
			//更新好友列表
			friendsUI.dispose();//关闭原来的窗口
			FriendsUI friendsUI = new FriendsUI(user, client);
			//使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候
			//(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
			friendsUI.validate();
			friendsUI.repaint();
			friendsUI.setVisible(true);
			this.friendsUI = friendsUI;
			return;
		}
		
		if("refuse_to_add".equals(cmd.getCmd())) {
			JOptionPane.showMessageDialog(null, cmd.getResult());
			return;
		}
		
		if("changepwd".equals(cmd.getCmd())) {
			JOptionPane.showMessageDialog(null, cmd.getResult());
			return;
		}
		return;
	}
	
}


基于Java和Socket实现局域网通讯的简易微信设计_第1张图片
基于Java和Socket实现局域网通讯的简易微信设计_第2张图片
基于Java和Socket实现局域网通讯的简易微信设计_第3张图片
基于Java和Socket实现局域网通讯的简易微信设计_第4张图片
基于Java和Socket实现局域网通讯的简易微信设计_第5张图片
基于Java和Socket实现局域网通讯的简易微信设计_第6张图片
基于Java和Socket实现局域网通讯的简易微信设计_第7张图片
在这里插入图片描述
基于Java和Socket实现局域网通讯的简易微信设计_第8张图片
基于Java和Socket实现局域网通讯的简易微信设计_第9张图片
基于Java和Socket实现局域网通讯的简易微信设计_第10张图片
基于Java和Socket实现局域网通讯的简易微信设计_第11张图片
基于Java和Socket实现局域网通讯的简易微信设计_第12张图片
基于Java和Socket实现局域网通讯的简易微信设计_第13张图片
基于Java和Socket实现局域网通讯的简易微信设计_第14张图片
基于Java和Socket实现局域网通讯的简易微信设计_第15张图片
基于Java和Socket实现局域网通讯的简易微信设计_第16张图片
基于Java和Socket实现局域网通讯的简易微信设计_第17张图片
基于Java和Socket实现局域网通讯的简易微信设计_第18张图片
基于Java和Socket实现局域网通讯的简易微信设计_第19张图片
基于Java和Socket实现局域网通讯的简易微信设计_第20张图片
基于Java和Socket实现局域网通讯的简易微信设计_第21张图片
基于Java和Socket实现局域网通讯的简易微信设计_第22张图片
基于Java和Socket实现局域网通讯的简易微信设计_第23张图片
基于Java和Socket实现局域网通讯的简易微信设计_第24张图片
基于Java和Socket实现局域网通讯的简易微信设计_第25张图片

资源下载地址:https://download.csdn.net/download/sheziqiong/85947114
资源下载地址:https://download.csdn.net/download/sheziqiong/85947114

你可能感兴趣的:(java,微信,Socket,局域网通讯,简易微信)