您的位置:首页 > 其它

Socket 简单实现下载功能

2013-04-28 22:34 274 查看
Service:

package com.litao;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Service extends Thread
{
private final ExecutorService pools;

private final ServerSocket serverSocket;

public Service(int port, int poolSize) throws IOException
{
pools = Executors.newFixedThreadPool(poolSize);
serverSocket = new ServerSocket(port);
}

@Override
public void run()
{
for (;;)
{
try
{
pools.execute(new MyThread(serverSocket.accept()));
}
catch (IOException e)
{
pools.shutdown();
e.printStackTrace();
}
}
}

public static void main(String[] args)
{
try
{
Service service = new Service(5555, 100);
service.start();
}
catch (IOException e)
{
e.printStackTrace();
}

}
}

class MyThread implements Runnable
{
private Socket socket;

public MyThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
StringBuilder sb = new StringBuilder();
File dir = new File("demo");
File[] files = dir.listFiles();

for (File file : files)
{
sb.append(file.getName()).append(",").append(file.length())
.append(";");
}

PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket
.getOutputStream()));

pw.println(sb);
pw.flush();

BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));

int num = Integer.parseInt(br.readLine());

System.out.println(num);

File f = files[num];

BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(f));

BufferedOutputStream bos = new BufferedOutputStream(socket
.getOutputStream());

int len;
while ((len = bis.read()) != -1)
{
bos.write(len);
}
bos.flush();
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}

}
}


Client:

package com.litao;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client
{
public void request() throws Exception
{
Socket socket = new Socket("localhost", 5555);

BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));

String files = br.readLine();

String[] str = files.split(";");
String[] names = new String[str.length];
String[] fileLength = new String[str.length];
for (int i = 0; i < str.length; i++)
{
String[] s = str[i].split(",");
String name = s[0];
names[i] = name;
String fileLen = s[1];
fileLength[i] = fileLen;
System.out.println(i + "," + name + "(" + fileLength + ")");
}

Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
if (num >= 0 && num <= str.length)
{
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket
.getOutputStream()));
pw.println(num);
pw.flush();

BufferedInputStream bis = new BufferedInputStream(socket
.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("demo1/" + names[num]));
int len;
long n = 0;
while ((len = bis.read()) != -1)
{
bos.write(len);
if (++n % 1024 == 0)
{
System.out.println(100 * n / Integer.parseInt(fileLength[num]) +"%");
}
}
System.out.println(100 * n / Integer.parseInt(fileLength[num]) +"%");
bos.flush();
}
else
{
System.out.println("Error");
}

socket.close();
}

public static void main(String[] args)
{
Client client = new Client();
try
{
client.request();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: