网络相关概念
什么是计算机网络
- 局域网
- 城域网
- 广域网
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源
计算机网络的主要功能
- 资源共享
- 信息传输与集中处理
- 均衡负荷与分布处理
- 综合信息服务 (www/综合业务数字网络 ISDN)
编辑
IP地址:用于唯一识别连接到Internet上的计算机
地址表示方式
IPv4: 点分10进制表示方式,四个整数用点分开,每个十进制数字代表一个8 bits整数,如192.168.123.1
IPv6: 点分16进制表示方式,八个整数用点分开,每个十六进制数字代表一个16bits整数,如CDCD:910A:2222:5498:8475:1111:3900:2020
域名 如www.sina.com.cn DNS
分布式的应用程序
192.168.1.121 192.168.1.122 123
本地IP
127.0.0.1 等同于 localhost
端口号
0-65535之间
网络协议
网络模型与协议
编辑什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传 输控制步骤、出错控制等制定标准。
TCP协议是一个面向连接的、可靠的协议
TCP(transmission control protocol)
是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
UDP协议是一个不可靠的、无连接协议
UDP(user datagram protocol )
UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接。
网络编程
TCP编程
TCP编程的核心类
java.net.Socket
java.net.ServerSocket
TCP编程的核心思路
开发服务器端
ServerSocket ss = new ServerSocket(9000) ss.accept();
开发客户端
Socket s = new Socket("150.236.56.101", 9000)
图示
编辑
服务器端:
- 创建ServerSocket对象(并绑定端口)
- 调用accept方法,等待来自客户端的连接
- 调用getXXXStream方法,进行I/O
- 关闭Socket
客户端:
- 创建Socket对象,并连接服务器
- 调用getXXXStream方法,进行I/O
- 关闭Socket
编写程序,实现客户端发送HelloWorld到服务器端的功能。
服务端程序编写
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class HttpSocketServer { public static void main(String[] args) { try { ServerSocket server=new ServerSocket(9010); Socket socket=server.accept(); InputStream is=socket.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String text=reader.readLine(); System.out.println(text); } catch (IOException e) { e.printStackTrace(); } } }
客户端程序编写
import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class HttpSocketClient { public static void main(String[] args) { try { Socket client=new Socket("127.0.0.1",9010); OutputStream out=client.getOutputStream(); PrintWriter writer=new PrintWriter(out); writer.print("哈喽,我是洛阳泰山"); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
注意:先启动服务端程序,后启动客户端程序 !
编写程序,客户端向服务器端发送”How are you?Server”,服务器端向客户端发送”I am fine ! Thank you,client!”
服务端代码
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class HttpSocketServer1 { public static void main(String[] args) { try { ServerSocket server=new ServerSocket(9020); Socket socket=server.accept(); InputStream is=socket.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String text=reader.readLine(); System.out.println("来自客户端的消息:"+text); OutputStream out=socket.getOutputStream(); PrintWriter writer=new PrintWriter(out); writer.print("I am fine ! Thank you,client!\n"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } }
客户端代码
import java.io.*; import java.net.Socket; public class HttpSocketClient1 { public static void main(String[] args) { try { Socket client=new Socket("127.0.0.1",9020); OutputStream out=client.getOutputStream(); PrintWriter writer=new PrintWriter(out); writer.print("How are you?Server\n"); writer.flush(); InputStream is=client.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String text=reader.readLine(); System.out.println("来自服务端的消息:"+text); } catch (IOException e) { e.printStackTrace(); } } }
UDP编程
UDP协议简介
UDP是一个无连接,不可靠的协议。即:数据的发送方只负责将数据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。
UDP编程
- java.net.DatagramSocket
- java.net.DatagramPacket 数据包
UDP编程的核心思路
- 服务器 DatagramSocket socket = new DatagramSocket(9000)
- 客户端 DatagramSocket socket = new DatagramSocket()
DatagramPacket
- DatagramPacket(byte[] buf, int,length)
- DatagramPacket(byte[] buf, int ,length, SoketAddress)
- getAddress()/getSockAddress()/getPort()/getLength()
- setAddress()/setSockAddress()/setPort()/setLength()
使用UDP协议发送接收消息
服务端程序编写
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try { DatagramSocket socket=new DatagramSocket(9000); byte[] buf=new byte[1024]; DatagramPacket packet=new DatagramPacket(buf,0,buf.length); socket.receive(packet); String text=new String(buf,0,packet.getLength()); System.out.println(text); socket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
客户端程序编写
import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; public class UDPClient { public static void main(String[] args) { try { DatagramSocket socket=new DatagramSocket(); String text="哈喽,我是洛阳泰山!"; byte[] data=text.getBytes(StandardCharsets.UTF_8); SocketAddress address=new InetSocketAddress("127.0.0.1",9000); DatagramPacket packet=new DatagramPacket(data,0,data.length,address); socket.send(packet); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
使用UDP协议互发互收消息
服务端程序编写
import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; public class UDPServer { public static void main(String[] args) { try { DatagramSocket socket=new DatagramSocket(9000); byte[] buf=new byte[1024]; DatagramPacket paper=new DatagramPacket(buf,0,buf.length); socket.receive(paper); String text=new String(buf,0,paper.getLength()); System.out.println(text); String massage="哈喽,我是服务端消息!"; byte[] data=massage.getBytes(StandardCharsets.UTF_8); DatagramPacket packet=new DatagramPacket(data,0,data.length,paper.getSocketAddress()); socket.send(packet); socket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
客户端程序编写
import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; public class UDPServer { public static void main(String[] args) { try { DatagramSocket socket=new DatagramSocket(9000); byte[] buf=new byte[1024]; DatagramPacket paper=new DatagramPacket(buf,0,buf.length); socket.receive(paper); String text=new String(buf,0,paper.getLength()); System.out.println(text); String massage="哈喽,我是服务端消息!"; byte[] data=massage.getBytes(StandardCharsets.UTF_8); DatagramPacket packet=new DatagramPacket(data,0,data.length,paper.getSocketAddress()); socket.send(packet); socket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
URL编程
URL概念
统一资源定位符
URL组成
- 协议名 :// 主机名(或者IP地址): 端口号/资源
- http://localhost:8080/web/a.jpg
- http://www.oracle.com/index.html
URL编程
- URL
- URLConnection
URL编程思路
- 创建URL对象
- 调用URL对象的openConnection方法,获得URLConnection
- 调用URLConnection方法的getInputStream,获得输入流,从而读取资源
- I/O操作
- 关闭I/O流
代码示例
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class TestURL { public static void main(String[] args) { try { //创建URL对象 URL url=new URL("https://www.baidu.com/"); //调用URL的openConnection方法获取URLConnection连接对象 URLConnection connection= url.openConnection(); //调用URLConnection的getInputStream方法获取输入流 InputStream is=connection.getInputStream(); //读取流的文本信息 BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String line=null; while((line=reader.readLine())!=null){ System.out.println(line); } reader.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }