题目
想要服务器不停止,能接收很多客户上传的图片?
解决方案
可以使用循环或者多线程
但是循环不合理,最优解法是(循环+多线程)改写
代码实战
客户端代码
package comion">.heimaion">;
import javaion">.ioion">.*ion">;
import javaion">.netion">.Socketion">;
public class Client ion">{
public static void ion">mainion">(Stringion">[ion">] argsion">) throws IOException ion">{
Socket socket = new Socketion">("127.0.0.1"ion">,10000ion">)ion">;
//读取本地文件中的数据,并写到服务器中
BufferedInputStream bis = new BufferedInputStreamion">(new FileInputStreamion">("G:\\wjkwk\\clientdir\\123.jpg"ion">)ion">)ion">;
BufferedOutputStream bos = new BufferedOutputStreamion">(socketion">.ion">getOutputStreamion">(ion">)ion">)ion">;
byteion">[ion">] bytes = new byteion">[1024ion">]ion">;
int lenion">;
while ion">(ion">(len = bision">.ion">readion">(bytesion">)ion">) != -1ion">)ion">{
bosion">.ion">writeion">(bytesion">,0ion">,lenion">)ion">;
ion">}
//往服务器写结束标记
socketion">.ion">shutdownOutpution">(ion">)ion">;
//接收服务器返回的数据
BufferedReader br = new BufferedReaderion">(new InputStreamReaderion">(socketion">.ion">getInputStreamion">(ion">)ion">)ion">)ion">;
String line = brion">.ion">readLineion">(ion">)ion">;
Systemion">.oution">.ion">printlnion">(lineion">)ion">;
socketion">.ion">closeion">(ion">)ion">;
ion">}
ion">}
服务端代码
package comion">.heimaion">;
import javaion">.ioion">.*ion">;
import javaion">.netion">.ServerSocketion">;
import javaion">.netion">.Socketion">;
public class Server ion">{
public static void ion">mainion">(Stringion">[ion">] argsion">) throws IOException ion">{
ServerSocket serverSocket = new ServerSocketion">(10000ion">)ion">;
while ion">(trueion">)ion">{
//等待客户端来连接
Socket socket = serverSocketion">.ion">acception">(ion">)ion">;
//开启一个线程
//一个用户就对应服务端的一条线程
new Threadion">(new MyRunnableion">(socketion">)ion">)ion">.ion">startion">(ion">)ion">;
ion">}
ion">}
ion">}
package comion">.heimaion">;
import javaion">.ioion">.*ion">;
import javaion">.netion">.Socketion">;
import javaion">.utilion">.UUIDion">;
public class MyRunnable implements Runnable ion">{
Socket socketion">;
public MyRunnableion">(Socket socketion">)ion">{
thision">.socket = socketion">;
ion">}
ion punctuation">@Override
public void ion">runion">(ion">) ion">{
try ion">{
//读取客户端上传的文件并保存到本地
BufferedInputStream bis = new BufferedInputStreamion">(socketion">.ion">getInputStreamion">(ion">)ion">)ion">;
String name = UUIDion">.ion">randomUUIDion">(ion">)ion">.ion">toStringion">(ion">)ion">.ion">replaceion">("-"ion">, ""ion">)ion">;
BufferedOutputStream bos = new BufferedOutputStreamion">(new FileOutputStreamion">("G:\\wjkwk\\serverdir\\"+name+".jpg"ion">)ion">)ion">;
int lenion">;
byteion">[ion">] bytes = new byteion">[1024ion">]ion">;
while ion">(ion">(len = bision">.ion">readion">(bytesion">)ion">) != -1ion">)ion">{
bosion">.ion">writeion">(bytesion">,0ion">,lenion">)ion">;
ion">}
//回写数据
BufferedWriter bw = new BufferedWriterion">(new OutputStreamWriterion">(socketion">.ion">getOutputStreamion">(ion">)ion">)ion">)ion">;
bwion">.ion">writeion">("上传成功"ion">)ion">;
bwion">.ion">newLineion">(ion">)ion">;
bwion">.ion">flushion">(ion">)ion">;
ion">} catch ion">(IOException eion">) ion">{
eion">.ion">printStackTraceion">(ion">)ion">;
ion">} finally ion">{
//释放资源
try ion">{
socketion">.ion">closeion">(ion">)ion">;
ion">} catch ion">(IOException eion">) ion">{
eion">.ion">printStackTraceion">(ion">)ion">;
ion">}
ion">}
ion">}
ion">}
运行结果
ionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box">