Java 服务器多线程处理文件上传
import java.net.*;
class UploadThread implements Runnable //将上传封装到线程里
{
private Socket client;
public UploadThread(Socket s)
{
this.client=s;
}
public void run()
{
String ip = client.getInetAddress().getHostAddress(); //得到 IP地址
try {
BufferedInputStream sin = new BufferedInputStream(client.getInputStream()); //Socket 读取流
File file = new File ("C:\\1.jpg");
BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(file)); // 文件输出流
byte buf[] = new byte[1024];
int len = 0;
System.out.println(ip+"...connecting...");
//开始从网络中读取数据
while((len = sin.read(buf))!=-1)
{
fout.write(buf,0,len);
}
//BufferedOutputStream sout = new BufferedOutputStream(client.getOutputStream());
PrintStream sout = new PrintStream(client.getOutputStream());
sout.write("发送成功".getBytes());
//sout.flush(); //虽然是字节流,但其用的是BufferedOutputStream
fout.close();
sin.close();
sout.close();
}catch(Exception ex)
{
System.out.println("上传文件失败");
}
}
}
public class Server {
public static void main(String args[]) throws Exception
{
ServerSocket server = new ServerSocket(2222);
while(true)
{
Socket client = server.accept();
new Thread(new UploadThread(client)).start();
}
}
}
/*
* 服务器处理多线程问题
*
* 1.因为服务器是要很多人访问的,因此里面一定要用多线程来处理,不然只能一个人一个人的访问,那还叫Y啥服务器
*
* 2,拿上面这个文件上传的例子来说,它将每个连接它的用户封装到线程里面去,把用户要执行的操作定义到 run 方法里面
* 一个用户拿一个线程,拿到线程的就自己去执行,如果有其它用户来的时候,再给新来的用户分配一个新的线程
* 这样就完成了服务器处理多线程的问题
* 3. 在服务器与客户端互传数据时,我们要特别注意的是,防止两个程序造成 死等的状态,一般原因有以下:
*
* 1. 客户端向数据端发送数据时,当发送的是字符时,第次以一行来发送,而服务端在读取的时候,也是以
* 一行来读取,readLine() 而发送的时候往往只是发送换行以行的内容,而不能发换行也发送过去,
* 那么服务端在读取的时候就不读取不到换行 ,那么 readLine() 就不会停止
* 2. 客户端发送数据时,如果处理的是用 字符流 或是缓冲流的话,一定要记得刷新流,不然的话,数据就会发不出来
* 3. 在用IO 读取文件里面的数据然后发送到服务端 时,当家读取文件 while(in.read()) 读取文件结束时,而在
* 服务端的接收程序 while(sin.read())不会接到一个发送完毕的提示,所以会一直等待下去,所以我们在处理这
* 个问题的时候,还要将其发送一个文件读取结束的标志,告诉接收端文件已经读取完结,不要再等待了
* 而socket 里面给我们封装了 shutdownInput shutdownOutput 两个操作,此可以关闭 流,两样也可以起到告诉
* 接收方文件传送完毕的效果
*
*
*
* */
import java.net.*;
import java.io.*;
public class Upload {
public static void main(String args[]) throws Exception
{
Socket client = new Socket("172.16.215.105",2222);
File file = new File("F:\\e.jpg");
BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); //文件读取流
PrintStream sout = new PrintStream(client.getOutputStream(),true); //得到socket 流
byte buf [] = new byte[1024];
int len =0;
while((len=fin.read(buf))!=-1)
{
sout.write(buf,0,len);
System.out.println(len+"...发送中");
}
client.shutdownOutput();
BufferedInputStream sin = new BufferedInputStream(client.getInputStream());
len = sin.read(buf);
System.out.println(len);
System.out.println(new String(buf,0,len));
sin.close();
sout.close();
fin.close();
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。