接上篇内容,继续总结,直接修改上述案例
1.文件上传客户端
package fileInternet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class pushPhoto {
public static void main(String[] args) throws IOException {
//1.创建客户端对象,指定服务端IP和端口
Socket socket = new Socket("127.0.0.1", 6666);
//2.获取网络输出流,发送数据
OutputStream outputStream = socket.getOutputStream();
//3.上传图片,发送给服务端
FileInputStream fileInputStream = new FileInputStream("TcpSocketTest/file/栩.jpg");
byte[] bt = new byte[1024];
int flag;
while ((flag=fileInputStream.read(bt))!=-1){
//发送图片给服务端
outputStream.write(bt,0,flag);
}
System.out.println("文件上送完毕......");
//4.发送完毕内容后,要告知对方(要不对方在一直等待中...)
socket.shutdownOutput();
//5.获取网络输入流,接收对方返回信息
InputStream inputStream = socket.getInputStream();
while ((flag = inputStream.read(bt)) != -1) {
//打印对方回复的消息
System.out.println(new String(bt, 0, flag));
}
//6.释放资源
fileInputStream.close();//本地
socket.close();//网络
}
}
2.文件上传服务端
package fileInternet;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class pullPhoto {
public static void main(String[] args) throws IOException {
//1.定义服务端信息
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务端已启动..." + serverSocket);
//让服务器一直服务
while (true) {
//2.等待客户端连接,accept一直阻塞到这里等待被访问
Socket socket = serverSocket.accept();
//3.获取网络输入流,获取客户端发来的信息
InputStream inputStream = socket.getInputStream();
long date = System.currentTimeMillis();
//创建一个输出流,用于接收数据
FileOutputStream fileOutputStream = new FileOutputStream("TcpSocketTest/file/栩"+date+".jpg");
byte[] bt = new byte[1024];
int flag;
while ((flag = inputStream.read(bt)) != -1) {
//打印客户端发来的信息
fileOutputStream.write(bt,0,flag);
}
//4.获取网络输出流,回信息给我客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write("已收到文件...".getBytes());
//5.告知客户端发送完毕了
socket.shutdownOutput();
//释放资源,但是不能释放serverSocket,以为服务端要一直启动保持服务。
fileOutputStream.close();
socket.close();
}
}
}
运行结果:
正常收到上传的文件!!
优化服务端的处理,目前是服务端只能一个个处理发过来的文件。
利用线程池,将任务放进线程中启动,增加服务端的吞吐量
优化后的服务端代码:
package fileInternet;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolPushPhoto {
public static void main(String[] args) throws IOException {
ExecutorService threadPool = Executors.newFixedThreadPool(100);
//1.定义服务端信息
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务端已启动..." + serverSocket);
while (true){
Socket socket = serverSocket.accept();
//服务器等待被访问......
System.out.println("服务器等待被访问..." + socket);
//创建任务
MyPullPhoto task = new MyPullPhoto(socket);
//将任务提交到线程池中
threadPool.submit(task);
}
}
}
package fileInternet;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyPullPhoto implements Runnable {
Socket socket;
public MyPullPhoto(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
FileOutputStream fileOutputStream = null;
try {
//3.获取网络输入流,获取客户端发来的信息
InputStream inputStream = socket.getInputStream();
long date = System.currentTimeMillis();
//创建一个输出流,用于接收数据
fileOutputStream = new FileOutputStream("TcpSocketTest/file/栩" + date + ".jpg");
byte[] bt = new byte[1024];
int flag;
while ((flag = inputStream.read(bt)) != -1) {
//打印客户端发来的信息
fileOutputStream.write(bt, 0, flag);
}
//4.获取网络输出流,回信息给我客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write("已收到文件...".getBytes());
//5.告知客户端发送完毕了
socket.shutdownOutput();
//释放资源,但是不能释放serverSocket,服务端要一直启动保持服务。
} catch (IOException e) {
System.out.println("e = " + e.toString());
} finally {
try {
if (fileOutputStream != null)
fileOutputStream.close();
} catch (IOException e) {
System.out.println("关闭输入流异常: " + e.toString());
}
try {
socket.close();
} catch (IOException e) {
System.out.println("关闭socket异常:" + e);
}
}
}
}
完结!!!!
如对您有帮助,请点赞收藏,谢谢!!!!