如何讓人幫忙做網(wǎng)站網(wǎng)站檢測(cè)
文章目錄
- 網(wǎng)絡(luò)編程
- 實(shí)現(xiàn)簡(jiǎn)答客戶端和服務(wù)器端的交互
- 編寫(xiě)客戶端
- 編寫(xiě)服務(wù)端
- 文件上傳
- 文件上傳客戶端以及服務(wù)器端實(shí)現(xiàn)
- 文件上傳服務(wù)器端實(shí)現(xiàn)(多線程)
- 文件上傳服務(wù)器端(連接池版本)
- 關(guān)閉資源工具類
- BS架構(gòu)服務(wù)器案例
- 案例分析
- BS結(jié)構(gòu)服務(wù)器代碼實(shí)現(xiàn)
- Junit單元測(cè)試
- Junit介紹
- Junit的基本使用(重點(diǎn))
- Junit的注意事項(xiàng)
- Junit相關(guān)注解
- @Test以后怎么使用
- 類的加載時(shí)機(jī)
- 類加載器(了解)_ClassLoader
- 反射
- class類的以及class對(duì)象的介紹以及反射介紹
- 反射之獲取class對(duì)象
- 三種獲取Class對(duì)象的方式最通用的一種
- 獲取Class對(duì)象中的構(gòu)造方法
- 獲取所有public的構(gòu)造對(duì)象
- 獲取空參構(gòu)造_public
- 利用空參構(gòu)創(chuàng)建對(duì)象的快捷方式_public
- 利用反射獲取有參構(gòu)造并創(chuàng)建對(duì)象_public
網(wǎng)絡(luò)編程
實(shí)現(xiàn)簡(jiǎn)答客戶端和服務(wù)器端的交互
相關(guān)介紹
編寫(xiě)客戶端
1.創(chuàng)建Socket對(duì)象,指明連接服務(wù)器端的IP以及端口號(hào)
2.調(diào)用Socket中的getOutputStream方法,發(fā)送請(qǐng)求
3.調(diào)用Socket中的getInputStream方法,接收響應(yīng)
4.關(guān)流
public class Client {public static void main(String[] args) throws IOException {
// 1.創(chuàng)建Socket對(duì)象,指明連接服務(wù)器端的IP以及端口號(hào)final Socket socket = new Socket("127.0.0.1",6666);
// 2.調(diào)用Socket中的getOutputStream方法,發(fā)送請(qǐng)求final OutputStream outputStream = socket.getOutputStream();outputStream.write("發(fā)送請(qǐng)求,請(qǐng)回應(yīng)".getBytes(StandardCharsets.UTF_8));
// 3.調(diào)用Socket中的getInputStream方法,接收響應(yīng)final InputStream inputStream = socket.getInputStream();final byte[] bytes = new byte[1024];int len = inputStream.read(bytes);System.out.println(new String(bytes,0,len));
// 4.關(guān)流inputStream.close();outputStream.close();}
}
編寫(xiě)服務(wù)端
1.創(chuàng)建ServerSocket。設(shè)置端口號(hào)
2.調(diào)用accept方法等待連接的客戶端對(duì)象
3.調(diào)用socket中的getInputStream用于讀取客戶端發(fā)過(guò)來(lái)的請(qǐng)求
4.調(diào)用socket中的getOutputStream,用于給客戶端響應(yīng)結(jié)果
5.關(guān)流
public class Server {public static void main(String[] args) throws IOException {//創(chuàng)建ServerSocket,設(shè)置端口號(hào)final ServerSocket serverSocket = new ServerSocket(6666);//調(diào)用accept方法等待連接的客戶端對(duì)象final Socket socket = serverSocket.accept();//調(diào)用socke中的getInputStream,用于讀取客戶端發(fā)過(guò)來(lái)的請(qǐng)求final InputStream inputStream = socket.getInputStream();final byte[] bytes = new byte[1024];final int read = inputStream.read(bytes);System.out.println(new String(bytes,0,read));//調(diào)用socket中的getOutputStream,用于給客戶端相應(yīng)結(jié)果final OutputStream outputStream = socket.getOutputStream();outputStream.write("給你資源,發(fā)送吧".getBytes(StandardCharsets.UTF_8));//關(guān)流inputStream.close();outputStream.close();socket.close();serverSocket.close();}
}
文件上傳
文件上傳客戶端以及服務(wù)器端實(shí)現(xiàn)
客戶端
public class Client {public static void main(String[] args) throws IOException {//創(chuàng)建socket對(duì)象final Socket socket = new Socket("127.0.0.1", 6666);//創(chuàng)建FileInputStream,將讀取本地上的照片final FileInputStream fileInputStream = new FileInputStream("C:\\Users\\94863\\Pictures\\Saved Pictures\\hua.jpg");//調(diào)用getOutputStream,將讀取過(guò)來(lái)的照片寫(xiě)到服務(wù)端final OutputStream outputStream = socket.getOutputStream();final byte[] bytes = new byte[1024];int len;while ((len = fileInputStream.read(bytes))!=-1){outputStream.write(bytes,0,len);}//給服務(wù)端寫(xiě)一個(gè)結(jié)束標(biāo)志socket.shutdownOutput();System.out.println("==============以下是接收相應(yīng)的代碼=========================");//調(diào)用getInputStream,讀取服務(wù)器端相應(yīng)回來(lái)的數(shù)據(jù)final InputStream inputStream = socket.getInputStream();final byte[] bytes1 = new byte[1024];final int read = inputStream.read(bytes1);System.out.println(new String(bytes1,0,read));//關(guān)流inputStream.close();outputStream.close();fileInputStream.close();socket.close();}
}
服務(wù)器端
public class Server {public static void main(String[] args) throws IOException {//創(chuàng)建ServerSocket對(duì)象,設(shè)置端口號(hào)final ServerSocket serverSocket = new ServerSocket(6666);//調(diào)用accept方法,等待連接的客戶端final Socket socket = serverSocket.accept();//調(diào)用getInputStream讀取客戶端發(fā)過(guò)來(lái)額照片final InputStream inputStream = socket.getInputStream();//創(chuàng)建FileOutStream,將讀取過(guò)來(lái)的照片寫(xiě)到本地上final String name = System.currentTimeMillis() + "" + new Random().nextInt() + ".jpg";final FileOutputStream fileOutputStream = new FileOutputStream("D:\\Ajava\\"+name);final byte[] bytes = new byte[1024];int len;while ((len = inputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,len);}System.out.println("============以下代碼為相應(yīng)代碼===================");//響應(yīng)數(shù)據(jù)final OutputStream outputStream = socket.getOutputStream();outputStream.write("上傳成功".getBytes(StandardCharsets.UTF_8));//關(guān)流outputStream.close();fileOutputStream.close();inputStream.close();socket.close();serverSocket.close();}
}
文件上傳服務(wù)器端實(shí)現(xiàn)(多線程)
public class Server_muti {public static void main(String[] args) throws IOException {//創(chuàng)建ServerSocket對(duì)象,設(shè)置端口號(hào)final ServerSocket serverSocket = new ServerSocket(6666);while (true) {//調(diào)用accept方法,等待連接的客戶端final Socket socket = serverSocket.accept();new Thread(new Runnable() {@Overridepublic void run() {final InputStream inputStream;try {//調(diào)用getInputStream讀取客戶端發(fā)過(guò)來(lái)額照片inputStream = socket.getInputStream();//創(chuàng)建FileOutStream,將讀取過(guò)來(lái)的照片寫(xiě)到本地上final String name = System.currentTimeMillis() + "" + new Random().nextInt() + ".jpg";final FileOutputStream fileOutputStream = new FileOutputStream("D:\\Ajava\\" + name);final byte[] bytes = new byte[1024];int len;while ((len = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, len);}System.out.println("============以下代碼為相應(yīng)代碼===================");//響應(yīng)數(shù)據(jù)final OutputStream outputStream = socket.getOutputStream();outputStream.write("上傳成功".getBytes(StandardCharsets.UTF_8));//關(guān)流outputStream.close();fileOutputStream.close();inputStream.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}).start();}}}
文件上傳服務(wù)器端(連接池版本)
public class Server_pools {public static void main(String[] args) throws IOException {//創(chuàng)建ServerSocket對(duì)象,設(shè)置端口號(hào)final ServerSocket serverSocket = new ServerSocket(6666);final ExecutorService executorService = Executors.newFixedThreadPool(10);while (true){//調(diào)用accept方法,等待連接的客戶端final Socket socket = serverSocket.accept();executorService.submit(new Runnable() {@Overridepublic void run() {InputStream inputStream = null;FileOutputStream fileOutputStream = null;OutputStream outputStream = null;//調(diào)用getInputStream讀取客戶端發(fā)過(guò)來(lái)額照片try {inputStream = socket.getInputStream();//創(chuàng)建FileOutStream,將讀取過(guò)來(lái)的照片寫(xiě)到本地上final String name = System.currentTimeMillis() + "" + new Random().nextInt() + ".jpg";fileOutputStream = new FileOutputStream("D:\\Ajava\\" + name);final byte[] bytes = new byte[1024];int len;while ((len = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, len);}System.out.println("============以下代碼為相應(yīng)代碼===================");//響應(yīng)數(shù)據(jù)outputStream = socket.getOutputStream();outputStream.write("上傳成功".getBytes(StandardCharsets.UTF_8));//關(guān)流outputStream.close();fileOutputStream.close();inputStream.close();socket.close();} catch (IOException e) {e.printStackTrace();}}});}}
}
關(guān)閉資源工具類
我們創(chuàng)建一個(gè)工具類,以便快速關(guān)閉資源
public class CloseUtils {public static void close(InputStream is, FileOutputStream fos, OutputStream os, Socket so){if (os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if (so != null){try {so.close();} catch (IOException e) {e.printStackTrace();}}}
}
BS架構(gòu)服務(wù)器案例
案例分析
BS結(jié)構(gòu)服務(wù)器代碼實(shí)現(xiàn)
public class bstest {public static void main(String[] args) throws IOException {//創(chuàng)建ServerSocket對(duì)象final ServerSocket serverSocket = new ServerSocket(8888);while (true) {//調(diào)用accept方法接收客戶端final Socket socket = serverSocket.accept();//調(diào)用getInputStream用于讀取瀏覽器發(fā)過(guò)來(lái)的請(qǐng)求final InputStream inputStream = socket.getInputStream();/*1.描述:需要將is對(duì)象轉(zhuǎn)成BufferedReader對(duì)象然后調(diào)用BufferedReader中的readLine方法讀取請(qǐng)求信息第一行2.怎么將InputStream轉(zhuǎn)成BufferedReader?只需要將InputStream想辦法塞到BufferedReader的構(gòu)造中即可3.BufferedReader構(gòu)造:BufferedReader(Reader r)Reader是抽象類,需要傳遞子類,我們可以傳遞InputStreamReader而InputStreamReader的構(gòu)造正好可以傳遞InputStream4.如何轉(zhuǎn):new BufferedReader(new InputStreamReader(InputStream is))*/final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();String s2 = s.split(" ")[1];String path = s2.substring(1);//創(chuàng)建FileInputStream對(duì)象final FileInputStream fileInputStream = new FileInputStream(path);//調(diào)用getOutputStream 將讀取到的html寫(xiě)到瀏覽器final OutputStream outputStream = socket.getOutputStream();//寫(xiě)相應(yīng)信息給瀏覽器outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());outputStream.write("Content-Type:text/html\r\n".getBytes());outputStream.write("\r\n".getBytes());byte[] bytes = new byte[1024];int len;while ((len = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, len);}//關(guān)流outputStream.close();fileInputStream.close();bufferedReader.close();inputStream.close();socket.close();}}}
Junit單元測(cè)試
Junit介紹
1.概述:單元測(cè)試 ,用于測(cè)試一個(gè)方法的,屬于第三方工具,所以使用需要導(dǎo)jar包,在一定程度上可以代替main方法
2.作用:單獨(dú)測(cè)試一個(gè)方法,看看此方法能不能跑通
Junit的基本使用(重點(diǎn))
1.導(dǎo)包
2.在方法時(shí)寫(xiě):@test
3.執(zhí)行:
a.雙擊方法名,右鍵,點(diǎn)run
b.在方法的左邊有一個(gè)綠色的小摁鈕,點(diǎn)擊它,點(diǎn)run
public class test01 {@Testpublic void add(){System.out.println("添加新功能");}@Testpublic void deltet(){System.out.println("刪除功能");}
}
Junit的注意事項(xiàng)
1.靜態(tài)方法不能使用@Test
2.帶參數(shù)的方法不能使用@Test
3.帶返回值的方法不能使用@Test
Junit相關(guān)注解
1.@Before:在@Test之前執(zhí)行,有多少個(gè)@Test一起執(zhí)行,@Before就執(zhí)行多少次
2.@After:在@Test之后執(zhí)行,有多少個(gè)@Test一起執(zhí)行,@After就執(zhí)行多少次
3.@Before:一般都用于初始化數(shù)據(jù)
@After:一般用于關(guān)閉資源
public class test01 {@Testpublic void add(){System.out.println("添加新功能");}@Testpublic void deltet(){System.out.println("刪除功能");}@Testpublic void update(){System.out.println("修改功能");}@Beforepublic void before(){System.out.println("我是before功能");}@Afterpublic void after(){System.out.println("我是After功能");}
}
@Test以后怎么使用
對(duì)商品進(jìn)行更刪改查
public class CategoryImpl {public void add(String s){System.out.println("添加商品分類"+s);}public void delete(int id){System.out.println("id為" + id + "被刪除");}public void update(int id){System.out.println("id為"+ id + "被修改");}
}
public class test02 {@Test//測(cè)試add功能public void add(){new CategoryImpl().add("服裝");}@Test//測(cè)試刪除功能public void delete(){new CategoryImpl().delete(0001);}
}
類的加載時(shí)機(jī)
1.new對(duì)象
2.new子類對(duì)象(new子類對(duì)象先初始化父類)
3.執(zhí)行main方法
4.調(diào)用靜態(tài)成員
5.利用反射反射這個(gè)類
類加載器(了解)_ClassLoader
1.概述:在jvm中,負(fù)責(zé)將本地上的class文件加載到內(nèi)存的對(duì)象_ClassLoader
2.分類:
BootStrapClassLoader:根類加載器—》C語(yǔ)言寫(xiě)的,我們獲取不到的也稱之為引導(dǎo)類加載器,負(fù)載Java的核心類加載,比如
System,String等 jre/lib/rt.jar下的類都是核心類
ExtClassLoader:負(fù)責(zé)類加載器,負(fù)載jre的擴(kuò)展目錄中的jar包的加載,在jdk中jre的lib目錄下的ext目錄
AppClassLoader:系統(tǒng)類加載器,負(fù)責(zé)在居民啟動(dòng)時(shí),加載來(lái)自java命令的class文件(自定義類)
以及classPath環(huán)境變量所指定的jar包(第三方j(luò)ar包)
不同的類加載器負(fù)責(zé)加載不同的類
3.三者的關(guān)系:AppClassLoader的父類加載器時(shí)ExtClassLoader
ExtClassLoader的父類加載器時(shí)BootStrapClassLoader
但是:他們從代碼級(jí)別上來(lái)看,沒(méi)有子父類繼承關(guān)系 ---- 他們都有一個(gè)共同的父類---- ClassLoader
4.獲取類加載對(duì)象
類名.class.getClassLoader()
5.獲取類加載器對(duì)象對(duì)應(yīng)的父類加載器
ClassLoader類中的方法:ClassLoader
getParent() ----- 沒(méi)啥用
6.雙親委派(全盤負(fù)責(zé)委托機(jī)制)
a.Person類中有一個(gè)String
Person本身是AppClassLoader加載
String是BootStrapClassLoader加載
b.加載順序
Person本身是App加載,按道理來(lái)說(shuō)String也是App加載,但是app加載String的時(shí)候,先詢問(wèn)Ext是否加載,Ext負(fù)責(zé)加載的是拓展類, 再詢問(wèn)boot是否加載,boot負(fù)責(zé)加載核心類,所以String被加載
再比如
a.Test是app加載,person按理來(lái)說(shuō)也是app加載,但是app先問(wèn)ext要不要加載
ext說(shuō)不負(fù)責(zé)加載自定義類,我找boot去,boot一看,我不負(fù)責(zé)加載自定義類->perosn
app一看,兩個(gè)爹都不加載,我自己加
b.結(jié)論:兩個(gè)雙親都不加載,app才自己加載
比如:如果來(lái)了一個(gè)DNSNameService,我就想直接加載DNSNameService(擴(kuò)展類),
本身ext要加載,但是先問(wèn)boot,如果boot不加載,ext再加載
7.類加載器的cache(緩存)機(jī)制(拓展):一個(gè)類加載到內(nèi)存之后,緩存中也會(huì)保存一份,后面如果在使用此類,如果緩存中保存了這個(gè)類,就直接返回他,如果沒(méi)有才加載這個(gè)類,下一次如果有其他類在使用的時(shí)候就不會(huì)重新加載了,直接去緩存中拿,所以這就是為什么每個(gè)類只加載一次,內(nèi)存只有一份的原因
8.所以,類加載器的雙親委派和緩存機(jī)制共同早就了加載類的特點(diǎn),每個(gè)類只在內(nèi)存中加載一次
public class test03 {public static void main(String[] args) {boot();ext();app();}public static void boot(){final ClassLoader classLoader = Integer.class.getClassLoader();System.out.println(classLoader);}public static void ext(){final ClassLoader classLoader = DNSNameService.class.getClassLoader();System.out.println("classLoader = " + classLoader);}public static void app(){final ClassLoader classLoader = test01.class.getClassLoader();System.out.println("classLoader = " + classLoader);}
}
反射
class類的以及class對(duì)象的介紹以及反射介紹
1.class對(duì)象:jvm在堆內(nèi)存中為加載到內(nèi)存中的class文件創(chuàng)建出來(lái)的對(duì)象
2.class類:描述這個(gè)class對(duì)象額類叫做class類
反射之獲取class對(duì)象
1.方法1:new對(duì)象,調(diào)用Object中的方法 Class getClass()
2.方法2:不管是基本類型還是引用類型,都有一個(gè)靜態(tài)成員class
3.方式3:class類中的方法 static Class<?> forName(String className)
className:類的全限定名 — 包名.類名
public class test04 {public static void main(String[] args) throws ClassNotFoundException {
// 1.方法1:new對(duì)象,調(diào)用Object中的方法 Class getClass()final Person person = new Person();Class class1 = person.getClass();System.out.println(class1);
// 2.方法2:不管是基本類型還是引用類型,都有一個(gè)靜態(tài)成員classfinal Class<Person> personClass = Person.class;System.out.println(personClass);
// 3.方式3:class類中的方法 static Class<?> forName(String className)
// className:類的全限定名 --- 包名.類名final Class<?> aClass = Class.forName("Unitexc.Person");System.out.println(aClass);}
}
三種獲取Class對(duì)象的方式最通用的一種
1.Class.forName(“類的全限定名”)
2.原因:參數(shù)為String,可以配合配置文件使用
顯然最后一種是常用的,我們進(jìn)行代碼事項(xiàng),首先在相關(guān)包下,建立一個(gè)File名為pro.properties
內(nèi)容為: className=Unitexc.Person
public class test05 {public static void main(String[] args) throws IOException, ClassNotFoundException {final Properties properties = new Properties();final Person person = new Person();final FileInputStream in = new FileInputStream("D:\\untitled7\\day21\\src\\pro.properties");properties.load(in);String className = properties.getProperty("className");//System.out.println(className);final Class<?> aClass = Class.forName(className);System.out.println(aClass);}
}
獲取Class對(duì)象中的構(gòu)造方法
獲取所有public的構(gòu)造對(duì)象
class類中的方法
Constructor<?>[] getConstructors() ----- 獲取所有public的構(gòu)造方法
public class test06 {public static void main(String[] args) {final Class<Person> personClass = Person.class;final Constructor<?>[] constructors = personClass.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}}
}
獲取空參構(gòu)造_public
Class類中的方法
Constructor getConstructor(Class<?>… parameterTypes)
parameterTypes:是一個(gè)可變參數(shù),可以傳遞0個(gè)或者多個(gè)參數(shù),傳遞的是參數(shù)類型的class對(duì)象
如果獲取空參構(gòu)造,paramTypes不寫(xiě)了
如果獲取有參構(gòu)造,parameterTypes寫(xiě)參數(shù)類型的class對(duì)象
Constructor類中的方法
T newInstance(Object…initargs)----- 創(chuàng)建對(duì)象
initargs:是一個(gè)可變參數(shù),可以傳遞0個(gè)或者多個(gè)參數(shù),傳遞的是實(shí)參
如果根據(jù)空參構(gòu)造創(chuàng)建對(duì)象,initargs不用寫(xiě)了
如果根據(jù)有參構(gòu)造創(chuàng)建對(duì)象,initargs需要寫(xiě)實(shí)參
public class test07 {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {final Class<Person> ac = Person.class;final Constructor<Person> constructor = ac.getConstructor();final Person person = constructor.newInstance();System.out.println(person);}
}
利用空參構(gòu)創(chuàng)建對(duì)象的快捷方式_public
Class類中的方法
T newInstance() 根據(jù)空參構(gòu)造new對(duì)象
前提:
被反射的類中必須又public的空參構(gòu)造
final Person person1 = ac.newInstance();
System.out.println(person1);
利用反射獲取有參構(gòu)造并創(chuàng)建對(duì)象_public
Class類中的方法
Class類中的方法
Constructor getConstructor(Class<?>… parameterTypes)
parameterTypes:是一個(gè)可變參數(shù),可以傳遞0個(gè)或者多個(gè)參數(shù),傳遞的是參數(shù)類型的class對(duì)象
如果獲取空參構(gòu)造,paramTypes不寫(xiě)了
如果獲取有參構(gòu)造,parameterTypes寫(xiě)參數(shù)類型的class對(duì)象
Constructor類中的方法
T newInstance(Object…initargs)----- 創(chuàng)建對(duì)象
initargs:是一個(gè)可變參數(shù),可以傳遞0個(gè)或者多個(gè)參數(shù),傳遞的是實(shí)參
如果根據(jù)空參構(gòu)造創(chuàng)建對(duì)象,initargs不用寫(xiě)了
如果根據(jù)有參構(gòu)造創(chuàng)建對(duì)象,initargs需要寫(xiě)實(shí)參
final Class<Person> personClass = Person.class;final Constructor<Person> constructor = personClass.getConstructor(String.class,Integer.class);final Person li = constructor.newInstance("李云龍", 35);System.out.println(li);