計算機網絡:地理位置不一樣 多臺計算機 鏈接 通訊 共享java
網絡編程的目的:數據交換,通訊編程
如何實現多臺主機之間的數據通訊:瀏覽器
JavaWeb:網頁編程 B/Sbash
網絡編程:TCP/IP C/S服務器
實現網絡通訊須要知道通訊雙方地址(ip、端口號)網絡
規則:網絡通訊協議多線程
TCP/IP參考模型:socket
網絡編程專門針對傳輸層(TCP/IP)tcp
ip地址:InetAddresside
ip地址的分類:
ipv4/ipv6
公網(互聯網) 私網(局域網)
端口表示計算機上的一個程序的進程:
端口分類
公有端口 0~1023
程序註冊端口:1024~49151 分配給用戶或者程序
動態/私有端口:49152~65535
netstat -ano #查看全部端口 netstat -ano|findstr "端口號" #查看指定的端口 tasklist|findstr "端口號" #查看指定端口的進程
協議:約定
網絡通訊協議:速率,傳輸碼率,代碼結構,傳輸控制......
TCP/IP協議簇
重要:
TCP vs UDP
打電話~TCP
三次握手,四次揮手
最少須要三次,保證穩定鏈接! A:你瞅啥? B:瞅你咋地? A:幹一場! A:我要走了 B:你真的要走了嗎? B:你真的真的要走了嗎? A:我真的真的要走了!
發短信~UDP
客戶端
package tcp; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class Client { public static void main(String[] args) { InetAddress serverIP = null; int port = 0; Socket socket = null; OutputStream os = null; try { //1.得知服務器地址 serverIP = InetAddress.getByName("127.0.0.1"); port = 9999; //2.建立一個socket鏈接 socket = new Socket(serverIP,port); //3.發送消息 os = socket.getOutputStream(); os.write("你好".getBytes()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(os!=null){ try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(socket!=null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
服務器端
package tcp; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { //1.有地址 serverSocket = new ServerSocket(9999); //2.等待客戶端鏈接 socket = serverSocket.accept(); //3.讀取客戶端的消息 is = socket.getInputStream(); //管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while((len=is.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //關閉資源 if(baos!=null){ try { baos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(is!=null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(serverSocket!=null){ try { serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
服務器端
package tcp; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import org.omg.CORBA_2_3.portable.OutputStream; public class Server { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { //1.建立服務 ServerSocket serverSocket = new ServerSocket(9999); //2.監聽客戶端鏈接 Socket socket = serverSocket.accept(); //3.讀取輸入流 InputStream is = socket.getInputStream(); //4.文件輸出 FileOutputStream fos = new FileOutputStream(new File("receive.jpg")); byte[] buffer = new byte[1024]; int len; while((len=is.read(buffer))!=-1){ fos.write(buffer,0,len); } //5.關閉資源 is.close(); fos.close(); socket.close(); serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客戶端
package tcp; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class Client { public static void main(String[] args) { try { //1.建立一個socket鏈接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9999); //2.建立一個輸出流 OutputStream os = socket.getOutputStream(); //3.讀取文件 FileInputStream fis = new FileInputStream(new File("dog.jpg")); //4.寫出文件 byte[] buffer = new byte[1024]; int len; while((len=fis.read(buffer))!=-1){ os.write(buffer,0,len); } //5.關閉資源 fis.close(); os.close(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
服務端(Tomcat)
客戶端(瀏覽器)
發短信:不用鏈接,須要知道對方地址
發送端
package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; //不須要鏈接服務器 public class Client { public static void main(String[] args) throws Exception { //1.創建一個Socket DatagramSocket socket = new DatagramSocket(); //2.建個包 String msg = "Hello!"; InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; //數據,數據的長度起始,發送給誰 DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port); //3.發送包 socket.send(packet); //4.關閉流 socket.close(); } }
接收端
package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; //仍是要等待客戶端的鏈接! public class Server { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //開放端口 DatagramSocket socket = new DatagramSocket(9090); //接收數據包 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); //接收 socket.receive(packet);//阻塞接收 System.out.println(packet.getAddress().getHostAddress()); System.out.println(new String(packet.getData(),0,packet.getLength())); //關閉鏈接 socket.close(); } }
發送端
package udp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class Sender { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //1.創建一個Socket DatagramSocket socket = new DatagramSocket(8888); //準備數據:控制檯讀取 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while(true){ //2.建個包 String data = reader.readLine(); byte[] datas = data.getBytes(); //數據,數據的長度起始,發送給誰 DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666)); //3.發送包 socket.send(packet); if(data.equals("bye")){ break; } } //4.關閉流 socket.close(); } }
接收端
package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Receiver { public static void main(String[] args) throws Exception { //1.創建一個Socket DatagramSocket socket = new DatagramSocket(6666); while(true){ //準備接收包裹 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container,0,container.length); socket.receive(packet);//阻塞式接收包裹 //斷開鏈接 bye byte[] data = packet.getData(); String receiveData = new String(data,0,data.length).trim(); System.out.println(receiveData); if(receiveData.equals("bye")){ break; } } //關閉流 socket.close(); } }
在線諮詢:兩我的既能夠是發送端也能夠是接收端(多線程)
線程TalkSend
package udp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; 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) { super(); 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){ String data; try { 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(); } }
線程TalkReceive
package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; public class TalkReceive implements Runnable{ DatagramSocket socket = null; private int port; private String msgFrom; public TalkReceive(int port,String msgFrom) { super(); this.port = port; this.msgFrom = msgFrom; try { socket = new DatagramSocket(port); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { while(true){ try { //準備接收包裹 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container, 0,container.length); socket.receive(packet);//阻塞式接收包裹 //斷開鏈接 bye byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length).trim(); System.out.println(msgFrom+":"+receiveData); if (receiveData.equals("bye")) { break; } } catch (Exception e) { e.printStackTrace(); } } //關閉流 socket.close(); } }
老師TalkTeacher
package udp; public class TalkTeacher { public static void main(String[] args) { // TODO Auto-generated method stub new Thread(new TalkSend(5555,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"學生")).start(); } }
學生TalkStudent
package udp; public class TalkStudent { public static void main(String[] args) { //開啓兩個線程 new Thread(new TalkSend(7777,"localhost",9999)).start(); new Thread(new TalkReceive(8888,"老師")).start(); } }
統一資源定位符:定位互聯網資源
協議://ip地址:端口/項目名/資源
url下載網絡資源
package url; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class URLDown { public static void main(String[] args) throws Exception { //1.下載地址 URL url = new URL("http://127.0.0.1:8080/zhg/Confidential.txt"); //2.鏈接這個資源HTTP HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("cfile.txt"); byte[] buffer = new byte[1024]; int len; while((len=inputStream.read(buffer))!=-1){ fos.write(buffer, 0, len); } fos.close(); inputStream.close(); urlConnection.disconnect(); } }