【小程序】使用TCP+多线程+I/O技术完成客户端自动从服务端下载图片

该程序复制到开发工具中即可调试或使用

================服务端==================

/* * 小程序:编写一个程序可以给多个客户端发送图片(多线程); * 图片下载服务端 */

package com.lin.michael;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.HashSet;

public class DownloadServer extends Thread{

Socket socket;

//使用HashSet存储ip地址

static HashSetips = new HashSet();

public DownloadServer(Socket socket){

this.socket = socket;

}

@Override

public void run() {

try {

//3.从socket获取输入流对象(输出通道,给客户端发送信息);

OutputStream outputStream = socket.getOutputStream();

//4.获取图片的输入字节流对象

FileInputStream fileInputStream = new FileInputStream("c:\\DSC_0303.jpg");

//5.读取图片数据,把数据写出

byte[] buf = new byte[1024];

int length = 0;

while((length=fileInputStream.read(buf))!=-1){

outputStream.write(buf,0,length);

}

//获取客户端的饿IP地址

String ip = socket.getInetAddress().getHostAddress();

if(ips.add(ip)){

System.out.println("恭喜"+ip+"成功下载,当前成功下载的人数" + ips.size() + "个");

}

//6.关闭资源

fileInputStream.close();

socket.close();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) throws IOException{

//1.建立服务端的tcp服务

ServerSocket serverSocket = new ServerSocket(9090);

while(true){

//2.接受用户的连接,获取Socket对象;

Socket socket = serverSocket.accept();

new DownloadServer(socket).start();

}

}

}

================客户端===================

/*

* 下载客户端;

*/

package com.lin.michael;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

public class DownloadClient {

public static void main(String[] args) throws UnknownHostException, IOException{

//1.建立tcp的Socket

Socket socket = new Socket(InetAddress.getLocalHost(), 9090);

//2.从socket获取输入流对象

InputStream inputStream = socket.getInputStream();

//3.穿件文件的输出字节流通道

FileOutputStream fileOutputStream = new FileOutputStream("e:\\copy.jpg");

//4.边读编写出

byte[] buf = new byte[1024];

int length = 0;

while((length=inputStream.read(buf))!=-1){

fileOutputStream.write(buf, 0, length);

}

//5.关闭资源

fileOutputStream.close();

socket.close();

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,143评论 2 95
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 4,005评论 2 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,872评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,449评论 0 6
  • 1997年大概是香港回归后的第二周,六叔收到了阿莲写的一封信。名为《我不是你的明天》 我不是你的明...
    九步红尘阅读 758评论 0 1