TCP实例一
文章来源:http://blog.csdn.net/webrobot/article/details/7425078
- package com.nbchina.tcp1;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.Socket;
- public class TcpClinet {
- public static void main(String[] args) throws Exception, IOException {
- Socket s = new Socket("192.168.1.68",10003);
- OutputStream out = s.getOutputStream();
- out.write("Tcp send data...".getBytes());
- s.close();
- }
- }
- package com.nbchina.tcp1;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- //服务端、客户端通讯,服务端守候并显示客户端发来的信息
- public class TcpServer {
- public static void main(String[] args) throws IOException {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10003);
- //通过accept 方法获取连接来的客户端对象
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- //获取客户端发来的数据
- InputStream is = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = is.read(buf);
- System.out.println(new String(buf,0,len));
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- ss.close();//关闭服务端
- }
- }
TCP实例二
- package com.nbchina.tcp2;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- Socket s = new Socket("192.168.1.68",10008);
- OutputStream out = s.getOutputStream();
- out.write("Tcp send data...".getBytes());
- InputStream is = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = is.read(buf);
- System.out.println(new String(buf,0,len));
- s.close();
- }
- }
- package com.nbchina.tcp2;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- //客户端、服务端通讯互相发送消息
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- //通过accept 方法获取连接来的客户端对象
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- //获取客户端发来的数据
- InputStream is = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = is.read(buf);
- System.out.println(new String(buf,0,len));
- OutputStream out = s.getOutputStream();
- out.write("收到客户端发来的信息".getBytes());
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- ss.close();//关闭服务端
- }
- }
TCP实例三
- package com.nbchina.tcp3;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- Socket s = new Socket("192.168.1.2",10008);
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- //BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- String line = null;
- while((line=bufr.readLine())!=null){
- if("over".equals(line)){
- break;
- }
- out.println(line);
- /* bufOut.write(line);
- bufOut.newLine();
- bufOut.flush();*/
- String str = bufIn.readLine();
- System.out.println("server:"+str);
- }
- bufr.close();
- s.close();
- }
- }
- package com.nbchina.tcp3;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- //客户端、服务端通讯互相发送消息
- /*
- * 要求建立一个文本转换服务端
- * 客户端发给服务端文本,服务端将文本转换为大写返回给客户端。
- * 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
- * 分析:
- * 客户端:
- * 既然是操作设备上的数据,可以用io技术,并按照io的操作规则来思考。
- * 源:键盘录入
- * 目的:网络设备,网络输出流。
- * 而且操作的是文本数据,可以选择字符流。
- *
- * 步骤
- * 1、建立服务
- * 2、获取键盘录入
- * 3、将数据发给服务端
- * 4、服务端返回大写数据
- * 5、结束、关闭资源
- *
- * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。
- *
- */
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- //通过accept 方法获取连接来的客户端对象
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- //BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
- //既可以接受字节流又可以接受字符流
- //PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- String line = null;
- while((line=bufIn.readLine())!=null){
- out.println(line.toUpperCase());
- /* bufOut.write(line.toUpperCase());
- bufOut.newLine();
- bufOut.flush();*/
- }
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- ss.close();//关闭服务端
- }
- }
TCP实例四
- package com.nbchina.tcp4;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- //通过tcp复制文本文件。
- //注意使用流结束标志。
- //一般使用流结束标志。也可以自定义标志。
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- Socket s = new Socket("192.168.1.2",10008);
- BufferedReader bufr = new BufferedReader(new FileReader("IPDeom.java"));
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- /* DataOutputStream dos = new DataOutputStream(s.getOutputStream());
- long time = System.currentTimeMillis();
- dos.writeLong(time);*/
- String line = null;
- while((line=bufr.readLine())!=null){
- out.println(line);
- }
- s.shutdownOutput();//一般使用关闭客户端输出流,相当于给流加入一个结束标记
- //dos.writeLong(time);//使用时间戳作为结束标志
- //out.println("over");//输出结束,供服务端判断。否则双方都在等待
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- String str = bufIn.readLine();
- System.out.println("server:"+str);
- bufr.close();
- s.close();
- }
- }
- package com.nbchina.tcp4;
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.FileWriter;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- //(TCP复制文件)
- /*
- *
- */
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- //通过accept 方法获取连接来的客户端对象
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- DataInputStream dis = new DataInputStream(s.getInputStream());
- long l = dis.readLong();
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);
- String line = null;
- while((line=bufIn.readLine())!=null){
- /*if("over".equals(line))
- break;*/
- out.println(line);
- }
- PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
- pw.println("上传成功");
- out.close();
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- ss.close();//关闭服务端
- }
- }
TCP实例五
- package com.nbchina.tcp5;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- //通过tcp复制图片文件。
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- Socket s = new Socket("192.168.1.2",10008);
- FileInputStream fis = new FileInputStream("1.bmp");
- OutputStream out = s.getOutputStream();
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=fis.read(buf))!=-1){
- out.write(buf,0,len);
- }
- s.shutdownOutput();
- InputStream in = s.getInputStream();
- byte[] bufIn = new byte[1024];
- int num = in.read(bufIn);
- System.out.println(new String(bufIn,0,num));
- fis.close();
- s.close();
- }
- }
- package com.nbchina.tcp5;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- /*
- * 单人上传图片
- */
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- //通过accept 方法获取连接来的客户端对象
- Socket s = ss.accept();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- InputStream in = s.getInputStream();
- FileOutputStream fos = new FileOutputStream("server.bmp");
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=in.read(buf))!=-1){
- fos.write(buf,0,len);
- }
- OutputStream out = s.getOutputStream();
- out.write("上传成功".getBytes());
- fos.close();
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- ss.close();//关闭服务端
- }
- }
TCP实例六
- package com.nbchina.tcp6;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- //通过tcp复制图片文件。
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- if(args.length!=1){
- System.out.println("请选择一个jpg格式的图片");
- return;
- }
- File file = new File(args[0]);
- if(!(file.exists()&&file.isFile())){
- System.out.println("该文件有问题,不存在或者不是文件");
- return;
- }
- if(!file.getName().endsWith(".jpg")){
- System.out.println("格式错误");
- return;
- }
- if(file.length()>1024*1024*5){
- System.out.println("文件过大");
- return;
- }
- Socket s = new Socket("192.168.1.2",10008);
- FileInputStream fis = new FileInputStream(file);
- OutputStream out = s.getOutputStream();
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=fis.read(buf))!=-1){
- out.write(buf,0,len);
- }
- s.shutdownOutput();
- InputStream in = s.getInputStream();
- byte[] bufIn = new byte[1024];
- int num = in.read(bufIn);
- System.out.println(new String(bufIn,0,num));
- fis.close();
- s.close();
- }
- }
- package com.nbchina.tcp6;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- /*
- * 并发上传图片
- */
- class PicTread implements Runnable{
- private Socket s;
- PicTread(Socket s){
- this.s=s;
- }
- public void run(){
- int count=1;
- String ip= s.getInetAddress().getHostAddress();
- try{
- System.out.println(ip+"...connected");
- InputStream in = s.getInputStream();
- File file = new File(ip+"("+(count)+")"+".jpg");
- while(file.exists()){
- file = new File(ip+"("+(count)+")"+".jpg");
- }
- FileOutputStream fos = new FileOutputStream(file);
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=in.read(buf))!=-1){
- fos.write(buf,0,len);
- }
- OutputStream out = s.getOutputStream();
- out.write((ip+"上传成功").getBytes());
- fos.close();
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- }catch(Exception e){
- throw new RuntimeException(ip+"上传失败");
- }
- }
- }
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- while(true){
- Socket s = ss.accept();
- new Thread(new PicTread(s)).start();
- }
- //ss.close();//关闭服务端
- }
- }
TCP实例七
- package com.nbchina.tcp7;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- //通过tcp登录
- public class TcpClinet {
- public static void main(String[] args) throws Exception {
- Socket s = new Socket("192.168.1.2",10008);
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- for(int x = 0;x < 3;x++){
- String line = bufr.readLine();
- if(line==null)
- break;
- out.println(line);
- String info = bufIn.readLine();
- System.out.println("info:"+info);
- if(info.contains("欢迎")){
- break;
- }
- }
- bufr.close();
- s.close();
- }
- }
- package com.nbchina.tcp7;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- /*
- *
- */
- class UserTread implements Runnable{
- private Socket s;
- UserTread(Socket s){
- this.s=s;
- }
- public void run(){
- String ip= s.getInetAddress().getHostAddress();
- System.out.println(ip+"...connected");
- try{
- for(int x=0;x<3;x++){
- BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
- String name = bufIn.readLine();
- if(name==null){
- break;
- }
- BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- String line = null;
- boolean flag = false;
- while((line = bufr.readLine())!=null){
- if(line.equals(name)){
- flag = true;
- break;
- }
- }
- if(flag){
- System.out.println(name+"已经登录");
- out.println(name+"欢迎光临");
- break;
- }else{
- System.out.println(name+"尝试登录");
- out.println(name+"不存在");
- }
- }
- s.close();//关闭客户端。服务端关的不是自己。是客户端。
- }catch(Exception e){
- throw new RuntimeException(ip+"登录失败");
- }
- }
- }
- public class TcpServer {
- public static void main(String[] args) throws Exception {
- //建立服务端socket服务,并监听一个端口
- ServerSocket ss = new ServerSocket(10008);
- while(true){
- Socket s = ss.accept();
- new Thread(new UserTread(s)).start();
- }
- //ss.close();//关闭服务端
- }
- }
TCP实例八 ---->服务消息转换
- package com.nbchina.tcp.client;
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.InetAddress;
- import java.net.Socket;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import com.nbchina.tcp.server.Server;
- /**
- * 此类模拟客户端发出更新请求,在运行期间会要求用户输入指令码
- * 举例:输入FDFCF802AAAAAAAAAAAAAAAAAAAAAAAA0000X,详细查看《端口与服务器通讯协议》
- * 此类可以多次运行,从而模拟多个终端 如果输入的指令码错误,服务器将不予解析
- *
- */
- public class Client {
- protected static Logger logger = Logger.getLogger(Server.class.getName());
- static {
- logger.setLevel(Level.ALL); // 查看所有跟踪信息
- }
- public void call() {
- int p = 0;
- DataInputStream in;
- DataOutputStream out;
- Socket socket = null;
- try {
- socket = new Socket(InetAddress.getByName(null), Server.PORT_SERVER);
- /*
- * 确保一个进程关闭Socket后,即使他还未释放端口,同一个主机的其他进程还可以立即重用该端口,
- * 可调用socket.setReuseAddress(true),默认false
- */
- socket.setReuseAddress(true);
- p = socket.getLocalPort(); // 获取本地TCP端口,用于区分不同的客户端
- logger.info("新建客户端连接@" + p);
- in = new DataInputStream(socket.getInputStream());
- out = new DataOutputStream(socket.getOutputStream());
- System.out.print("请输入指令字符串(以回车键结束,以FDFCF8开头):");
- BufferedReader line = new BufferedReader(new InputStreamReader(
- System.in));
- String s = line.readLine();
- // 将字符串转换成字节数组
- for (int ii : s2a(s)) {
- out.write(ii);
- }
- out.flush();
- socket.shutdownOutput(); // 发送指令完毕
- // 接收服务端响应
- StringBuffer sb = new StringBuffer();
- while (true) {
- try {
- int b = in.readUnsignedByte();
- sb.append(Integer.toHexString(b));
- } catch (Exception e) {
- break;
- }
- }
- sb.insert(0, "收到了服务器响应:");
- System.out.println(sb.toString().toUpperCase());
- in.close();
- out.close();
- logger.info("客户端关闭@" + p);
- } catch (IOException e) {
- logger.severe(e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- if (socket != null)
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) {
- new Client().call();
- // int[] b = GportClient.s2a("20EFD23FE");
- // for (int bi : b) {
- // System.out.println(bi);
- // }
- }
- static int[] s2a(String s) {
- if (s == null || "".equals(s)) return new int[0];
- StringBuffer sb = new StringBuffer(s);
- int[] ba = new int[sb.length() / 2 + sb.length() % 2];
- int l = sb.length();
- for (int i = 0, c = 0; i < l; i++, c++) {
- String tmp = "" + sb.charAt(i++);
- if (i < l)
- tmp += sb.charAt(i);
- ba[c] = Integer.parseInt(tmp, 16);
- }
- return ba;
- }
- }
- package com.nbchina.tcp.server;
- import java.io.IOException;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import com.nbchina.tcp.msg.DisconnectMessage;
- import com.nbchina.tcp.msg.Message;
- /**
- * 守护的通信服务器,可以启动和关闭<br>
- * 启动后,服务器运行一个守护线程负责接收终端更新请求,并分配给解析器解析编码 提供通用的socket发送和接收功能
- *
- */
- public class Server extends ServerSocket {
- protected static Logger logger = Logger.getLogger(Server.class.getName());
- static {
- logger.setLevel(Level.ALL); // 查看所有跟踪信息
- }
- public static final int PORT_SERVER = 10000;
- public static final int MSG_MAX_LENGTH = 1024;
- private static Server server;
- public static Server newInstant() {
- if (server == null) {
- try {
- server = new Server();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return server;
- }
- private Server() throws IOException {
- super(PORT_SERVER);
- }
- public void start() {
- try {
- while (true) {
- Socket socket = this.accept();
- logger.info("建立新会话");
- //new Instant(socket).start(); Instant extends Thread修改为 Instant implements Runnable
- new Thread(new Instant(socket)).start();
- }
- } catch (Exception e) {
- logger.severe("服务器启动或接收数据失败:" + e.getMessage());
- } finally {
- try {
- logger.info("关闭服务器");
- super.close();
- } catch (IOException e) {
- logger.severe("服务器关闭失败:" + e.getMessage());
- }
- }
- }
- /**
- * 一个服务器实例,根据目前设计,一个终端的一次会话对应一个实例
- * 单例模式,懒汉
- */
- public static class Instant implements Runnable {
- private Socket socket;
- public Instant(Socket socket) {
- this.socket = socket;
- }
- public Socket getSocket() {
- return socket;
- }
- public void run() {
- logger.info("成功创建一个连接,等待客户端数据");
- Message reponse;
- try {
- reponse = new Receiver(socket).process();
- logger.info("数据处理完成,发送响应");
- Sender sender = new Sender(socket);
- if (reponse != null) {
- sender.send(reponse);
- }
- // 总在最后发送关闭消息
- Message close = new DisconnectMessage();
- sender.send(close);
- logger.info("连接处理完成并关闭");
- } catch (Exception e) {
- InetAddress ad = socket.getInetAddress();
- logger.warning("消息处理发生错误:" + e.getMessage() + "@" + ad.getCanonicalHostName());
- } finally {
- try {
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- public static void main(String[] args) {
- logger.info("开始启动服务器");
- Server.newInstant().start();
- }
- }
- package com.nbchina.tcp.server;
- import java.net.Socket;
- import java.util.logging.Logger;
- import com.nbchina.tcp.dao.StubDao;
- import com.nbchina.tcp.msg.Message;
- import com.nbchina.tcp.msg.ResponseMessage;
- import com.nbchina.tcp.msg.UpdateMessage;
- /**
- * 接收并解析编码
- *
- */
- public class Receiver {
- protected static Logger logger = Logger.getLogger(Receiver.class.getName());
- private Socket socket;
- private StubDao dao;
- public Receiver(Socket socket) {
- this.socket = socket;
- this.dao = new StubDao();
- }
- public Message process() throws Exception {
- UpdateMessage request = new UpdateMessage(socket.getInputStream());
- // 判断是否是处理过的终端
- String id = request.getId();
- if (!dao.hasRegister(id)) {
- // 未处理过的,先注册(注册完以后,也应该查询是否有更新,可能是服务端已经录入了终端的注册信息)
- dao.register(id);
- }
- Message reponse = null;
- if (dao.isUpdated(id)) {
- // 是处理过的,查询更新信息
- reponse = new ResponseMessage(dao.fillMessageDetail(id));
- }
- return reponse;
- }
- }
- package com.nbchina.tcp.server;
- import java.io.DataOutputStream;
- import java.net.Socket;
- import java.util.logging.Logger;
- import com.nbchina.tcp.msg.Message;
- /**
- * 负责发送消息
- */
- public class Sender {
- protected static Logger logger = Logger.getLogger(Sender.class.getName());
- private Socket socket;
- public Sender(Socket socket) {
- this.socket = socket;
- }
- public void send(Message msg) throws Exception {
- DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
- int[] data = msg.getData();
- for (int d : data) {
- dos.write(d);
- }
- dos.flush();
- }
- }
- .....还有其他一些类
网络获取图片、html
- public class HtmlRequest {
- public static void main(String[] args) throws Exception {
- URL url = new URL("http://www.sohu.com/");
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- InputStream inStream = conn.getInputStream();//通过输入流获取html数据
- byte[] data = readInputStream(inStream);//得到html的二进制数据
- String html = new String(data,"utf-8");
- System.out.println(html);
- /* File imageFile = new File("nbchina.htm");
- FileOutputStream outStream = new FileOutputStream(imageFile);
- outStream.write(data);
- outStream.close();*/
- }
- public static byte[] readInputStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len=inStream.read(buffer)) != -1 ){
- outStream.write(buffer, 0, len);
- }
- inStream.close();
- return outStream.toByteArray();
- }
- }
- public class ImageRequest {
- public static void main(String[] args) throws Exception {
- URL url = new URL("http://img04.taobaocdn.com/bao/uploaded/i4/T1hTSvXihAXXbeLMw1_041248.jpg_b.jpg");
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
- byte[] data = readInputStream(inStream);//得到图片的二进制数据
- File imageFile = new File("nbchina.jpg");
- FileOutputStream outStream = new FileOutputStream(imageFile);
- outStream.write(data);
- outStream.close();
- }
- public static byte[] readInputStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len=inStream.read(buffer)) != -1 ){
- outStream.write(buffer, 0, len);
- }
- inStream.close();
- return outStream.toByteArray();
- }
- }
多线程下载
- public class MulThreadDownload {
- public static void main(String[] args) {
- String path = "http://dl_dir.qq.com/qqfile/qq/QQ2011/QQ2011.exe";
- try {
- new MulThreadDownload().download(path, 5);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 从路径中获取文件名称
- * @param path 下载路径
- * @return
- */
- public static String getFilename(String path){
- return path.substring(path.lastIndexOf('/')+1);
- }
- /**
- * 下载文件
- * @param path 下载路径
- * @param threadsize 线程数
- */
- public void download(String path, int threadsize) throws Exception{
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- int filelength = conn.getContentLength();//获取要下载的文件的长度
- String filename = getFilename(path);//从路径中获取文件名称
- File saveFile = new File(filename);
- RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
- accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同
- accessFile.close();
- //计算每条线程下载的数据长度
- int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1;
- for(int threadid=0 ; threadid < threadsize ; threadid++){
- new DownloadThread(url, saveFile, block, threadid).start();
- }
- }
- private final class DownloadThread extends Thread{
- private URL url;
- private File saveFile;
- private int block;//每条线程下载的数据长度
- private int threadid;//线程id
- public DownloadThread(URL url, File saveFile, int block, int threadid) {
- this.url = url;
- this.saveFile = saveFile;
- this.block = block;
- this.threadid = threadid;
- }
- @Override
- public void run() {
- //计算开始位置公式:线程id*每条线程下载的数据长度= ?
- //计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?
- int startposition = threadid * block;
- int endposition = (threadid + 1 ) * block - 1;
- try {
- RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
- accessFile.seek(startposition);//设置从什么位置开始写入数据
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);
- InputStream inStream = conn.getInputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len=inStream.read(buffer)) != -1 ){
- accessFile.write(buffer, 0, len);
- System.out.println("线程id:"+ threadid+ "下载["+len+"]");
- }
- inStream.close();
- accessFile.close();
- System.out.println("线程id:"+ threadid+ "下载完成");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }