練習(xí)四:文件名重復(fù)
public class UUIDTest { public static void main(String[] args) { String str = UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } ```
public class Client {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//1. 創(chuàng)建Socket對(duì)象,并連接服務(wù)器
? ? ? ?Socket socket = new Socket("127.0.0.1",10000);
?
? ? ? ?//2.讀取本地文件中的數(shù)據(jù),并寫到服務(wù)器當(dāng)中
? ? ? ?BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
? ? ? ?byte[] bytes = new byte[1024];
? ? ? ?int len;
? ? ? ?while ((len = bis.read(bytes)) != -1){
? ? ? ? ? ?bos.write(bytes,0,len);
? ? ? }
?
? ? ? ?//往服務(wù)器寫出結(jié)束標(biāo)記
? ? ? ?socket.shutdownOutput();
?
?
? ? ? ?//3.接收服務(wù)器的回寫數(shù)據(jù)
? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ?String line = br.readLine();
? ? ? ?System.out.println(line);
?
?
? ? ? ?//4.釋放資源
? ? ? ?socket.close();
?
? }
}
public class Server {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//1.創(chuàng)建對(duì)象并綁定端口
? ? ? ?ServerSocket ss = new ServerSocket(10000);
?
? ? ? ?//2.等待客戶端來連接
? ? ? ?Socket socket = ss.accept();
?
? ? ? ?//3.讀取數(shù)據(jù)并保存到本地文件中
? ? ? ?BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
? ? ? ?String name = UUID.randomUUID().toString().replace("-", "");
? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
? ? ? ?int len;
? ? ? ?byte[] bytes = new byte[1024];
? ? ? ?while ((len = bis.read(bytes)) != -1) {
? ? ? ? ? ?bos.write(bytes, 0, len);
? ? ? }
? ? ? ?bos.close();
? ? ? ?//4.回寫數(shù)據(jù)
? ? ? ?BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
? ? ? ?bw.write("上傳成功");
? ? ? ?bw.newLine();
? ? ? ?bw.flush();
?
? ? ? ?//5.釋放資源
? ? ? ?socket.close();
? ? ? ?ss.close();
? }
}
練習(xí)五:服務(wù)器改寫為多線程
服務(wù)器只能處理一個(gè)客戶端請(qǐng)求,接收完一個(gè)圖片之后,服務(wù)器就關(guān)閉了。
優(yōu)化方案一:
使用循環(huán)
弊端:
第一個(gè)用戶正在上傳數(shù)據(jù),第二個(gè)用戶就來訪問了,此時(shí)第二個(gè)用戶是無法成功上傳的。
所以,使用多線程改進(jìn)
優(yōu)化方案二:文章來源:http://www.zghlxwxcb.cn/news/detail-725124.html
每來一個(gè)用戶,就開啟多線程處理文章來源地址http://www.zghlxwxcb.cn/news/detail-725124.html
public class Client {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//1. 創(chuàng)建Socket對(duì)象,并連接服務(wù)器
? ? ? ?Socket socket = new Socket("127.0.0.1",10000);
?
? ? ? ?//2.讀取本地文件中的數(shù)據(jù),并寫到服務(wù)器當(dāng)中
? ? ? ?BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
? ? ? ?byte[] bytes = new byte[1024];
? ? ? ?int len;
? ? ? ?while ((len = bis.read(bytes)) != -1){
? ? ? ? ? ?bos.write(bytes,0,len);
? ? ? }
?
? ? ? ?//往服務(wù)器寫出結(jié)束標(biāo)記
? ? ? ?socket.shutdownOutput();
?
?
? ? ? ?//3.接收服務(wù)器的回寫數(shù)據(jù)
? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ?String line = br.readLine();
? ? ? ?System.out.println(line);
?
?
? ? ? ?//4.釋放資源
? ? ? ?socket.close();
?
? }
}
public class Server {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//1.創(chuàng)建對(duì)象并綁定端口
? ? ? ?ServerSocket ss = new ServerSocket(10000);
?
? ? ? ?while (true) {
? ? ? ? ? ?//2.等待客戶端來連接
? ? ? ? ? ?Socket socket = ss.accept();
?
? ? ? ? ? ?//開啟一條線程
? ? ? ? ? ?//一個(gè)用戶就對(duì)應(yīng)服務(wù)端的一條線程
? ? ? ? ? ?new Thread(new MyRunnable(socket)).start();
? ? ? }
?
? }
}
?
?
public class MyRunnable implements Runnable{
?
? ?Socket socket;
?
? ?public MyRunnable(Socket socket){
? ? ? ?this.socket = socket;
? }
?
? ?@Override
? ?public void run() {
? ? ? ?try {
? ? ? ? ? ?//3.讀取數(shù)據(jù)并保存到本地文件中
? ? ? ? ? ?BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
? ? ? ? ? ?String name = UUID.randomUUID().toString().replace("-", "");
? ? ? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
? ? ? ? ? ?int len;
? ? ? ? ? ?byte[] bytes = new byte[1024];
? ? ? ? ? ?while ((len = bis.read(bytes)) != -1) {
? ? ? ? ? ? ? ?bos.write(bytes, 0, len);
? ? ? ? ? }
? ? ? ? ? ?bos.close();
? ? ? ? ? ?//4.回寫數(shù)據(jù)
? ? ? ? ? ?BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
? ? ? ? ? ?bw.write("上傳成功");
? ? ? ? ? ?bw.newLine();
? ? ? ? ? ?bw.flush();
? ? ? } catch (IOException e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? } finally {
? ? ? ? ? ?//5.釋放資源
? ? ? ? ? if(socket != null){
? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }
? }
}
練習(xí)六:線程池改進(jìn)
public class Client {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//1. 創(chuàng)建Socket對(duì)象,并連接服務(wù)器
? ? ? ?Socket socket = new Socket("127.0.0.1",10000);
?
? ? ? ?//2.讀取本地文件中的數(shù)據(jù),并寫到服務(wù)器當(dāng)中
? ? ? ?BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
? ? ? ?byte[] bytes = new byte[1024];
? ? ? ?int len;
? ? ? ?while ((len = bis.read(bytes)) != -1){
? ? ? ? ? ?bos.write(bytes,0,len);
? ? ? }
?
? ? ? ?//往服務(wù)器寫出結(jié)束標(biāo)記
? ? ? ?socket.shutdownOutput();
?
?
? ? ? ?//3.接收服務(wù)器的回寫數(shù)據(jù)
? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ?String line = br.readLine();
? ? ? ?System.out.println(line);
?
?
? ? ? ?//4.釋放資源
? ? ? ?socket.close();
?
? }
}
public class Server {
? ?public static void main(String[] args) throws IOException {
? ? ? ?//客戶端:將本地文件上傳到服務(wù)器。接收服務(wù)器的反饋。
? ? ? ?//服務(wù)器:接收客戶端上傳的文件,上傳完畢之后給出反饋。
?
?
? ? ? ?//創(chuàng)建線程池對(duì)象
? ? ? ?ThreadPoolExecutor pool = new ThreadPoolExecutor(
? ? ? ? ? ? ? ?3,//核心線程數(shù)量
? ? ? ? ? ? ? ?16,//線程池總大小
? ? ? ? ? ? ? ?60,//空閑時(shí)間
? ? ? ? ? ? ? ?TimeUnit.SECONDS,//空閑時(shí)間(單位)
? ? ? ? ? ? ? ?new ArrayBlockingQueue<>(2),//隊(duì)列
? ? ? ? ? ? ? ?Executors.defaultThreadFactory(),//線程工廠,讓線程池如何創(chuàng)建線程對(duì)象
? ? ? ? ? ? ? ?new ThreadPoolExecutor.AbortPolicy()//阻塞隊(duì)列
? ? ? );
?
?
?
? ? ? ?//1.創(chuàng)建對(duì)象并綁定端口
? ? ? ?ServerSocket ss = new ServerSocket(10000);
?
? ? ? ?while (true) {
? ? ? ? ? ?//2.等待客戶端來連接
? ? ? ? ? ?Socket socket = ss.accept();
?
? ? ? ? ? ?//開啟一條線程
? ? ? ? ? ?//一個(gè)用戶就對(duì)應(yīng)服務(wù)端的一條線程
? ? ? ? ? ?//new Thread(new MyRunnable(socket)).start();
? ? ? ? ? ?pool.submit(new MyRunnable(socket));
? ? ? }
?
? }
}
public class MyRunnable implements Runnable{
?
? ?Socket socket;
?
? ?public MyRunnable(Socket socket){
? ? ? ?this.socket = socket;
? }
?
? ?@Override
? ?public void run() {
? ? ? ?try {
? ? ? ? ? ?//3.讀取數(shù)據(jù)并保存到本地文件中
? ? ? ? ? ?BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
? ? ? ? ? ?String name = UUID.randomUUID().toString().replace("-", "");
? ? ? ? ? ?BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
? ? ? ? ? ?int len;
? ? ? ? ? ?byte[] bytes = new byte[1024];
? ? ? ? ? ?while ((len = bis.read(bytes)) != -1) {
? ? ? ? ? ? ? ?bos.write(bytes, 0, len);
? ? ? ? ? }
? ? ? ? ? ?bos.close();
? ? ? ? ? ?//4.回寫數(shù)據(jù)
? ? ? ? ? ?BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
? ? ? ? ? ?bw.write("上傳成功");
? ? ? ? ? ?bw.newLine();
? ? ? ? ? ?bw.flush();
? ? ? } catch (IOException e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? } finally {
? ? ? ? ? ?//5.釋放資源
? ? ? ? ? if(socket != null){
? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }
? }
}
到了這里,關(guān)于Java之UDP,TCP的詳細(xì)解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!