网络编程
1.1、概述
计算机网络时指将地理位置不同的具有独立功能的多台计算机以及外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
网络编程的目的:
无线电台:传播交流信息、数据交互、通信
想要达到这个效果需要什么:
·1.如何准备的定位网络上的一台主机 ,定位到这个计算机上的某个资源
2.找到了这个主机,如何传输数据呢?
javaweb: b/s
网络编程:TCPIP C/S
网络通信的要素
人工智能:
智能汽车:工厂,人少
如何实现网络的通信:
通信双方的地址:
-IP
-端口号
-192.168.16.124:5900
规则:网络通信的协议
四层概念模型:
应用层
应用层:HTTP、TFTP、FTP、NFS、WAIS、SMTP
表示层:Telnet、Rlogin、SNMP、Gopher
会话层:SMTP、DNS
传输层:
传输层:TCP、UDP
网络层:
网络层:IP、ICMP、ARP、RARP、AKP、UUCP
数据链路层:
数据链路层:FDDT、Ethemet、Arpanet、PDN、SLTP、PPP
物理层:IEEE 802.1A、IEEE 802.2到IEEE 802.11
小结:
1.网络编程中有两个问题:
如何准确的定位到网络上的一台或者多台主机
找到主机之后如何进行通信
2.网络编程中的要素
IP和端口号
网络通信写协议
3.万物皆对象
IP
IP地址:InetAddress
唯一定位一台网络上计算机
127.0.0.1:本机 local host
IP地址的分类:
IP地址分类:
IPv4 127.0.0.1,四个字节组成,0-255
ipv6:128位,八个无符号整数
2001:0bb2:aaaa:0015:0000:23
55:1abc5:5236
公网(互联网)-私网(局域网)
ABCD类地址
192.168.xx.xx 专门给组织内部使用的
域名:记忆ip问题:
IP:www.jd.com
package StudyInternet;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 测试inetAddress类
*/
public class TestInterAddress {
public static void main(String[] args) throws UnknownHostException {
//查询本机地址
InetAddress inetAddress =InetAddress.getByName("192.168.8.43");
System.out.println(inetAddress);
InetAddress inetAddress1 =InetAddress.getByName("localhost");
System.out.println(inetAddress1);
InetAddress inetAddress2 =InetAddress.getLocalHost();
System.out.println(inetAddress2);
//查询网站ip地址
InetAddress inetAddress3 =InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress3);
//常用方法
System.out.println(inetAddress3.getAddress());
System.out.println(inetAddress3.getCanonicalHostName());//规范的名字
System.out.println(inetAddress3.getHostAddress());//ip
System.out.println(inetAddress3.getHostName());//域名或者自己电脑的名字
}
}
端口
端口表示计算机上的一个程序的进程:
不同的进程有不同的端口号!区分软件
被规定0-65535
TCP或者UDP端口 65535*2,单个协议下端口号不能冲突
端口分类:
公有端口:0-1023
HTTP:80
HTTPS:443
FTP:21
Telent:23
程序注册端口:1024-49151,分配给用户或者程序
Tomact:8080
MySql:3306
Oracle:1521
动态、私有:49152-65535
netstat: -ano查看所有的端口
netstat -ano findstr “5900” # 查看指定的端口
tasklist | findstr “8696 #” 查询指定端口的进程
通信协议
协议:约定,好比我们现在说的是普通话。
网络通信协议:速率,传输码率,代码结构,传输控制…
问题:非常的复杂
TCP/IP协议簇:实际上是一组协议
重要的:
TCP:用户传输协议
UDP:用户数据报协议
出名协议:
TCP:
IP:网络互连协议
TCP和UDP对比:
TCP:打电话
连接、稳定
三次握手、四次挥手
客户端、服务端
传输完成,释放连接,效率低
UDP:发短信
不连接,不稳定
客户端、服务端,没有明确的界限
不管有没有准备号,都发给你
TCP
客户端:
1.连接服务器 socket
2.发送消息
package StudyInternet;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* 客户端
*/
public class TcpClientDemo0 {
public static void main(String[] args) {
Socket socket =null;
OutputStream os =null;
try {
//1.要知道服务器的地址
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
//2.端口号
int port =9999;
//3.创建一个Socket连接
socket = new Socket(serverIp,port);
//4.发送消息
os = socket.getOutputStream();
os.write("你好,欢迎学生".getBytes());
}
catch (IOException e){
e.printStackTrace();
}
finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端:
1.建立服务的端口 ServerSocket
2.等待用户的连接 accept
3.接受用户信息
package StudyInternet;
import jdk.nashorn.internal.objects.NativeError;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class TcpServerDemo0 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream by = null;
try {
//1.我有一个地址
serverSocket = new ServerSocket(9999);
//2.等待客户端连接过来
socket = serverSocket.accept();
//3.读取客户消息
is = socket.getInputStream();
//管道流
by = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
by.write(buffer, 0, len);
}
System.out.println(by.toString());
}
catch(IOException e){
e.printStackTrace();
}
finally{
if (by!=null){
try {
by.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();
}
}
}
}
}
文件上传:
初始Tomcat
服务端
自定义
Tomcat服务器
客户端
自定义
浏览器
UDP
发短信:不用连接,需要知道对方的地址
Datagram Packet,有构造方法,可以new
//客户端代码
//客户端
package StudyInternet;
import java.net.*;
/**
* Udp
*/
//不需要连接服务器
public class TestUdpDemo1 {
public static void main(String[] args) throws Exception {
//1.建立一个Socket
DatagramSocket socket = new DatagramSocket(8080);
//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);
//关闭资源
socket.close();
}
}
//服务端
package StudyInternet;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//还是要等待客户端的连接
public class TestUdpServerDemo1 {
public static void main(String[] args) throws Exception {
//开放端口
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 StudyInternet.StudyWechat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UpreceiveDemo1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);
while(true){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
//断开连接 bye
byte[] data =packet.getData();
String receiveData = new String(data, 0, data.length);
System.out.println(receiveData);
if(receiveData.equals("bye")){
break;
}
}
socket.close();
}
}
//发送方
package StudyInternet.StudyWechat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
public class UpsenderDemo1 {
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();
}
}