网络编程概述:
1.计算机网络:
把不同区域的计算机(广义上的),通过通信设备和线路连接起来,可以实现数据的传输和共享的系统.
实现计算机之间联系,必须有介质连接.最开始在一间办公室,后来一栋楼,一个城市,一个国家,全球
2.网络编程是什么:
java语言支持网络之间的传递信息,由JVM控制,并在Java里实现一个跨平台网络库
(1)网络编程的目的:
直接或间接的通过网络与其他计算机进行通讯。
(2)网络编程中存在的问题:
1.怎样准确定位网络上的主机。
2.找到主机后如何可靠高效进行数据传送。
网络模型:
osi参考模型,是一个理想化标准化模型,分为7层
实际上使用Tcp/Ip网络模型分为4层:应用层,运输层,网络层,物理链路层
网络通信要素:
Ip:
在网络世界中,是计算机的地址
局域网地址: 192.168.1.20 连接到路由器,会自动分配ip
广域网地址: 家里的宽带 与外界连接
本机地址: 本地回环地址 127.0.0.1
端口:
是计算中运行中的程序的编号,对应的是程序
ip找主机,端口找程序
ip+端口 找到目标计算机 以及你想要的程序.
端口号0-65535之间 由于 0-1024被一些系统程序,所以我们开发的程序可以从1024-65535区间定义,但是不能与已有的端口冲突
通信协议:
传输层有两个主要的协议:
TCP:
使用Tcp协议进行数据传输前, 必须先要检测网络是否通畅, 客户端是否能连接到服务器端,
如果能连接到,则进行数据传输,如果连接不到,会报错.
传输前采用三次握手
安全可靠,传输完毕后要释放已建立的链接,效果低
传输完毕后采用四次挥手
三次握手:(通俗易懂大白话如下:)
1.客服端给服务器端发送一个消息,看服务器端是否可以收到
2.服务器端收到消息,并向客服端也发送一个消息,看客服端是否可以收到,同时告诉客服端自己 可以收到他的消息
3.客服端向服务器端再次发送消息,告诉服务器自己可以收到他的消息
抽象用图表示:
四次挥手(通俗易懂大白话:)
1.客服端给服务器端发送消息请求断开
2.服务器端给客服端向客服端做出一个反馈
3.服务器端把没有发完的数据全部发送给客户端
4.客户端最后再向服务端发送一个最终的断开信号
抽象用图表示:
UDP:
不需要建立连接,不可靠,发送数据结束时不用释放资源,速度快
TCP编程:
Socket:
package newday7;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class wangluo {
public static void main(String[] args) {
//服务器端
try {
ServerSocket serverSocket=new ServerSocket(9999);
System.out.println("服务器开启成功");
Socket socket=serverSocket.accept();//监听
System.out.println("有客户连接到服务器");
//接受客户端发送的信息
InputStream inputStream =socket.getInputStream();//获取与Socket相关联的字节输入流,用于从Socket中读数据
byte[]bytes=new byte[100];
int size=inputStream.read(bytes);
String s=new String(bytes,0,size);
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器开启失败");
}
}
}
package newday7;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class wangluo1 {
public static void main(String[] args) {
//客服端
try {
Socket socket = new Socket("192.168.124.158", 9999);
OutputStream outputStream = socket.getOutputStream();//获取与Socket相关联的字节输出流,用于向Socket中写数据。
//String s="你好";
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
outputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接服务器失败");
}
}
}
UDP编程
eg:接收端:要指定监听的接口
package newday8;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receive {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket=new DatagramSocket(9999);
//封装一个数据对象,
byte[]bytes=new byte[50];
DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);
datagramSocket.receive(datagramPacket);//真正接收
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
eg:发送端:
package newday8;
import java.io.IOException;
import java.net.*;
public class Send {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket=new DatagramSocket();
//负责发送数据
byte[]bytes="12345".getBytes();
DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length, InetAddress.getByName("127.0.0.1"),9999);
datagramSocket.send(datagramPacket);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}