-
Socket通信模型
查看全部 -
基于TCP協(xié)議的Socket通信:服務(wù)器端
//4.關(guān)閉資源
br/isr/is/socket/serverSocket.close();
查看全部 -
服務(wù)端:
1、創(chuàng)建ServerSocket對象,綁定監(jiān)聽端口
2、通過accept()方法監(jiān)聽客戶端請求
3、連接建立后,通過輸入流讀取客戶端發(fā)送的請求信息
4、通過輸出流向客戶端發(fā)送響應(yīng)信息
5、關(guān)閉相關(guān)資源
客戶端:
1、創(chuàng)建Socket對象,指明需要連接的服務(wù)器的地址和端口號(hào)
2、連接建立后,通過輸出流向服務(wù)器端發(fā)送請求信息
3、通過輸入流獲取服務(wù)器相應(yīng)的信息
4、關(guān)閉相關(guān)資源。查看全部 -
TCP協(xié)議是面向連接、可靠、有序的、以字節(jié)流的方式發(fā)送數(shù)據(jù)
基于TCP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信的類?
?客戶端的Socket類?
服務(wù)器端的ServerSocket類TCP的
Socket通信實(shí)現(xiàn)步驟
1,創(chuàng)建服務(wù)器端ServerSocket和客戶端Socket
2,打開連接到Socket的輸出和輸入流
3,按照協(xié)議對Socket進(jìn)行讀寫操作
4,關(guān)閉輸入輸出流,關(guān)閉Socket
Socket通信模型如圖:
查看全部 -
1.URL(Uniform Resource Locator)統(tǒng)一資源定位符,表示Internet上某一資源的地址。 2.URL由兩部分組成:協(xié)議名稱和資源名稱,中間用冒號(hào)隔開。 3.在java.net中提供了URL類來表示URL。 使用URL讀取網(wǎng)頁的內(nèi)容 1.通過URL對象的openStream()方法可以得到指定資源的輸入流。 2.通過輸入流可以讀取、訪問網(wǎng)絡(luò)上的數(shù)據(jù)。 ---------------------------------------- //創(chuàng)建一個(gè)URL實(shí)例 URL imooc=new URL("http://idcbgp.cn"); //?后面表示參數(shù),#后面表示錨點(diǎn) URL url=new URL(imooc, "/index.html?username=tom#test"); //主要方法: //getProtocol();getHost();getPort();getPath();getFile();getRef();getQuery(); //讀取網(wǎng)頁內(nèi)容 //通過URL的openStream方法獲取URL對象所表示的資源的字節(jié)輸入流 InputStream is = url.openStream()
查看全部 -
InetAddress類沒有構(gòu)造方法,不能直接new出一個(gè)對象
可以通過InetAddress類的靜態(tài)方法獲得InetAddress的對象; InetAddress.getLocalHost();
?InetAddress.getByName("");//可以傳入IP地址或主機(jī)名?
類主要方法:?
String - address.getHostName();?
String - address.getHostAddress(); 主機(jī)名可以是機(jī)器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式
查看全部 -
Socket編程 一、網(wǎng)絡(luò)基礎(chǔ)知識(shí) 兩臺(tái)計(jì)算機(jī)要通過網(wǎng)絡(luò)進(jìn)行通信,必須具備:a、唯一的標(biāo)識(shí)(IP地址); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
b、需要共同的語言(協(xié)議); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?c、辨別不同應(yīng)用程序(端口號(hào))。
?1、IP地址: 每臺(tái)計(jì)算機(jī)的唯一標(biāo)識(shí),用來區(qū)分網(wǎng)絡(luò)中的不同主機(jī),是兩臺(tái)主機(jī)進(jìn)行網(wǎng)絡(luò)通信必不可少的。IPv4
?2、協(xié)議: a、TCP/IP協(xié)議:目前世界上應(yīng)用最為廣泛的協(xié)議。是以TCP和IP為基礎(chǔ)的不同層次上多個(gè)協(xié)議的集合。 ? ? ? ? ? ? ? 也稱為:TCP/IP協(xié)議族 ?或者 ?TCP/IP協(xié)議棧。
?b、TCP: Transmission Control Protocol ? 傳輸控制協(xié)議
?c、IP :Internet Protocol ?互聯(lián)網(wǎng)協(xié)議
?d、TCP/IP模型(網(wǎng)絡(luò)分層):
1、物理層;網(wǎng)線。。。 ? ? ? ? ? ? ? ? ? ? ? ?
?2、數(shù)據(jù)鏈路層 ? ? ? ? ? ? ? ? ? ? ? ?
?3、網(wǎng)絡(luò)層 ? ? ? ? ? ? ? ? ? ? ? ??
4、傳輸層:TCP/IP協(xié)議 ? ? ? ? ? ? ? ? ? ? ? ?
?5、應(yīng)用層:HTTP超文本傳輸協(xié)議、FTP文件傳輸協(xié)議、SMTP簡單郵件傳送協(xié)議、Telnet遠(yuǎn)程登錄服務(wù)。
?3、端口號(hào):
?a、用于區(qū)分不同的應(yīng)用程序;
?b、端口號(hào)范圍為0-65535,其中0-1023為系統(tǒng)所保留;?
c、IP地址和端口號(hào)組成了所謂的Socket,Socket是網(wǎng)絡(luò)上運(yùn)行的程序之間雙向通信鏈路的終結(jié)點(diǎn),是TCP和UDP的基礎(chǔ)。
?d、常用端口號(hào)-- http: 80; ?ftp; 21; ?telnet; 23。
?JAVA中得網(wǎng)絡(luò)支持
?針對網(wǎng)絡(luò)通信的不同層次,Java提供的網(wǎng)絡(luò)功能有四大類:
?1、InetAddress:用于標(biāo)識(shí)網(wǎng)絡(luò)上的硬件資源。(IP地址)
?2、URL:統(tǒng)一資源定位符---通過URL可以直接讀取或?qū)懭刖W(wǎng)絡(luò)上得數(shù)據(jù)。?
3、Sockets:使用TCP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信的Socket相關(guān)的類。
?4、Datagram:使用UDP協(xié)議,將數(shù)據(jù)保存在數(shù)據(jù)報(bào)中,通過網(wǎng)絡(luò)進(jìn)行通信。
查看全部 -
基于TCP的Socket通信過程
查看全部 -
服務(wù)器端實(shí)現(xiàn)步驟
1.創(chuàng)建DatagramSocket,指定端口號(hào)
2.創(chuàng)建DatagramPacket
3.接受客戶端發(fā)送的數(shù)據(jù)信息
4.讀取數(shù)據(jù)
查看全部 -
客戶端實(shí)現(xiàn)
1.定義發(fā)送信息
2.創(chuàng)建DatagramPacket,包含將要發(fā)送的信息
3.創(chuàng)建DatagramSocket
4.發(fā)送數(shù)據(jù)
查看全部 -
Socket通信模型
查看全部 -
UDP實(shí)現(xiàn)多線程通信
/*UDP服務(wù)器端*/ public?class?UDPServer?{ ????public?static?void?main(String[]?args)?{ ????????try?{ ???????????//創(chuàng)建服務(wù)器端DatagramScoket,指定端口 ???????????DatagramSocket?socket?=?new?DatagramSocket(8800); ???????????DatagramPacket?packet?=?null; ???????????byte[]?data?=?null; ???????????//記錄客戶端的數(shù)量 ???????????int?count?=?0; ???????????System.out.println("服務(wù)器端已經(jīng)啟動(dòng),等待客戶端發(fā)送數(shù)據(jù)"); ???????????while(true){ ???????????????data?=?new?byte[1024];//?創(chuàng)建字節(jié)數(shù)組,指定接受的數(shù)據(jù)報(bào)的大小 ???????????????packet?=?new?DatagramPacket(data,?data.length); ???????????????socket.receive(packet); ???????????????UDPServerThread?udpServerThread=new?UDPServerThread(socket,packet); ???????????????udpServerThread.start(); ???????????????count++;//統(tǒng)計(jì)客戶端的數(shù)量 ???????????????System.out.println("客戶端的數(shù)量:"+count); ???????????} ???????}?catch?(SocketException?e)?{ ???????????e.printStackTrace(); ???????}?catch?(IOException?e)?{ ???????????e.printStackTrace(); ???????} ???} }
/*UDP服務(wù)器線程處理類*/ public?class?UDPServerThread?extends?Thread?{ ?????//?和本線程相關(guān)的Socket ?????DatagramSocket?socket?=?null; ?????DatagramPacket?packet?=?null;? ?????public?UDPServerThread(DatagramSocket?socket,DatagramPacket?packet)?{?? ?????????this.socket?=?socket;?? ?????????this.packet?=?packet;? ?????}? ? ?????//?線程執(zhí)行的操作,響應(yīng)客戶端的請求? ?????public?void?run()?{?? ?????????String?info?=?null;?? ?????????InetAddress?address?=?null;?? ?????????DatagramPacket?packet2?=?null;?? ?????????byte[]?data2?=?null;?? ?????????int?port?=?8800;?? ?????????try?{??? ?????????????//接收客戶端發(fā)送的數(shù)據(jù)??? ?????????????//?讀取數(shù)據(jù)??? ?????????????info?=?new?String(packet.getData(),?0,?packet.getLength());??? ?????????????System.out.println("我是服務(wù)器,客戶端說:"?+?info);??? ????????? ?????????????//向客戶端響應(yīng)數(shù)據(jù)?? ?????????????//?定義客戶端的地址、端口號(hào)、數(shù)據(jù)??? ?????????????address?=?packet.getAddress();??? ?????????????port?=?packet.getPort();??? ?????????????data2?=?"歡迎你!".getBytes();??? ?????????????//?創(chuàng)建數(shù)據(jù)報(bào),包含響應(yīng)的數(shù)據(jù)信息??? ?????????????packet2?=?new?DatagramPacket(data2,?data2.length,?address,?port);??? ?????????????//?響應(yīng)客戶端??? ?????????????socket.send(packet2);?? ?????????????}?catch?(SocketException?e)?{??? ?????????????????e.printStackTrace();?? ?????????}?catch?(IOException?e)?{??? ?????????????e.printStackTrace();?? ?????????}?finally?{??? ?????????????//?4.關(guān)閉資源??? ?????????????if?(socket?==?null)???? ?????????????????socket.close();?? ?????????}? ?????} }
/*UDP客戶端*/ public?class?UDPClient?{ ????public?static?void?main(String[]?args)?{ ????????try?{ ???????????//向服務(wù)器端發(fā)送數(shù)據(jù) ???????????//1.定義服務(wù)器的地址、端口號(hào)、數(shù)據(jù) ???????????InetAddress?address?=?InetAddress.getByName("localhost"); ???????????int?port?=?8800; ???????????byte[]?data?=?"用戶名:admin;密碼:123".getBytes(); ???????????//2.創(chuàng)建數(shù)據(jù)報(bào),包含發(fā)送的數(shù)據(jù)信息 ???????????DatagramPacket?packet=new?DatagramPacket(data,data.length,address,port); ???????????//3.創(chuàng)建DatagramSocket對象 ???????????DatagramSocket?socket?=?new?DatagramSocket(); ???????????//4.向服務(wù)器端發(fā)送數(shù)據(jù)報(bào) ???????????socket.send(packet); ??? ???????????//接收服務(wù)器端響應(yīng)的數(shù)據(jù) ???????????//1.創(chuàng)建數(shù)據(jù)報(bào),用于接收服務(wù)器端響應(yīng)的數(shù)據(jù) ???????????byte[]?data2?=?new?byte[1024]; ???????????DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length); ???????????//2.接收服務(wù)器響應(yīng)的數(shù)據(jù) ???????????socket.receive(packet2); ???????????//3.讀取數(shù)據(jù) ???????????String?reply?=?new?String(data2,0,packet2.getLength()); ???????????System.out.println("我是客戶端,服務(wù)器端說:"+reply); ???????????//4.關(guān)閉資源 ???????????socket.close(); ???????}?catch?(UnknownHostException?e)?{ ???????????e.printStackTrace(); ???????}?catch?(SocketException?e)?{ ???????????e.printStackTrace(); ???????}?catch?(IOException?e)?{ ???????????e.printStackTrace(); ???????} ???} }
查看全部 -
上傳文件的業(yè)務(wù)分析
查看全部 -
如何實(shí)現(xiàn)發(fā)送文件?
客戶端:
* 新建文件字節(jié)輸入流
* 循環(huán)將輸入流寫入到發(fā)送的輸出流中Socket?socket=new?Socket("localhost",?8881); OutputStream?os=socket.getOutputStream(); File?file=new?File("e:/Table.java"); FileInputStream?fs=new?FileInputStream(file); byte[]?data=new?byte[1024*4]; int?length; while((length=fs.read(data))!=-1){ ????os.write(data,?0,?length); ????os.flush(); } socket.shutdownOutput(); socket.close(); os.close(); fs.close();
服務(wù)器端:
* 新建文件字節(jié)輸出流
* 循環(huán)將接收到輸入流寫入到文件字符輸出流ServerSocket?server?=new?ServerSocket(8881); Socket??socket=server.accept(); InputStream?is=socket.getInputStream(); File?file=new?File("e:/153.java"); FileOutputStream?fs=new?FileOutputStream(file); byte[]?data=new?byte[1024*4]; int?length; while((length=is.read(data))!=-1){ fs.write(data,?0,?length); fs.flush(); } socket.shutdownInput(); server.close(); socket.close(); is.close(); fs.close();
查看全部 -
socket總結(jié)
查看全部
舉報(bào)