网络编程
1.概述
计算机网络:
计算机网络将地理位置不同、功能独立的多个计算机系统互联起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,网络软件/708424)实现网络中资源共享和信息传递的系统。
网络编程的目的:
传播交流信息,数据交换,通信。
想要达到这个效果需要什么:
- 如何准确定位网络上的一台主机,IP地址,定位计算机上的某个资源
- 如何传输数据?
javaweb:网页编程 B/S
网络编程:TCP/IP C/S
2.网络通信的要素
如何实现网络的通信?
通信双方地址:
- ip
- 端口号
规则:网络通信协议
TCP/IP

3.IP
ip地址:inetAddress
唯一定位一台网络上的计算机
127.0.0.1:本机localhost
ip地址的分类
- ipv4/ipv6
- ipv4:127.0.0.1,4个字节组成。
- ipv6:aaaa : aaaa :aaaa :aaaa :aaaa :aaaa :aaaa :aaaa,128位。8个无符号整数
- 公网(互联网)-私网(局域网)
- ipv4/ipv6
域名:记忆IP问题!
//测试IP
public class TestIntetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
InetAddress inetAddress2 = InetAddress.getByName("localhost");
System.out.println(inetAddress);
System.out.println(inetAddress2);
//查询网站IP地址
InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress1);
//常用方法
System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
System.out.println(inetAddress2.getHostAddress());//ip
System.out.println(inetAddress2.getHostName());//域名,或自己电脑名字
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
4.端口
端口表示计算机上的一个程序的进程
不同的进程有不同的·端口号,用来区分软件
被规定0~65535
TCP,UDP:65535*2 tcp:80,udp:80,单个协议下端口号不能冲突
端口分类
公有端口0~1023
HTTP: 80
HTTPS: 443
FTP: 21
Telent: 23
程序注册端口:1024~49151,分配用户或者程序
- Tomcat : 8080
- MySQL:3306
- Oracle:1521
动态、私有:49152~65535
netstat -ano #查看所有端口 netstat -ano|findstr " " #查看指定端口 tasklist|findstr " " #查看指定端口的进程
public class TestInetSocketAddress {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
InetSocketAddress inetSocketAddress1 = new InetSocketAddress("localhost", 8080);
System.out.println(inetSocketAddress);
System.out.println(inetSocketAddress1);
System.out.println(inetSocketAddress.getAddress());
System.out.println(inetSocketAddress.getHostName());//地址
System.out.println(inetSocketAddress.getPort());//端口
}
}
5.通信协议
协议:约定
网络通信协议:速率,传输码率,代码结构,传输控制
问题;非常复杂
大化小:分层
TCP/IP协议簇:实际上是一组协议
重要:
TCP:用户传输协议
UDP:用户数据报协议
出名的协议:
- TCP:
- IP:网络互联协议
TCP UDP对比
TCP:打电话
连接,稳定
三次握手,四次挥手
三次握手:最少需要三次,保证稳定连接A:连接? B:回答 A:连接 A:要断开! B:询问? B:询问? A:断开!
- 客户端,服务端
- 传输完成,释放连接,效率低
UDP:发短信
- 不连接,不稳定
- 客户端、服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
6.TCP
客户端
- 连接服务器Socket
- 发送消息
//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket = null;
OutputStream outputStream = null;
try {
//要知道服务器的地址
InetAddress byName = InetAddress.getByName("127.0.0.1");
//端口号
int port = 9999;
//创建一个socket连接
socket = new Socket(byName,port);
//发送消息 io流
outputStream = socket.getOutputStream();
outputStream.write("欢迎".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器
- 建立服务的端口ServerSocket
- 等待用户的链接 accept
- 接收用户的消息
//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
//要有一个地址
serverSocket = new ServerSocket(9999);
//等待客户端连接
socket = serverSocket.accept();
//读取客户端的消息
inputStream = socket.getInputStream();
//管道流
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1 ){
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (byteArrayOutputStream != null){
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null){
try {
inputStream.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();
}
}
}
}
}
文件上传
服务器
public class TcpServerDemo02 {
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//监听客户端连接
Socket socket = serverSocket.accept();//阻塞式监听
//获取输入流
InputStream inputStream = socket.getInputStream();
//文件输出
FileOutputStream outputStream = new FileOutputStream(new File("图片.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
//通知客户端接收完毕
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write("接收完毕".getBytes());
//关闭资源
outputStream1.close();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端
public class TcpClientDemo02 {
public static void main(String[] args) throws IOException {
//1.创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//创建输出流
OutputStream outputStream = socket.getOutputStream();
//读取文件
FileInputStream fileInputStream = new FileInputStream(new File("基础语法/src/com/liang/Internet/demo02/5.jpg"));
//写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fileInputStream.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
//通知服务器,我已经结束了
socket.shutdownOutput();//我已经传输完了
//确定服务器接收完毕,才能断开连接
InputStream inputStream = socket.getInputStream();
//String byte[]
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream.read(buffer2)) != -1){
byteArrayOutputStream.write(buffer2,0,len2);
}
System.out.println(byteArrayOutputStream.toString());
//关闭资源
byteArrayOutputStream.close();
inputStream.close();
fileInputStream.close();
outputStream.close();
socket.close();
}
}
Tomcat
服务端
自定义 S
Tomcat服务器 S
客户端
- 自定义 C
- 浏览器 B
7.UDP
发短信:不用连接,但需要知道地址
发送消息
//不需要连接服务器
public class UdpClientDemo01 {
public static void main(String[] args) throws IOException {
//建议一个Socket
DatagramSocket datagramSocket = new DatagramSocket();
//建个包
String msg = "服务器";
//发送给谁
InetAddress localhost = InetAddress.getByName("localhost");
int port =9090;
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,9090);
//发送包
datagramSocket.send(datagramPacket);
//关闭流
datagramSocket.close();
}
}
接收消息
//还是要等待客户端连接
public class UdpServerDemo01 {
public static void main(String[] args) throws IOException {
//开放端口
DatagramSocket datagramSocket = new DatagramSocket(9090);
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);//接收
datagramSocket.receive(datagramPacket);//阻塞接受
System.out.println(datagramPacket.getAddress().getHostName());
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
//关闭连接
datagramSocket.close();
}
}
循环发送消息
public class UdpSenderDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8888);
while (true){
//准备数组:控制台读取System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
byte[] bytes = s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",6666));
socket.send(packet);
if (s.equals("bye")){
break;
}
}
socket.close();
}
}
循环接收消息
public class UdpReceiveDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6666);
while (true){
//准备接收包裹
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
socket.receive(packet);//阻塞式接收包裹
//断开连接 bye
String s = new String(packet.getData(), 0, packet.getLength());
System.out.println(s);
if (s.equals("bye")){
break;
}
}
socket.close();
}
}
发送消息,即可以为发送方,也可以为接收方
public class UdpSenderDemo02 implements Runnable{
private DatagramSocket socket;
private int Fromport;
private int toPort;
private String toIP;
BufferedReader reader;
public UdpSenderDemo02(int fromport, int toPort, String toIP){
Fromport = fromport;
this.toPort = toPort;
this.toIP = toIP;
try {
socket = new DatagramSocket(fromport);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String s = reader.readLine();
byte[] bytes = s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(toIP, toPort));
socket.send(packet);
if (s.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
}
}
}
public class UdpReceiveDemo02 implements Runnable{
DatagramSocket socket ;
private int fromPort;
private String msg;
public UdpReceiveDemo02( int fromPort,String msg){
this.fromPort = fromPort;
this.msg = msg;
try {
socket= new DatagramSocket(fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
//准备接收包裹
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
socket.receive(packet);//阻塞式接收包裹
//断开连接 bye
String s = new String(packet.getData(), 0, packet.getLength());
System.out.println( msg +" : " + s);
if (s.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
public class TalkA {
public static void main(String[] args){
new Thread(new UdpSenderDemo02(6584,6666,"localhost")).start();
new Thread(new UdpReceiveDemo02(9090,"B")).start();
}
}
public class TalkB {
public static void main(String[] args) {
new Thread(new UdpSenderDemo02(9999,9090,"localhost")).start();
new Thread(new UdpReceiveDemo02(6666,"A")).start();
}
}
URL
统一资源定位符:定位资源的,定位互联网上的某一个资源
DNS域名解析:将域名变成ip地址
协议://IP地址:端口/项目名/资源
public class URLDemo01 {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=lwj&&password=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());//参数
}
}
public class URLDown {
public static void main(String[] args) throws IOException {
//下载地址
URL url = new URL("http://localhost:8080/lwj/Text.txt");
//连接到这个资源 HTTP
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("text.txt");
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1){
fileOutputStream.write(buffer,0,len);
}
fileOutputStream.close();
inputStream.close();
urlConnection.disconnect();//断开连接
}