标签 java 下的文章

400 Bad Request-Url特殊字符编码

今天碰到一个诡异的问题,线上系统没有问题可以访问,但在本机测试却不行。现象是在火狐访问空白页面,当时就蒙了啊,后来换ie则提示:400 Bad Request。
原来url中不允许出现特殊字符,比如:%
修改前url:http://index.youku.com/vr_keyword/id_6ZOB6KGA5L2%2f5ZG9&type=alldata
修改后url:http://index.youku.com/vr_keyword/id_6ZOB6KGA5L2%2f5ZG9&type=alldata
修改前代码:

var reg = new RegExp("\+", "g"); // 创建正则RegExp对象
var reg2 = new RegExp("\=", "g");
var reg3 = new RegExp("\/", "g");
basewords = basewords.replace(reg, "%2b");
basewords = basewords.replace(reg2, "%3d");
basewords = basewords.replace(reg3, "%2f");

修改后的代码:

var reg = new RegExp("\+", "g"); // 创建正则RegExp对象
var reg2 = new RegExp("\=", "g");
var reg3 = new RegExp("\/", "g");
basewords = basewords.replace(reg, "%252b");
basewords = basewords.replace(reg2, "%253d");
basewords = basewords.replace(reg3, "%252f");

PS:修改前url在线上是没有问题的,使用的resin服务器,但本机开发的tomcat却无法通过!估计处理机制有区别!
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号。 编码的格式为:%加对应字符的ASCII(16进制)码值。例如:空格的编码值是”%20″ 。
一些URL特殊符号及编码(十六进制值)
1. + URL中+号表示空格 %2B
2. 空格 URL中的空格可以用+号或者编码 %20
3. / 分隔目录和子目录 %2F
4. ? 分隔实际的 URL 和参数 %3F
5. % 指定特殊字符 %25
6. # 表示书签 %23
7. & URL中指定的参数间的分隔符 %26
8. = URL中指定参数的值 %3D
java中URL的编码和解码函数: java.net.URLEncoder.encode(String s) java.net.URLDecoder.decode(String s);
javascript中URL的编码和解码函数: escape(String s) unescape(String s) ;
更详细资料:
http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html

检测java方法执行时间

在方法开始处加上第一句
long a = System.currentTimeMillis();
在要监测的点加上下面这句:
System.out.println(“监测的时间:”+(System.currentTimeMillis()-a)/1000f+” 秒 “);
就OK了!

Java BASE64加密解密

Java BASE64加密解密 sun.misc包是Sun公司提供给内部使用的专用API,不建议使用。另外apache已经实现了一套:
参考org.apache.commons.codec.binary.Base64
下载地址:http://commons.apache.org/codec/download_codec.cgi

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * BASE64加密解密
 */
public class BASE64
{
    /**
     * BASE64解密
   * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }
    /**
     * BASE64加密
   * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }
    public static void main(String[] args) throws Exception
    {
        String data = BASE64.encryptBASE64("法证先锋 第二部".getBytes());
        System.out.println("加密前:"+data);
        //5rOV6K+B5YWI6ZSLIOesrOS6jOmDqA==
        byte[] byteArray = BASE64.decryptBASE64(data);
        System.out.println("解密后:"+new String(byteArray));
    }
}

利用HDFS java API增删改查操作

利用HDFS java API增删改查操作
在做这个实验的时候需要特别注意下面三个问题:
1、hdfs安全模式需要关闭 命令:./hadoop dfsadmin -safemode leave
2、工程中依赖的版本必须和集群的一致,否则也会报 version不一致错误
3、hadoop集群用户权限的问题,以及各个目录的作用
目前为什么会有这三个问题的原因待查!!!
未验证目前使用hadoop的版本(release-0.20.0)是否支持webhdfs,反正我是怎么都连接不上啊!!!
从这上面看,0.20.0 可能是不支持的
https://jira.springsource.org/browse/IMPALA-15?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
Serengeti Distro:
Apache Hadoop:1.0.1
GreenPlum HD:1.1(Apache Hadoop 1.0.0)
CloudEra: CDH3(Apache Hadoop 0.20.2, WebHDFS is not supported in this version)
Hortonworks: 1.0.7 (Apache Hadoop 1.0.2)
步骤如下:
工程结构,如图:

工程结构

工程结构


上代码 O(∩_∩)O哈哈~
pom.xml配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.yun.hdfs</groupId>
	<artifactId>hdfs</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<appendAssemblyId>false</appendAssemblyId>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.yun.hdfs.WangPan</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>assembly</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-core</artifactId>
			<version>0.20.2</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
	</dependencies>
</project>

WangPan.java 主方法用于调用:

package com.yun.hdfs;
import java.io.IOException;
public class WangPan {
	/*** 运行结果描述. */
	private static String result = "";
	public static void main(String[] args) {
		try {
			// 判断命令输入是否正确
			if (args[0] != null && !"".equals(args[0]) && args.length > 0) {
				if ("upload".equals(args[0])) {
					result = "upload:" + WangPanUtils.uploadFile(args);
				} else if ("delete".equals(args[0])) {
					result = "delete:" + WangPanUtils.deleteFile(args);
				} else if ("query".equals(args[0])) {
					if (WangPanUtils.listFile(args) == null) {
						result = "query:fail!";
					} else {
						result = "query:success";
					}
				} else if ("read".equals(args[0])) {
					result = "read:" + WangPanUtils.readFile(args);
				} else {
					System.out.println("sorry,wo have no this service!");
				}
				System.out.println(result);
			} else {
				System.out.println("fail!");
				System.exit(1);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

WangPanUtils.java增删改查:

package com.yun.hdfs;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class WangPanUtils {
	/**
	 * 上传文件. java -jar /root/hdfs-0.0.1-SNAPSHOT.jar upload /root/test-hdfs.txt
	 * hdfs://hadoopm:9000/user/root/upload/12390po.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String uploadFile(String[] args) throws IOException {
		String loaclSrc = args[1];
		String dst = args[2];
		if (args.length < 3) {
			return "fail";
		}
		InputStream in = new BufferedInputStream(new FileInputStream(loaclSrc));
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		OutputStream out = fs.create(new Path(dst));
		IOUtils.copyBytes(in, out, 4096, true);
		return "success";
	}
	/**
	 * 查询文件列表. java -jar /root/hdfs-0.0.1-SNAPSHOT.jar query
	 * hdfs://hadoopm:9000/user/root/
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static Path[] listFile(String[] args) throws IOException {
		if (args.length < 2) {
			return null;
		}
		String dst = args[1];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		FileStatus[] statu = fs.listStatus(new Path(dst));
		Path[] listPaths = FileUtil.stat2Paths(statu);
		return listPaths;
	}
	/**
	 * 删除文件.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar delete hdfs://hadoopm:9000/user/root/upload/12390po.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String deleteFile(String[] args) throws IOException {
		if (args.length < 2) {
			return "fail";
		}
		String fileName = args[1];
		Configuration config = new Configuration();
		FileSystem hdfs = FileSystem.get(URI.create(fileName), config);
		Path path = new Path(fileName);
		if (!hdfs.exists(path)) {
			return "fail";
		}
		boolean isDeleted = hdfs.delete(path, false);
		if (isDeleted) {
			return "success";
		} else {
			return "fail";
		}
	}
	/**
	 * 读取文件.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read hdfs://hadoopm:9000/user/root/upload/123.txt /root/test-readfile898.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String readFile(String[] args) throws IOException {
		if(args.length < 3){
			return "fail";
		}
		String dst = args[1];
		String newPath = args[2];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		FSDataInputStream hdfsInStream = fs.open(new Path(dst));
		OutputStream out = new FileOutputStream(newPath);
		byte[] ioBuffer = new byte[1024];
		int readLen = hdfsInStream.read(ioBuffer);
		while (-1 != readLen) {
			out.write(ioBuffer, 0, readLen);
			readLen = hdfsInStream.read(ioBuffer);
		}
		out.close();
		hdfsInStream.close();
		fs.close();
		return "success";
	}
}
/**
	 * 创建文件夹.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar mkdir hdfs://hadoopm:9000/user/root/upload/test909
	 *
	 * @return
	 * @throws IOException
	 */
	public static String mkdir(String[] args) throws IOException{
		if(args.length < 2){
			return "fali";
		}
		String dst = args[1];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		Path path = new Path(dst);
		if (fs.exists(path)) {
			return "fail";
		}
		fs.mkdirs(path);
		return "success";
	}

PS:需要注意的是,我们需要把这个工程利用maven打包成一个可运行的jar包,使用如下命令:

打包命令

打包命令


执行命令在每个方法注释上写明了,执行效果如下:
增删改查效果

增删改查效果


还需要访问 http://hadoopm:50070/ -> Browse the filesystem 查看hdfs文件操作是否真的成功
web hdfs

web hdfs

java实现的map排序

java实现的map排序,直接上代码:

import java.util.Arrays;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
public class TestSort {
	// HashMap里面的元素是无序的,要进行排序的话只能是用TreeMap和SortedMap,例如:
	public static void main(String[] args) throws Exception {
		Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
		map.put(100, 131);
		map.put(0, 0);
		map.put(83, 49);
		map.put(137, 98);
		map.put(33, 651);
		map = mapSortByKey(map);
		System.out.println(map.toString());
	}
	private static SortedMap<Integer, Integer> mapSortByKey(
			Map<Integer, Integer> unsort_map) {
		TreeMap<Integer, Integer> result = new TreeMap<Integer, Integer>();
		Object[] unsort_key = unsort_map.keySet().toArray();
		Arrays.sort(unsort_key);
		for (int i = 0; i < unsort_key.length; i++) {
			System.out.println(unsort_map.get(unsort_key[i]));
			result.put(Integer.parseInt(unsort_key[i].toString()),
					unsort_map.get(unsort_key[i]));
		}
		return result.tailMap(result.firstKey());
	}
}

打印结果:

651
49
131
98
{0=0, 33=651, 83=49, 100=131, 137=98}

Java线程安全

线程安全,那么什么是线程不安全呢?
在单线程运行的情况下,如果 sum = 0,加1后,sum=1一定是对的,但在多线程的情况下,有两个线程同时对sum加1,那么结果可能有两种,一种是sum=1,一种是sum=2;原因就在于sum被定义为全局变量。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
这两篇文章总结的很到位:
http://www.iteye.com/topic/806990
http://www.iteye.com/topic/808550

261个Java基础问题

这是摘自《你必须知道的261个Java语言问题》的书目,大家可以对照着,排查下自己哪些还不熟悉,都是比较基础的问题
第1章 java基本概念及环境配置 .1
faq1.01 什么是面向对象程序设计? 1
faq1.02 面向对象程序设计的基本特征有哪些? 2
faq1.03 java语言是如何产生和发展的? 3
faq1.04 android与java语言有什么关系? 4
faq1.05 java se、java ee和java me有什么区别? 5
faq1.06 java语言的运行机制如何? 6
faq1.07 什么是jvm?有什么作用?工作机制如何? 8
faq1.08 什么是jre(或j2re)? 9
faq1.09 什么是jdk? 10
faq1.10 jdk、jre和jvm之间有什么区别? 11
faq1.11 什么是gc?gc的工作原理如何? 12
faq1.12 如何安装java基本开发环境jdk? 13
faq1.13 为何在jdk安装路径下存在两个jre? 16
faq1.14 jdk安装时设置path和classpath环境变量有何作用? 17
faq1.15 如何编译、运行java应用程序? 18
faq1.16 如何将程序中的文档注释提取出来生成说明文档? 20
faq1.17 怎样制作鼠标双击就可以运行的jar文件? 23
faq1.18 怎样给main(string[] args)方法的args指定参数值? 26
第2章 java编程基础 28
faq2.01 java中的标识符如何命名?可以用中文吗? 28
faq2.02 java中有哪些关键字? 29
faq2.03 用public、protected和private修饰方法有什么区别? 30
faq2.04 this关键字有什么含义?在哪些情况下应用? 31
faq2.05 super关键字有什么含义?在哪些情况下应用? 32
faq2.06 static关键字有什么含义?具体如何应用?能修饰构造方法吗? 34
faq2.07 final关键字有什么含义?具体如何应用? 36
faq2.08 instanceof关键字有什么含义?如何应用? 37
faq2.09 java中有哪些数据类型? 38
faq2.10 如何解决double和float精度不准的问题? 40
faq2.11 int和integer都可以作为整数类型,那么它们有什么区别? 43
faq2.12 float f=3.4语句是否正确? 44
faq2.13 成员变量和局部变量有什么区别? 45
faq2.14 变量之间传值时可分为值传递和引用传递,那么它们有何区别? 46
faq2.15 java中有哪些运算符?优先级如何? 48
faq2.16 在实现x和y相加时,x+=y和x=x+y两种实现方式有区别吗? 50
faq2.17 在执行与运算时,运算符&和&&有什么区别? 50
faq2.18 在实现x递增加1操作时,x++和++x有什么区别? 52
faq2.19 x?y:z格式的语句表示什么意思? 53
faq2.20 “+”操作符在java内部是如何实现字符串连接的? 54
faq2.21 ==和equals()都可用于比较两个操作数是否相等,它们有什么区别吗? 55
faq2.22 创建string对象时,使用string s=new string (“abc”)和string s=“abc”语句有什么区别? 56
faq2.23 break和continue语句有什么区别? 56
faq2.24 数组如何定义和初始化? 57
faq2.25 如何实现一维和二维数组的遍历? 59
faq2.26 如何实现数组的复制? 60
faq2.27 数组的排序算法有哪些?如何实现? 61
faq2.28 如何解决arrayindexoutofbounds exception异常? 64
第3章 java与面向对象 65
faq3.01 什么是类、对象、属性和方法? 65
faq3.02 什么是包?有什么好处? 67
faq3.03 什么是抽象类?有什么好处? 67
faq3.04 什么是接口?有什么好处? 69
faq3.05 什么是多态?有什么好处? 70
faq3.06 什么是内部类?有什么好处? 71
faq3.07 什么是匿名内部类?如何使用? 73
faq3.08 什么是封装类?有什么作用? 74
faq3.09 什么是继承?有什么好处? 75
faq3.10 使用new关键字创建对象时,为什么有时候提示找不到无参的构造方法? 76
faq3.11 抽象类和接口都可以包含抽象方法,那么它们有什么区别?使用时该如何选择? 76
faq3.12 什么是方法重写?为什么需要方法重写? 78
faq3.13 什么是方法重载?为什么需要方法重载? 78
faq3.14 构造方法是否可以被重写?能否被重载? 79
faq3.15 static修饰的方法能否在子类中重写? 80
faq3.16 在定义类时,何时需要重写object类中tostring()方法? 81
faq3.17 在定义类时,何时需要重写object类中equals()方法? 82
faq3.18 为什么在重写equals()方法时,一般都会重写hashcode()方法? 84
faq3.19 如何重写hashcode()方法? 85
faq3.20 java中动态绑定是什么意思? 87
faq3.21 java中是如何实现多态的?实现机制是什么? 88
faq3.22 创建类的对象时,类中各成员的执行顺序是什么样的? 89
faq3.23 什么是初始化块?有什么作用? 90
faq3.24 静态初始化块与非静态初始化块有什么区别? 92
faq3.25 如何调用内部类中的方法? 93
faq3.26 当内部类和外部类的成员名称相同时,如何在内部类中调用外部类的成员? 94
faq3.27 匿名内部类如何访问外部方法的局部变量或参数? 95
faq3.28 java异常处理机制是什么样的? 96
faq3.29 常见的runtimeexception异常有哪些? 97
faq3.30 java中异常处理的方式有哪些? 98
faq3.31 try-catch-finally语句块各部分的执行顺序如何? 100
faq3.32 为什么使用自定义异常?自定义异常如何使用? 101
第4章 java流和文件操作 103
faq4.01 如何获取文件的属性信息? 103
faq4.02 如何判断文件是否为空? 105
faq4.03 如何实现文件的创建、删除和移动? 105
faq4.04 如何创建和删除文件夹? 107
faq4.05 如何遍历目录中所有的文件? 109
faq4.06 如何获取文件夹大小? 110
faq4.07 什么是流?如何分类?具体包含哪些类? 111
faq4.08 如何实现字节流和字符流之间的转化? 113
faq4.09 如何判断要读的文件是否到达末尾? 116
faq4.10 如何读文件、写文件? 117
faq4.11 如何以追加的方式写文件? 118
faq4.12 如何实现文件和文件夹的复制? 119
faq4.13 如何在文件的任意位置进行读写? 121
faq4.14 使用buffered缓冲流写文件,为什么内容没有写入? 122
faq4.15 如何实现文件的分割与合并? 123
faq4.16 什么是nio?与i/o有什么区别和联系? 125
faq4.17 如何使用nio读写文件? 127
faq4.18 什么是字符编码和解码? 129
faq4.19 读写文件时为什么中文字符经常产生乱码? 130
faq4.20 如何解决filereader读文件乱码的问题? 131
faq4.21 为什么datainputstream和dataoutputstream读写文件时乱码? 132
faq4.22 如何实现文件锁定功能? 134
faq4.23 如何实现对文件和字符串加密、解密? 135
faq4.24 如何实现对文件和目录的压缩、解压缩? 139
faq4.25 如何读写properties文件? 143
faq4.26 如何读写xml文件? 146
faq4.27 如何读写xml文件中的元素属性? 151
faq4.28 如何读写csv格式的文件? 152
faq4.29 如何为图片文件生成缩略图? 154
faq4.30 如何操作excel文件? 156
faq4.31 如何操作word文件? 161
第5章 java gui编程 164
faq5.01 什么是java gui?swing与awt有什么关系? 164
faq5.02 什么是布局管理器?常用的布局管理器有哪些? 165
faq5.03 如何在窗体中显示一张图片? 170
faq5.04 如何为容器添加滚动条功能? 171
faq5.05 如何实现一个打开文件或者是存储文件的对话框? 173
faq5.06 如何实现弹出消息框的功能? 175
faq5.07 如何使用dialog对话框? 177
faq5.08 如何为按钮添加单击事件? ..178
faq5.09 如何为窗体添加关闭事件? 181
faq5.10 如何实现窗体菜单功能? 183
faq5.11 如何处理键盘输入事件? 185
faq5.12 如何处理鼠标单击事件?如何区分是左键还是右键? 186
faq5.13 如何实现鼠标右键弹出菜单的功能? 189
faq5.14 如何使用表格组件? 191
faq5.15 如何实现记事本功能? 193
faq5.16 如何实现贪吃蛇游戏? 198
第6章 java线程和序列化 208
faq6.01 线程、进程和程序有何区别和联系? 208
faq6.02 如何创建和启动一个线程? 209
faq6.03 线程的基本状态有哪些?它们之间有何关系? 211
faq6.04 什么是线程优先级?线程依据什么原则调度执行? 212
faq6.05 什么是后台线程?如何创建一个后台线程? 214
faq6.06 如何使正在运行的线程在指定时间内休眠? 216
faq6.07 如何终止一个正在运行的线程? 218
faq6.08 为何stop()和suspend()方法不推荐使用? 219
faq6.09 如何控制线程的暂停和启动? 220
faq6.10 如何实现多个线程同步? 225
faq6.11 什么是对象序列化和对象反序列化? 233
faq6.12 实现对象序列化的方法有哪些? 234
faq6.13 如何实现对象在磁盘中的存取操作? 236
faq6.14 使用objectinputstream读取对象时为什么会发生streamcorruptedexception异常? 238
faq6.15 对象中的成员哪些参与序列化?哪些不参与序列化? 241
faq6.16 如何自定义序列化和反序列化过程? 243
faq6.17 如何使用externalizable接口定制序列化过程? 247
faq6.18 在序列化类中添加serialversionuid属性有什么作用? 250
faq6.19 当序列化遭遇继承时,如何正确处理对象序列化过程? 251
第7章 java网络编程 256
faq7.01 什么是tcp/ip?什么是ip? 256
faq7.02 tcp和udp有什么区别? 258
faq7.03 什么是http?http的工作原理如何? 259
faq7.04 在socket通信时如何获取主机和客户机的ip地址? 261
faq7.05 如何利用socket实现基于tcp的通信? 264
faq7.06 如何利用socket传输中文字符? 265
faq7.07 如何在socket读取数据时使用超时设置? 267
faq7.08 如何利用socket传递对象信息? 268
faq7.09 如何利用socket实现文件传输? 271
faq7.10 如何基于socket实现聊天系统? 274
faq7.11 如何利用socket实现基于udp的通信? 278
faq7.12 如何利用udp socket技术实现ip多点传送? 280
faq7.13 如何获取internet资源的大小? 285
faq7.14 如何实现internet资源的单线程下载? 286
faq7.15 url如何通过proxy代理访问internet资源? 287
faq7.16 如何实现internet资源下载的断点续传? 288
faq7.17 如何实现internet资源的多线程下载? 290
faq7.18 如何解析internet网页内容? 293
第8章 java常用功能 296
faq8.01 如何使字符串中包含“””字符 296
faq8.02 如何实现字符串和整数之间的转化? 297
faq8.03 如何替换字符串中的字符或子字符串? 298
faq8.04 如何过滤字符串前后以及中间出现的空格? 299
faq8.05 如何对字符串中的子字符或子字符串进行截取? 301
faq8.06 如何判断一个字符串是否符合数值格式? 302
faq8.07 如何实现字符串的切割和查找? 303
faq8.08 如何实现十进制和二进制之间的相互转化? 306
faq8.09 如何将字节流转换为指定编码的字符串? 307
faq8.10 如何实现日期格式和字符串之间的转化? 308
faq8.11 string、stringbuffer和stringbuilder有什么区别? 310
faq8.12 如何获得一个随机数? 311
faq8.13 list、set和map是否继承自collection接口?有什么区别? 312
faq8.14 arraylist与linkedlist、vector的区别是什么? 313
faq8.15 hashmap和hashtable有什么区别? 314
faq8.16 如何遍历map和vector集合? 315
faq8.17 如何获取系统当前时间? 317
faq8.18 如何获得系统属性? 318
faq8.19 什么是反射机制?有什么作用? 319
faq8.20 如何读取键盘输入的信息? 322
faq8.21 如何获取当前工程目录? 323
faq8.22 如何使用java调用系统的exe文件? 324
faq8.23 如何使用java执行cmd命令? 325
faq8.24 如何使用java程序打开一个word文档? 326
faq8.25 如何使用md5和sha算法加密信息? 327
第9章 java数据库操作 329
faq9.01 什么是jdbc?有什么作用? 329
faq9.02 java与数据库的连接方式有哪些? 330
faq9.03 如何连接各种类型的数据库? 331
faq9.04 如何实现对数据库数据的查询? 335
faq9.05 如何实现对数据库数据的增加、删除和修改? 336
faq9.06 如何使用preparestatement对数据库操作? 339
faq9.07 statement和preparestatement有什么区别? 340
faq9.08 如何调用数据库中的存储过程? 341
faq9.09 如何通过jdbc-odbc桥访问access数据库? 344
faq9.10 连接oracle数据库时thin和oci方式有什么区别? 346
faq9.11 如何判断resultset结果集为空? 347
faq9.12 如何获取resultset中含有的记录数量? 348
faq9.13 如何获取resultset中n~m位置区间的记录? 350
faq9.14 如何利用resultset更新数据库数据? 351
faq9.15 如何使用like关键字实现模糊查询? 352
faq9.16 如何实现查询的分组统计和排序? 354
faq9.17 如何实现多表联合查询? 355
faq9.18 如何使用jdbc的批处理操作? 357
faq9.19 如何实现oracle字段值递增的功能? 358
faq9.20 如何处理数据表中date类型的字段? 360
faq9.21 如何向表中插入含有特殊字符的信息? 360
faq9.22 如何使用blob类型的字段存取图片? 361
faq9.23 如何使用clob类型的字段存取字符文件? 363
faq9.24 如何通过程序创建和删除数据表? 365
faq9.25 如何获取数据表的结构信息? 367
faq9.26 如何获取数据库中所有表名? 369
faq9.27 如何用程序备份和恢复数据库? 370
faq9.28 什么是事务?如何使用jdbc事务控制? 372
faq9.29 什么是jta?jta事务与jdbc事务有什么区别? 373
faq9.30 如何使用jta实现分布式事务控制? 374
faq9.31 什么是数据库连接池?工作原理如何? 376
faq9.32 如何提升sql语句的查询性能? 377
faq9.33 如何解决mysql数据库插入乱码的问题? 379
第10章 java web程序设计 381
faq10.01 什么是jsp?jsp的工作原理如何? 381
faq10.02 jsp、java和javascript有什么区别和联系? 383
faq10.03 jsp程序开发和运行环境是什么?如何搭建? 383
faq10.04 如何开发一款jsp程序? 387
faq10.05 在jsp中有哪些注释格式?有什么作用? 390
faq10.06 jsp中有哪些内建对象?分别有什么作用? 391
faq10.07 page、request、session和application有什么区别? 395
faq10.08 如何解决request.getparameter()取值乱码问题? 396
faq10.09 jsp中forward和redirect有什么区别? 397
faq10.10 如何在多个jsp页面之间传递信息? 399
faq10.11 如何解决url传递中文时出现乱码的问题? 400
faq10.12 动态include与静态include有什么区别? 401
faq10.13 什么是javabean?如何使用javabean? 402
faq10.14 什么是session?如何使用session? 403
faq10.15 如何在关闭页面时自动清除session? 405
faq10.16 什么是cookie?如何使用cookie? 406
faq10.17 如何在禁用cookie的情况下使用session? 408
faq10.18 如何在jsp中避免表单的重复提交? 409
faq10.19 如何实现jsp数据和javascript数据的交互使用? 411
faq10.20 什么是servlet?servlet与jsp有什么区别? 412
faq10.21 servlet容器的工作原理如何? 413
faq10.22 如何在servlet中使用session和application? 414
faq10.23 如何编写多线程安全的servlet程序? 415
faq10.24 如何在servlet和jsp中获取工程文件的绝对路径? 417
faq10.25 如何获取客户端浏览器和操作系统信息? 417
faq10.26 如何在web程序中实现定时运行的功能? 418
faq10.27 如何实现网站登录记忆跳转的功能? 421
faq10.28 如何将jsp动态页面转换为html静态页面? 423
faq10.29 如何实现数据分页显示的功能? 424
faq10.30 如何将jsp内容以excel或word格式输出? 431
faq10.31 如何在jsp中实现打印功能? 432
faq10.32 如何实现图片验证码功能? 433
faq10.33 如何实现饼状图、柱状图和曲线图? 436
faq10.34 如何实现进度条显示功能? 443
faq10.35 如何实现网站计数器功能? 447
faq10.36 如何发送html格式和带附件的邮件? 448
faq10.37 如何实现文件的上传和下载? 453
faq10.38 如何禁止浏览器缓存页面内容? 457
faq10.39 如何在网页中在线播放音乐和视频? 458
faq10.40 如何处理jsp页面的错误? 460
faq10.41 如何利用过滤器实现权限验证功能? 462
faq10.42 如何实现jsp防盗链功能? …464

Java编写的类QQ聊天系统

这是我09年写的第一个Java程序,一个类QQ聊天软件,当时是为了练习,现在把源码拿出来,当时水平有限,现在也没动力去优化了,希望能对Java初学者有一些帮助!说老实话,好多东西都忘了,但是仍有好多人找我,说要“交作业”和“毕业设计写论文”的,请大家先学好java基础,课本上的基础知识是有的,但是课本上却没告诉我们怎么把这些知识组合起来成为一个软件,这才是做作业、写论文的最大的价值所在,这才也是中国教育目前最大的悲哀。
实现思路:
首先每登录一个用户都会先到主持人这边登记,会记录每个用户的联系方式(这些都是只有主持人知道),然后主持人会通知已经登记的用户又有新用户加入;
李四想和张三说话,就把想说的话告诉主持人,由主持人帮你传话给张三,李四是不知道怎么才能联系到张三,但是主持人有每个用户的联系方式;
私聊是一对一聊,如果群里只有一个两个人,那这个群聊也就是私聊;
一共包含六个类:
Client.java
Clientframe.java
ClientUtil.java
Message.java
Server.java
Usermessage.java
Client.java:

import java.awt.Color;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
/**
 *
 * @author tian QQ客户端
 */
public class Client extends Clientframe {
	Message receivemsg; // 在线用户之间的聊天信息
	Usermessage usermsg; // 用户信息
	Socket s;
	ObjectOutputStream oos;
	String ipaddress; // 服务器IP
	ArrayList al = new ArrayList();
	String cmd;
	boolean flag = false;
	/**
	 * 构造方法
	 */
	public Client() {
		usermsg = new Usermessage();
		try {
			usermsg.ip = InetAddress.getLocalHost().getHostAddress();
		} catch (UnknownHostException e3) {
			e3.printStackTrace();
		}
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//上线时触发,发送用户信息(usermsg)给服务器
		jb1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String ipaddress = jtfname2.getText(); // 得到服务器IP
					try {
						if (flag == false) {
						s = new Socket(ipaddress, 9999);
						oos = new ObjectOutputStream(s.getOutputStream());
						flag = true;
						}
					} catch (UnknownHostException e2) {
						e2.printStackTrace();
					} catch (IOException e2) {
						e2.printStackTrace();
					}
					try {
						usermsg.username = jtfname.getText();
						usermsg.password = jtfpwd.getText();
						usermsg.flag1 = true; // 登陆是设为true
						oos.writeObject(usermsg);
						oos.reset();
					} catch (UnknownHostException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					ClientThread ct = new ClientThread();
					ct.start();
				}
		});
//		  监听用户下线信息
		jfb.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				Usermessage usermsg1 = new Usermessage();
				usermsg1.flag1 = false; // 表明用户下线
				usermsg1.username = usermsg.username;
				usermsg1.password = usermsg.password;
				try {
					usermsg1.ip = InetAddress.getLocalHost().getHostAddress();
				} catch (UnknownHostException e2) {
					e2.printStackTrace();
				}
				// 将用户信息发给服务器说明该客户要下线
				try {
					oos.writeObject(usermsg1);
					System.exit(0);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		});
//		  监听双击在线用户列表事件
		jli.addMouseListener(new MouseListener() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					JList source = (JList) e.getSource();
					Object[] selection = source.getSelectedValues();
					cmd = (String) selection[0];
					String[] ss = cmd.split("\s+");
					jfaa.setTitle("与" + ss[0] + "聊天");
					jfaa.setVisible(true);
				}
			}
			public void mouseEntered(MouseEvent e) {
			}
			public void mouseExited(MouseEvent e) {
			}
			public void mousePressed(MouseEvent e) {
			}
			public void mouseReleased(MouseEvent e) {
			}
		});
		//监听私聊send按钮
		jbaa.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ClientUtil cu = new ClientUtil();
				Message m = new Message();
				m.fromname = usermsg.username;
				m.msg = jtabb.getText();
				String[] ss = cmd.split("\s+");
				m.toname = ss[0];
				m.flag = true;
				try {
					oos.writeObject(m);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				jtabb.setText("");
//				 调用ClientUtil中的dealmessage()方法对信息进行处理
				ArrayList msglist = ClientUtil.dealmessage(m.msg);
				// 调用ClientUtil中的printmsg()将信息显示到面板上
				cu.printmsg(msglist, jtaaa,m);
			}
		});
		 // 监听群聊send按钮
		jba.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Message m = new Message();
				m.fromname = usermsg.username;
				m.msg = textPane1.getText();
				m.toname = "alluser";
				try {
					oos.writeObject(m);
				} catch (IOException e1) {
					// e1.printStackTrace();
				}
				textPane1.setText("");
			}
		});
		// 监听Transportfile按钮,实现文件传输,只能传输小文件
		jbbc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				FileDialog f = new FileDialog(jfaa, "文件传送", FileDialog.LOAD);
				f.setVisible(true);
				String filename = f.getDirectory() + f.getFile();
				File file = new File(filename);
				FileInputStream fis;
				try {
					fis = new FileInputStream(file);
					int len = (int) file.length();
					byte[] data = new byte[len];
					fis.read(data);
					Message m = new Message();
					m.data = new byte[len];
					m.fromname = usermsg.username;
					String[] ss = cmd.split("\s+");
					m.toname = ss[0];
					m.flag = false;
					for (int i = 0; i < data.length; i++) {
						m.data[i] = data[i];
					}
					oos.writeObject(m);
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				} catch (IOException e2) {
					e2.printStackTrace();
				}
			}
		});
		// 监听"群聊"按钮
		jb.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				jfa.setVisible(true);
			}
		});
	}
	 //显示在线用户列表(由服务器传入)
	class ClientThread extends Thread {
		ObjectInputStream ois;
		public void run() {
			ClientUtil cu = new ClientUtil();
			try {
				ois = new ObjectInputStream(s.getInputStream());
				while (true) {
					Object[] o = (Object[]) ois.readObject();
					// 处理“用户名重名”信息
					if (o[0] instanceof String) {
						String s1 = (String) o[0];
						if (s1.equals("用户名重复请重新填写")) {
							jtfname3.setText(s1);
						} else {
							jfb.setTitle(jtfname.getText());
							jfb.setVisible(true);
							jf.setVisible(false);
						}
					}
					// 处理用户信息
					if (o[0] instanceof Usermessage) {
						Usermessage u = (Usermessage) o[0];
						// 处理用户上线信息
						if (u.flag1) {
							dlm.clear();
							for (int i = 0; i < o.length; i++) {
								dlm.addElement(o[i].toString());
							}
						} else {
							// 处理用户下线信息
							for (int i = 0; i < dlm.size(); i++) {
								String s = dlm.get(i).toString();
								String[] ss = s.split("\s+");
								if (ss[0].equals(u.username)) {
									dlm.remove(i);
									break;
								}
							}
						}
					}
					// 处理聊天信息
					if (o[0] instanceof Message) {
						Message u = (Message) o[0];
						// 处理群聊信息
						if (u.toname.equals("alluser")) {
							// 调用ClientUtil中的dealmessage()方法对信息进行处理
							ArrayList msglist = ClientUtil.dealmessage(u.msg);
							// 调用ClientUtil中的printmsg()将信息显示到面板上
							cu.printmsg(msglist, textPane,u);
						}
						// 处理私聊信息
						if (u.toname.equals(usermsg.username)) {
							if (u.flag) {
								jfaa.setVisible(true);
								jfaa.setTitle("与" + u.fromname + "聊天");
//								 调用ClientUtil中的dealmessage()方法对信息进行处理
								ArrayList msglist = ClientUtil.dealmessage(u.msg);
								// 调用ClientUtil中的printmsg()将信息显示到面板上
								cu.printmsg(msglist, jtaaa,u);
								cmd = u.fromname;
							} else {
//								处理接收文件
								FileDialog f = new FileDialog(jfaa,
										"文件接收", FileDialog.SAVE);
								f.setVisible(true);
								String filename = f.getDirectory()
										+ f.getFile();
								FileOutputStream fos = new FileOutputStream(
										filename);
								byte[] buf = u.data;
								fos.write(buf);
								fos.close();
							}
						}
					}
				}
			} catch (IOException e) {
				 e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		Client c = new Client();
	}
}

Clientframe.java:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import sun.awt.image.ToolkitImage;
import sun.reflect.generics.scope.Scope;
/**
 *
 * @author tian
 *
 */
public class Clientframe {
	//	登陆窗口
	JFrame jf;
	JPanel jp1;
	JPanel jp2;
	JLabel jl1;
	JLabel jl2;
	JLabel jl3;
	JLabel jl4;
	JLabel jl5;
	JLabel jl6;
	JLabel jl7;
	Checkbox cb;
	Checkbox cb2;
	Choice ci ;
	ImageIcon im;
	JLabel jl8;
	JTextField jtfname;
	JPasswordField jtfpwd;
	JTextField jtfname2;
	JTextField jtfname3;
	JButton jb1;
	JButton jb2;
//	  群聊窗口
	JFrame jfa;
	JPanel jpa;
	JPanel jp;
	JPanel jpl;
	TextArea jtaa;
	TextArea jtab;
	JButton jba;
	JButton jbb;
	JButton jbc;
	JTextPane textPane;
	JTextPane textPane1;
	ImageIcon iic;
//	  私聊窗口
	JFrame jfaa;
	JPanel jpaa;
	JPanel jpp;
	JPanel jpll;
	JTextPane jtaaa;
	JTextPane jtabb;
	JButton jbaa;
	JButton jbbb;
	JButton jbbc;
	ImageIcon iic2;
//	  上线用户列表
	JFrame jfb;
	JPanel jpan;
	JPanel jpan1;
	DefaultListModel dlm;
	JList jli;
	JButton jb;
	ImageIcon ii;
	ImageIcon iii;
	JLabel jl;
//	群聊表情窗口
	JFrame jfc;
	JPanel jpbq;
	/**
	 *
	 */
	public Clientframe(){
//		初始化群聊表情窗口
		jfc = new JFrame("表情");
		jpbq = new JPanel();
		jfc.add(jpbq, BorderLayout.CENTER);
		jpbq.setLayout(new GridLayout(5,5));
		jfc.add(jpbq);
		URL qqurl = this.getClass().getClassLoader().getResource("Image/qq.jpg");
		jfc.setIconImage(Toolkit.getDefaultToolkit().createImage(qqurl));
		ArrayList al = new ArrayList();
		for (int i = 10; i < 35; i++) {
			URL url = this.getClass().getClassLoader().getResource( "Image/"+i+".gif");
			ImageIcon ii=new ImageIcon(url);
			JLabel jl = new JLabel(ii);
			al.add(jl);
		}
		for (int j = 0; j < al.size(); j++) { 			JLabel jl = (JLabel) al.get(j); 			jl.addMouseListener(new MouseListener(){ 				public void mouseClicked(MouseEvent e) { 					StyledDocument doc = textPane1.getStyledDocument(); 					SimpleAttributeSet attr = new SimpleAttributeSet(); 					StyleConstants.setForeground(attr, Color.red); 					String s = e.getSource().toString(); 					Pattern p = Pattern.compile(".gif"); 					Matcher m = p.matcher(s); 					while(m.find()){ 							int start = m.start(); 							int end = m.end(); 							String subs = s.substring(start-2,end); 							String path = "d:\"+subs; 							textPane1.setCaretPosition(doc.getLength()); // 设置插入位置 							File file = new File(path); 							Icon image = new ImageIcon(file.getAbsoluteFile().toString()); 							textPane1.insertIcon(image); 							try { 								doc.insertString(doc.getLength(), file.getName(), attr); 							} catch (BadLocationException e1) { 								 								e1.printStackTrace(); 							} 						} 				} 				public void mouseEntered(MouseEvent e) { 					 				} 			 				public void mouseExited(MouseEvent e) { 					 				} 				public void mousePressed(MouseEvent e) { 					 				} 				public void mouseReleased(MouseEvent e) { 					 				} 			}); 			jpbq.add(jl); 		} 		 		jfc.setVisible(false); 		jfc.setSize(250,250); 		 //		初始化登陆窗口 		 		jf = new JFrame("QQ用户登陆"); 		jp1 = new JPanel(); 		jp2 = new JPanel(); 		jtfname = new JTextField("",15); 		jtfpwd = new JPasswordField("",15); 		jtfname2 = new JTextField("",15); 		jl1 = new JLabel("QQ账号:"); 		jl2 = new JLabel("QQ密码:"); 		jl3 = new JLabel("ServerIP:"); 		jl4 = new JLabel("申请账号"); 	    jl5 = new JLabel("忘了密码"); 		jl6 = new JLabel("QQ状态:"); 		jl7=new JLabel("动感地带 "); 		cb = new Checkbox("自动登录"); 	    cb2 = new Checkbox("记住密码"); 		ci = new Choice(); 		jb1 = new JButton("登录");         jb2 = new JButton("退出");         URL jmurl =this.getClass().getClassLoader().getResource("Image/jm.jpg");         im = new ImageIcon(jmurl);         jl8=new JLabel(im); 		jf.add(jp1,BorderLayout.CENTER); 		jf.add(jp2,BorderLayout.SOUTH); 		jp1.add(jl8); 		jp1.add(jl1); 		jp1.add(jtfname); 		jp1.add(jl4); 		jp1.add(jl2); 		jp1.add(jtfpwd); 		jp1.add(jl5); 		jp1.add(jl3); 		jp1.add(jtfname2); 		jp1.add(jl7); 		jp1.add(jl6); 		jp1.add(ci); 		jp1.add(cb2); 		jp1.add(cb); 		jp2.add(jb1); 		jp2.add(jb2); 		jf.setBackground(new Color(100, 253, 98)); 		jp1.setBackground(new Color(176, 224, 230 )); 		jp2.setBackground(new Color(127, 255, 212 )); 		ci.add("在线"); 		ci.add("Q我吧"); 		ci.add("忙碌"); 		ci.add("离开"); 		ci.add("静音"); 		ci.add("隐身"); 		jl1.setForeground(Color.BLUE); 		jl2.setForeground(Color.BLUE); 		jl3.setForeground(Color.BLUE); 		jl4.setForeground(Color.BLUE); 		jl5.setForeground(Color.BLUE); 		jl7.setForeground(Color.BLUE); 		jb1.setSize(20, 10); 		jb2.setSize(20, 10);         jf.setSize(333, 250); 		jf.setIconImage(Toolkit.getDefaultToolkit().createImage(qqurl)); 		jf.setLocation(500, 250); 		jf.setResizable(false); 		jf.setVisible(true); 		 		jb2.addActionListener(new ActionListener(){ 			public void actionPerformed(ActionEvent e) { 				System.exit(1); 				 			} 			 		}); 		 //		初始化群聊窗口 		jfa = new JFrame("QQ聊天室"); 		jpa = new JPanel(); 		jp = new JPanel(); 		jpl = new JPanel(); 		dlm = new DefaultListModel(); 		URL iicurl =this.getClass().getClassLoader().getResource("Image/12.gif"); 		iic=new ImageIcon(iicurl); 		textPane = new JTextPane(); 		textPane1 = new JTextPane(); 		textPane.setPreferredSize(new Dimension(360, 200)); 		textPane1.setPreferredSize(new Dimension(360, 100)); 		textPane.setFont(new Font("Serif",Font.BOLD,14)); 		textPane1.setFont(new Font("Serif",Font.BOLD,14)); 		JScrollPane scrollPane = new JScrollPane(textPane); 		JScrollPane scrollPane1 = new JScrollPane(textPane1); 		textPane1.setForeground(Color.red); 		jba = new JButton("发送"); 		jbb = new JButton("清空"); 		jbc = new JButton("表情",iic); 		jbc.setMnemonic(KeyEvent.VK_F);//给“表情”按钮设置快捷键 		jba.setForeground(Color.BLUE); 		jbb.setForeground(Color.BLUE); 		jbc.setForeground(Color.BLUE); 		jfa.add(jpa, BorderLayout.NORTH); 		jfa.add(jp, BorderLayout.CENTER); 		jfa.add(jpl, BorderLayout.SOUTH); 		jfa.setIconImage(Toolkit.getDefaultToolkit().createImage(qqurl)); 		jpa.add(scrollPane); 		jp.add(scrollPane1); 		jpl.add(jba); 		jpl.add(jbc); 		jpl.add(jbb); 		jpa.setBackground(new Color(100, 253, 98)); 		jp.setBackground(new Color(100, 253, 98)); 		jpl.setBackground(new Color(100, 253, 98)); 		jfa.setSize(380, 400); 		jfa.setLocation(500, 150); 		jfa.setResizable(false); 		jfa.setVisible(false); 		jbb.addActionListener(new ActionListener() { 			public void actionPerformed(ActionEvent e) { 				textPane1.setText(""); 			} 		}); 		 		 //		 监听群聊表情按钮 		jbc.addActionListener(new ActionListener() { 			public void actionPerformed(ActionEvent e) { 				jfc.setVisible(true); 				jfc.setLocation(500, 150); 			} 		}); 		 //		初始化私聊窗口 		jfaa = new JFrame("私聊");			 		jpaa = new JPanel();			 		jpp = new JPanel(); 		jpll =new JPanel(); 		URL transcurl =this.getClass().getClassLoader().getResource("Image/trans.gif"); 		iic2 =new ImageIcon(transcurl); 		jtaaa = new JTextPane();	 		jtabb = new JTextPane(); 		jtaaa.setPreferredSize(new Dimension(360, 200)); 		jtabb.setPreferredSize(new Dimension(360, 100)); 		JScrollPane scrollPanea = new JScrollPane(jtaaa); 		JScrollPane scrollPaneb = new JScrollPane(jtabb); 		jtabb.setForeground(Color.red); 		jbaa = new JButton("发送");		 		jbbb = new JButton("清空");		 		jbbc = new JButton("",iic2); 		jbc.setMnemonic(KeyEvent.VK_F); 		jtaaa.setFont(new Font("Serif",Font.BOLD,14)); 		jtabb.setFont(new Font("Serif",Font.BOLD,14)); 	    jbaa.setForeground(Color.BLACK); 		jbbb.setForeground(Color.BLACK); 		jbbc.setForeground(Color.BLACK); 		jfaa.add(jpaa,BorderLayout.NORTH); 		jfaa.add(jpp,BorderLayout.CENTER); 		jfaa.add(jpll,BorderLayout.SOUTH); 		jfaa.setIconImage(Toolkit.getDefaultToolkit().createImage(qqurl)); 		jpaa.add(scrollPanea); 		jpp.add(scrollPaneb); 		jpll.add(jbaa); 		jpll.add(jbbc); 		jpll.add(jbbb); 		jf.setBackground(new Color(100, 253, 98)); 		jpaa.setBackground(new Color(100, 253, 98));		 		jpp.setBackground(new Color(100, 253, 98));		  		jpll.setBackground(new Color(100, 253, 98));		  		jfaa.setSize(380, 400); 		jfaa.setLocation(500, 150); 		jfaa.setResizable(false); 		jfaa.setVisible(false);	 		 	    		jbbb.addActionListener(new ActionListener(){ 			public void actionPerformed(ActionEvent e) { 				jtabb.setText(""); 			} 			 		}); 		 //		初始化上线用户列表 		jfb = new JFrame(); 		jpan = new JPanel(); 		dlm = new DefaultListModel(); 		jli = new JList(dlm); 		jb = new JButton(">>>群聊模式");
		jli.setForeground(Color.BLUE);
		jb.setSize(15, 20);
		jb.setForeground(Color.BLUE);
		jfb.add(jpan);
		jpan.setLayout(new BorderLayout());
		jpan.add(jli, BorderLayout.CENTER);
		jpan.add(jb, BorderLayout.SOUTH);
		jpan.add(jli);
		jfb.setIconImage(Toolkit.getDefaultToolkit().createImage(qqurl));
		jfb.setResizable(false);
		jfb.setLocation(500, 200);
		jfb.setSize(200, 450);
		jfb.setVisible(false);
	}
}

ClientUtil.java:

import java.awt.Color;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class ClientUtil {
	/**
	 * 处理已接收信息,将表情与字符分开
	 */
	public static ArrayList dealmessage(String message) {
		String msg = message;
		// 处理字符串
		ArrayList list = new ArrayList();
		ArrayList substrlist = new ArrayList();
		list.add(0);
		Pattern p = Pattern.compile(".gif");
		Matcher m = p.matcher(msg);
		while (m.find()) {
			int start = m.start() - 2;
			list.add(start);
			start = start + 6;
			if (start > msg.length()) {
				break;
			}
			list.add(start);
		}
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size()-1) {
				int begin = Integer.parseInt(list.get(i).toString());
				int over = Integer.parseInt(list.get(i + 1).toString());
				String subs = msg.substring(begin, over);
				substrlist.add(subs);
			}else{
				String subs = msg.substring(Integer.parseInt(list.get(i).toString()));
				substrlist.add(subs);
			}
		}
		return substrlist;
	}
	/**
	 * 将处理过的信息显示在聊天面板上
	 */
	public void printmsg(ArrayList list,JTextPane tPane,Message u){
		Icon image = null;
		JTextPane textPane = tPane;
		StyledDocument doc = textPane.getStyledDocument();
		SimpleAttributeSet attr = new SimpleAttributeSet();
		StyleConstants.setForeground(attr, Color.red);
		ArrayList msglist = list;
		Pattern p = Pattern.compile(".gif");
		try {
			doc.insertString(doc.getLength(), u.toString() ,
					attr);
		} catch (BadLocationException e1) {
			e1.printStackTrace();
		}
		for (int i = 0; i < msglist.size(); i++) {
			String sub = msglist.get(i).toString();
			Matcher m = p.matcher(sub);
			if(m.find()){
				URL url = this.getClass().getClassLoader().getResource("Image/" + sub);
				textPane.setCaretPosition(doc.getLength()); // 设置插入位置
				image = new ImageIcon(url);
				textPane.insertIcon(image);
			}else{
				try {
					doc.insertString(doc.getLength(), sub ,
							attr);
				} catch (BadLocationException e) {
					e.printStackTrace();
				}
			}
		}
		try {
			doc.insertString(doc.getLength(), "n" ,
					attr);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	}
}

Message.java:

import java.io.Serializable;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
 *
 * @author tian
 *	在线用户之间的聊天信息
 */
public class Message implements Serializable{
	public String fromname;
	public String toname;
	public String msg;
	public boolean flag;
	byte[] data = null;//用于传送文件
	int len;   //信息会随着文件的长度而变化
	public Message(){
	}
	public int getLen() {
		return len;
	}
	public void setLen(int len) {
		this.len = len;
	}
	public String toString() {
		Date today = new Date();
		Locale cnLocale = new Locale("zh", "CN");
		DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, cnLocale);
		return fromname+" 于"+df.format(today)+"说:"+"n";
	}
}

Server.java:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
 *
 * @author tian	QQ服务器端
 *
 */
public class Server {
	JFrame jf = new JFrame("QQ服务器");
	JPanel jp = new JPanel();
	JPanel jp1 = new JPanel();
	JTextArea jta = new JTextArea();
	JTextArea jta1 = new JTextArea();
	JScrollPane jsp = new JScrollPane(jta1);
	JLabel jl = new JLabel("QQ在线列表");
	protected ServerSocket ss;
	DefaultListModel dlm = new DefaultListModel();
	JList jli = new JList(dlm);
	ArrayList uml = new ArrayList();
	HashMap mp = new HashMap();		//存储socket对应的oos
	HashMap mp1 = new HashMap();	//存储用户所对应的socket
//	 初始化服务器
	public Server() {
		jf.add(jp, BorderLayout.NORTH);
		jp.setLayout(new FlowLayout(FlowLayout.LEFT));
		jp.add(jl);
		jf.add(jli, BorderLayout.CENTER);
		jf.add(jsp, BorderLayout.SOUTH);
		jta1.setSize(250, 300);
		jsp.setSize(250, 300);
		jf.setSize(250, 500);
		jf.setLocation(500, 150);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
		try {
			ss = new ServerSocket(9999);
			Thread t = new ServerThread();
			t.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 *
	 * 监听线程
	 *
	 */
	class ServerThread extends Thread {
		public void run() {
			try {
				while (true) {
					Socket sc = ss.accept();
					ObjectOutputStream oos = new ObjectOutputStream(sc
							.getOutputStream());
					mp.put(sc, oos);
					SocketThread st = new SocketThread(sc);
					st.start();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 *
	 * 读线程
	 *
	 */
	class SocketThread extends Thread {
		Socket sc;
		public SocketThread(Socket sc) {
			this.sc = sc;
		}
		public void run() {
			try {
				ObjectInputStream ois = new ObjectInputStream(sc
						.getInputStream());
				while (true) {
					Object m = ois.readObject();
					// 处理用户信息
					if (m instanceof Usermessage) {
						Usermessage u = (Usermessage) m;
						// 如果flag1为true,则是登陆信息
						if (u.flag1 && Server.checkuser(u,uml,mp)) {
							mp1.put(u.username, sc);
							dlm.addElement(sc.getRemoteSocketAddress() + "n");
							uml.add(u);
							Object[] o = uml.toArray();
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o);
							}
						} else if(!u.flag1){
							ois.close();
							ObjectOutputStream oos = (ObjectOutputStream) mp
									.get(sc);
							oos.close();
							sc.close();
							mp.remove(sc);
							for (int i = 0; i < uml.size(); i++) { // 通过for循环可以遍历ArrayList
								Usermessage um = (Usermessage) uml.get(i); // 通过下标输出ArrayList里面的值
								if (um.username.equals(u.username)) {
									uml.remove(i);
									break;
								}
							}
							Object[] o = new Object[1];
							o[0] = u;
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o);
							}
						}
					}
					// 处理聊天信息
					if (m instanceof Message) {
						Message u = (Message) m;
						//处理群聊
						if (u.toname.equals("alluser")) {
							ArrayList al = new ArrayList();
							al.add(u);
							Object[] o1 = al.toArray();
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o1);
							}
						}else{
							//处理私聊和文件传送
							ArrayList al = new ArrayList();
							al.add(u);
							Object[] o1 = al.toArray();
							((ObjectOutputStream) mp.get(mp1.get(u.toname))).writeObject(o1);
						}
					}
				}
			} catch (IOException e1) {
//				e1.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}
	//检测用户名是否重复
	public static boolean checkuser(Usermessage u,ArrayList uml,HashMap mp){
		ArrayList uml1 = uml;
		int i;
		for (i = 0; i < uml1.size(); i++) { // 通过for循环可以遍历ArrayList 			Usermessage um = (Usermessage) uml1.get(i); // 通过下标输出ArrayList里面的值 			if (um.username.equals(u.username)) { 				String s = "用户名重复请重新填写"; 				Object[] o = new Object[1]; 				o[0] = s; 				Iterator it = mp.keySet().iterator(); 				while (it.hasNext()) { 					try { 						Socket sc = (Socket) it.next(); 						((ObjectOutputStream) mp.get(sc)) 								.writeObject(o); 					} catch (IOException e) { 						e.printStackTrace(); 					} 				} 			break;	 			} 		} 		if(i>=uml1.size()){
		String s = "success";
		Object[] o = new Object[1];
		o[0] = s;
		Iterator it = mp.keySet().iterator();
		while (it.hasNext()) {
			try {
				Socket sc = (Socket) it.next();
				((ObjectOutputStream) mp.get(sc))
						.writeObject(o);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return true;
		}else{
			return false;
		}
	}
	public static void main(String[] args) {
		Server s = new Server();
	}
}

Usermessage.java:

import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
/**
 *
 * @author tian
 *	用于传递用户信息
 */
public class Usermessage implements Serializable{
	public String username;		//用户名称
	public String password;		//用户密码
	public String ip;			//用户IP
	public boolean flag1;		//标志用户上线还是下线,为true表示为登陆
	public String ipaddress;	//服务器IP
	public Usermessage(){
	}
	public boolean equals(Usermessage user) {
		boolean flag= false;
		if(ip.equals(user.ip)){
			flag = true;
		}
		return flag;
	}
	public String toString() {
		return username + "  "+ ip;
	}
}

打包好的程序和图片资源下载地址:
http://download.csdn.net/detail/xionglong/1638561
效果:



表情窗口

classloader-类加载器

什么是类加载器呢?
与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。
当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

Java程序员进化为架构师掌握的知识

Java程序员进化为架构师掌握的知识:
一:Java知识
1、进制转换
2、Java基本数据类型
面向对象相关知识
3、类、接口、抽象类
this关键字、static关键字、final关键字
方法的参数传递机制
Java垃圾回收机制
四种内部类的实现方式
方法重写(override)与重载(overload)的联系与区别通过多态实现程序代码的松耦合
Java 异常体系详解(checked exception 与 unchecked exception)
JDK 5.0 新特性(泛型、枚举、可变参数、增强的 for 循环、静态导入等)
Java Annotation(使用系统内置 Annotation、自定义Annotation、Annotation的继承等)
Java多线程机制详解(锁、synchronized关键字、sleep()方法、wait()方法、notify() 、notifyAll()方法的意义与联系)
Java线程池的内部实现
Java定时任务内部实现
Java I/O编程(装饰模式详解)
Java网络编程基础知识(Socket、URL、URLConnection、ServerSocket等)
TCP与 UDP的联系与区别
Java Collection API(Collection、List、Set、Map、ArrayList、LinkedList、 Vector、 HashSet、 TreeSet、 HashMap与TreeMap等)区别,适用场景
常用设计模式(工厂方法模式、观察者模式、策略模式、装饰模式、模板方法模式、命令模式等的原理与应用)
Java NIO详解
java.util.concurrent 并发包的应用(ConcurrentHashMap核心源代码分析、ThreadPoolExecutor、FutureTask、Semaphore、Condition、ReentrantReadWriteLock等接口与类的深度分析)
基于 JDK 1.4 锁的并发机制与基于 JDK 5.0并发包的同步与并发机制的比较与分析
序列化与反序列化
正则表达式的应用
Java动态代理与反射机制
Java代码的执行机制
源代码编译机制
类加载与执行机制
JVM内存管理(内存空间、内存分配、内存回收)
使用 JConsole、JVisualVM及 JMap等查看内存的使用状况
分析程序执行的过程
JVM线程资源同步及交互机制
线程交互机制与状态分析
Java文件操作相关,递归删除,递归读取
JDBC相关知识,步骤,连接操作,数据库连接池(详解 Apache DBCP数据库连接池)
移位操作 (左移n位==乘以2的n次幂) (右移n位==除以2的n次幂)
二、算法
各种排序算法:快速排序、归并排序、插入排序等等
斐波切纳函数
二分查找
全排列
二叉树的遍历
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
字符串反转
前缀树
最大堆,最小堆
Hash算法及HashMap算法
ConcurrentLinkedHashMap(LRU)
BloomFilter
LIRS算法 LIRS的基本思想是对访问的数据块进行分类,一部分为hot数据块,一部分为cold数据块。对于hot数据块我们可以分配90%以上的cache给它们。而对于cold数据块给它们分配10%。
从LIRS算法的描述来看,可以理解为两个LRU队列的组合,利用cold缓冲区来保护Hot缓冲区,提高了进入hot缓冲区的门槛,阻止hot缓冲区频繁地变化。
三、数据库
mysql存储引擎
mysql优化
mysql HA解决方案
sql语句优化
NoSQL相关
四、文件系统
Linux主流文件系统
EXT3与EXT4文件系统
主流分布式文件系统分析与对比
分布式文件系统
五、系统相关
共享内存实现机制
mmap的实现原理与机制
copy on write技术
zero copy技术
六、网络相关
OSI七层网络模型
TCP/IP交互流程
HTTP访问流程
七、大型网站架构
负载均衡技术及其原理
智能DNS解析,原理,实现方案
squid web加速及缓存技术
网页静态化