package animal;
创新互联是工信部颁发资质IDC服务器商,为用户提供优质的四川主机托管服务
public class Animal {
String name="动物";
public void printInfo(){
System.out.println(name);
}
}
package animal;
public class Bird extends Animal{
String name="bird";
@Override
public void printInfo(){
System.out.println("我是:"+name);
}
}
package animal;
public class Fish extends Animal{
String name="fish";
@Override
public void printInfo(){
System.out.println("我是:"+name);
}
}
package animal;
public class Test {
public static void main(String[] args) {
Animal bird=new Bird();
bird.printInfo();
Animal fish=new Fish();
fish.printInfo();
}
}
[1] MainThread类为服务端程序,运行过程中会生成SubThread线程去与客户端程序通讯
[2] Client类为客户端程序,让用户输入数据与服务端程序进行通讯
[3] 具体解释如下
[4] 已测试通过,笑纳^
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* [1]创建7777端口,循环等待客户端连接br
* [2]如果有客户端连接,生成一个socket对象,并生成一个子线程去处理接数据通讯br
*/
public class MainThread {
public MainThread() {
try {
ServerSocket ss = new ServerSocket(7777);// 以创建7777端口
System.out.println("服务器启动");
while (true) {
Socket socket = ss.accept();// 等待数据,如果没有数据会一直等待
new SubThread(socket).start();// 新建一个线程,将socket为参数传递过去,并启动此新线程
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 服务端程序入口
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 创建MainThread类,实际上是调用MainThread类的构造函数
new MainThread();
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* [1]由服务端主线程创建,用于与客户端数据通讯br
* [2]如果客户端发来的数据是以byebye开头的数据,则结束线程,否则将所收到的数据直接发送会给客户端br
*/
public class SubThread extends Thread {
byte[] buffer = new byte[256];// 数据缓冲区
private InputStream is;// 输入流
private OutputStream os;// 输出流
Socket socket;// socket套接字
public SubThread(Socket s) {
// 由MainThread类调用此函数
this.socket = s;// 接收socket参数
}
public void run() {
try {
is = socket.getInputStream();// 从socket中取得输入流
os = socket.getOutputStream();// 从socket中取得输出流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (true) {
try {
int i = is.read(buffer);// 读取缓冲区的数据
String str = new String(buffer, 0, i);// 复制所读到的数据,保存为一个String
System.out.println("recieved:" + str);
if (str.startsWith("byebye"))
break;// 如果接收到的数据以"byebye"开头,就退出while循环,也就是退出线程
os.write(str.getBytes());// 如果是其他字符开头,则将数据直接回复给对方
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* [1]连接服务端程序,也就是localhost的7777端口 br
* [2]接收用户输入数据,并发送给服务端 br
* [3]等待服务端返回数据br
* [4]输出服务端返回的数据br
*
* @author lenovo
*
*/
public class Client {
public Client() {
byte[] buffer = new byte[256];
try {
Socket socket = new Socket("localhost", 7777);// 连接localhost主机(就是本台电脑)的7777端口,生成socket对象
InputStream is = socket.getInputStream();// 从socket中取得输入流
OutputStream os = socket.getOutputStream();// 从socket中取得输出流
while (true) {
System.out.println("输入:");// 提示用户输入数据
int i = System.in.read(buffer);// 接收用户输入的数据
String str = new String(buffer, 0, i);// 复制用户输入的数据保存为一个String
os.write(str.getBytes());// 交数据发送到本机的7777端口
i = is.read(buffer);// 等待对方的返回
str = new String(buffer, 0, i);// 复制对方返回的数据保存为String
System.out.println("recieved:" + str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 客户端程序入口
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 新建Client类,实际是调用Client类的构造函数
new Client();
}
}
Zip.java
import java.io.*;
import java.util.zip.*;
public class Zip {
static final int BUFFER = 2048; // 定义缓冲区大小
public static void main (Stringargv[]) {
try {
BufferedInputStream origin= null; // 创建带有缓冲区的inputstrream
FileOutputStream dest = new
FileOutputStream("c:\\zip\\myfigs.zip"); // 创建文件输出流,并打开zip文件 CheckedOutputStream checksum = new
CheckedOutputStream(dest,new Adler32()); // 创建过滤流,并验证数据的完整性
ZipOutputStream out = new
ZipOutputStream(new
BufferedOutputStream(checksum)); // 创建压缩文件输出流,并传入参数
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = newbyte[BUFFER]; // 创建字节数组
// get a list of files fromcurrent directory
File f = newFile("."); // 创建File变量读取根目录用于文件的读写
String files[] = f.list(); // 读取f文件夹下所有的文件名
for (int i=0; i files.length; i++) { // 根据文件名的数量进行循环
System.out.println("Adding: "+files[i]); // 打印出添加的文件名到控制台
FileInputStream fi = new
FileInputStream(files[i]); // 创建文件读取流,读取当前循环到的文件
origin = new
BufferedInputStream(fi, BUFFER); // 把文件流放入带有缓冲区的inputstream,并指定缓冲区大小
ZipEntry entry = newZipEntry(files[i]); // 创建zip压缩入口实例化,放入当前循环到的文件
out.putNextEntry(entry); // 输出流中放入压缩的文件
int count;
while((count =origin.read(data, 0,
BUFFER)) != -1) {// 当count值等于缓冲区读取的数据字节大小,且不等于-1
out.write(data, 0,count); // 输出流写入count字节大小的数据
}
origin.close();// 关闭带有缓冲区的inputstream
}
out.close(); // 关闭输出流
System.out.println("checksum:
"+checksum.getChecksum().getValue()); // 打印验证压缩文件的值到控制台
} catch(Exception e) { // 捕捉异常
e.printStackTrace(); // 打印异常信息
}
}
}