一、計算機網絡java
計算機網絡是指將==地理位置不一樣==的具備獨立功能的多臺計算機及其外部設備,經過通訊線路鏈接起來,在網絡操做系統,網絡管理軟件及網絡通訊協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。
二、網絡編程的目的:無線電臺...傳播交流信息,數據交換,通訊web
三、想要達到這個效果須要什麼?編程
如何實現網絡的通訊?bash
通訊雙方地址服務器
IP 192.168.0.0:8080網絡
端口號less
規則:網絡通訊的協議socket
TCP/IP參考模型:jsp
tcp
小結:
端口表示計算機上的一個程序的進程
netstat -ano#查看所用的端口 netstat -ano|findstr "5900" #管道符的做用,用來作分割,先把後邊的執行完後代入前邊進行執行。。。。查看指定的端口 tasklist|findstr "指定端口的進程" ctr+shift+esc 打開任務管理器
package com.lessonweb.net; import java.net.InetSocketAddress; public class TsetInetSocketAdress { public static void main(String[] args) { InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080); InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080); System.out.println(socketAddress); System.out.println(socketAddress2); System.out.println(socketAddress.getAddress()); System.out.println(socketAddress.getHostName());//地址 System.out.println(socketAddress.getPort());//端口 } }
協議:約定,就比如人與人之間的普通話
網路通訊協議:速率,傳輸碼率,代碼結構,傳輸控制......
問題:複雜
解決方式:大事化小:分層!
TCP/IP協議簇:其實是一組協議
出名的協議
TCP UDP對比
TCP: 打電話
須要鏈接,穩定
三次握手、四次揮手
最少須要三次,保證穩定鏈接! A:你瞅啥? B:瞅你咋地? A:幹一場! A:我要走了! B:真的要走了嗎? B:真的真的要走了嗎? A:我真的要走了!
客戶端、服務端
傳輸完成、釋放鏈接、效率低
UDP:發短信
客戶端
一、鏈接服務器,經過Socket
二、發送消息
package com.lessonweb.tcp; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo01 { public static void main(String[] args) { Socket socket= null; OutputStream os = null; try { //一、要知道服務器的地址 InetAddress serverIP = InetAddress.getByName("127.0.0.1"); //二、端口號 int port =9999; //三、建立一個socket鏈接 socket = new Socket(serverIP,port); //三、發送消息 os = socket.getOutputStream(); os.write("你好,網絡編程".getBytes()); } catch (Exception e) { e.printStackTrace(); }finally { if (os!=null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服務端
一、創建服務的窗口,經過ServerSocket
二、等待用戶的鏈接,經過accept
三、接收用的消息
package com.lessonweb.tcp; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo01 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; //一、我有一個地址 try { serverSocket = new ServerSocket(9999); //二、等待客戶端鏈接過來 socket = serverSocket.accept(); //讀取客戶端的消息 is = socket.getInputStream(); //管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) != -1) { baos.write(buffer, 0, length); } System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); } finally { //關閉資源 if (baos != null) { try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服務器端
package com.lessonweb.tcp; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo02 { public static void main(String[] args) throws Exception { //一、建立服務 ServerSocket serverSocket = new ServerSocket(9000); //二、監聽客戶端的鏈接 Socket socket = serverSocket.accept(); //三、獲取輸入流 InputStream is = socket.getInputStream(); //四、文件輸出 FileOutputStream fos = new FileOutputStream(new File("receive")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer))!=-1){ fos.write(buffer,0,len); } //通知客戶端我接受完畢了 OutputStream os = socket.getOutputStream(); os.write("我已經接收完畢了,你能夠退出了!".getBytes()); //關閉資源 os.close(); fos.close(); is.close(); socket.close(); serverSocket.close(); } }
客戶端
package com.lessonweb.tcp; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo02 { public static void main(String[] args) throws Exception { Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); //二、建立一個輸出流 OutputStream os = socket.getOutputStream(); //三、讀取一個文件 FileInputStream files = new FileInputStream(new File("TcpClientDemo01.java")); //四、寫出文件 byte[] buffer = new byte[1024]; int len; while((len = files.read())!=1){ os.write(buffer,0,len); } //通知服務器。我已經結束了 socket.shutdownOutput();//我已經傳輸完了 //肯定服務器接收完畢 纔可以斷開鏈接 InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[1024]; int len2; while ((len2=inputStream.read())!=-1){ baos.write(buffer2,0,len2); } System.out.println(baos.toString()); //五、關閉 baos.close(); inputStream.close(); files.close(); os.close(); socket.close(); } }
一、聊天實現
發送方:
public class UdpSenderDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(8888); //準備數據,控制檯讀取 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true){ String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress("localhost",6666)); socket.send(packet); if (data.equals("bye")){ break; } } socket.close(); } }
接收方:
public class UdpReceiveDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); while (true){ //準備接受包裹 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container,0,container.length); socket.receive(packet);//接收包裹 //斷開鏈接 byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length); System.out.println(receiveData); if (receiveData.equals("bye")){ break; } } socket.close(); } }
二、在線諮詢:兩我的均可以是發送方,也均可以是接收方!
Receive:
public class TalkReceive implements Runnable{ DatagramSocket socket =null; private int port; private String msgFrom; public TalkReceive(int port,String msgFrom) { this.port = port; this.socket = socket; this.msgFrom = msgFrom; try { socket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true){ try { //準備接受包裹 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container,0,container.length); try { socket.receive(packet);//接收包裹 } catch (IOException e) { e.printStackTrace(); } //斷開鏈接 byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length); System.out.println(msgFrom+":"+receiveData); if (receiveData.equals("bye")){ break; } } catch (Exception e) { e.printStackTrace(); } } socket.close(); } }
Send:
public class TalkSend implements Runnable{ DatagramSocket socket = null; BufferedReader reader = null; private int fromPort; private String toIP; private int toPort; public TalkSend(int fromPort,String toIP,int toPort ) { this.fromPort= fromPort; this.toIP = toIP; this.toPort = toPort; try{ socket=new DatagramSocket(fromPort); reader=new BufferedReader(new InputStreamReader(System.in)); }catch(Exception e){ e.printStackTrace(); } } @Override public void run() { while (true){ try { String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort)); socket.send(packet); if (data.equals("bye")) { break; } }catch(Exception e){ e.printStackTrace(); } } socket.close(); } }
三、簡單案例的實現:師生對話交流
Student:
public class TalkStudent { public static void main(String[] args) { //開啓兩個線程 new Thread(new TalkSend(777,"localhost",9999)).start(); new Thread(new TalkReceive(8888,"老師")).start(); } }
Teacher:
public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"學生")).start(); } }
URL的組成:協議://IP地址:端口號/項目名/資源名
URLDown.java
public class URLDown { public static void main(String[] args) throws Exception { //一、下載地址 URL url = new URL("http://m701.music.126.net/20210324121008/fa40047aca19fe4a2639d56aa8b652b2/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/5546003493/cfbc/699a/fadc/6b094e5431dfc70cb57527f51db8dd4c.mp3"); //二、鏈接到這個服務器 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("錯位時空.mp3"); byte[] buffer = new byte[1024]; int len; while ((len=inputStream.read(buffer))!=-1){ fos.write(buffer,0, len);//寫出這個數據 } fos.close(); inputStream.close(); urlConnection.disconnect(); } }
public class URLDemo { public static void main(String[] args) throws MalformedURLException { URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuang&passwoed=123"); System.out.println(url.getProtocol());//協議 System.out.println(url.getHost());//主機IP System.out.println(url.getPort());//端口 System.out.println(url.getPath());//全路徑 System.out.println(url.getFile());//文件 System.out.println(url.getQuery());//參數 } }