服务器:
public class TCPServer {
public static void main(String[] args) {
ServerSocket server= null;
try {
server = new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
/**让服务器一直处于监听状态
* */
while (true) {
/**使用多线程来提高程序效率
* 当有一个客户端上传文件的时候就创建一个线程来处理
* */
ServerSocket finalServer = server;
new Thread(() -> {
Socket socket=null;
OutputStream os=null;
FileOutputStream fos=null;
try {
socket= finalServer.accept();
InputStream is=socket.getInputStream();
File file=new File("E:\\service");
/**判断是否存在目标文件夹
* */
if(!file.exists()){
file.mkdirs();
}
fos=new FileOutputStream(file+"\\1.txt");
int len=0;
byte[] bytes=new byte[1024];
while ((len=is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
os= socket.getOutputStream();
os.write("上传成功".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if(socket!=null&&fos!=null&&os!=null){
try {
fos.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
注意:由于使用new Thread(() -> {})的方式来实现多线程,匿名内部类中重写的是接口中的public abstract void run();函数,而该函数没有抛出异常所以需要使用try…catch捕获。这里不需要释放ServerSocket资源