今天小编学习了一点网络编程的知识,现在就来分享给大家,请大家多多指教!
计算机网络的概念
网络即将不同区域的电脑连接到一起, 组成局域网、城域网或广域网。把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。就这个观念,小编感觉从抽象的角度来讲,中国的网络也可以抽象成一个局域网了,所有人通过网线,连城一个“局域网”,局域网、城域网和广域网就是根据计算机数量的不同来区分。
主要功能:资源共享、信息传输与集中处理、均衡负荷与分布处理。
网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,这样双方才可以互相沟通;网络通信协议由三个要素组成 : 语义 、 语 法 、 时序。
语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
网络通信接口
为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此 之间能进行信息交换。接口包括两部分:
- 硬件装置: 实现结点之间的信息传送;
- 软件装置: 规定双方进行通信的约定协议
网络分层
通信协议的分层
OSI七层模型:“应表会传网数物”。
封装
拆封
IP位置
( IP) 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。 在因特网中,它是能使连接到网上的所有计算机 网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规 则。任何厂家生产的计算机系统,只要遵守 IP 协议就可以与因特网互连互通。 端口:区分数据流向的软件 0-65535 不要使用 1024 以下的端口 ,每一个协议拥有自己的端口,在同一个协议下端口不能重复 FTP:21 HTTP:80。
在我看来IP就是你进入网络的唯一标识,识别你的身份的,任何在网络的操作都会留下痕迹,通过IP即可查询。
Java将复杂的东西封装起来,给了一些方法,即可查询自己的IP或别人的IP。上代码:
InetAddress intAddress=InetAddress.getLocalHost();
//获取主机名字和IP地址
System.out.println(InetAddress.getLocalHost());
//获取对应地址
System.out.println(InetAddress.getByName("sad")+" "+InetAddress.getByName("127.0.0.1"));
//获取主机名字
System.out.println(intAddress.getHostName());
//获取IP地址
System.out.println(intAddress.getAddress());
端口(port)和url
端口
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。可以类比为:IP 相当于公司,端口相当于公司各部门,URL,相当于各部门的人员。
//1) 、获取对象
InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
//2) 、方法
getAddress() //返回 InetAddress 对象
getPort() //返回端口
getHostName() //返回域名
url
URL全称是Uniform Resource Location,也就是统一资源位置。实际上,URL就是一种特殊的URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以通过它来获取URL对应的资源。
URL所表示的网络资源位置通常包括用于访问服务器的协议(如http、ftp等)、服务器的主机名或者IP地址、以及资源文件在该服务器上的路径。典型的URL例如http://localhost/myProject/index.html
URL的语法表示形式为:
protocol://userInfo@host:port/path?query#fragment 协议://用户信息@主机名:端口/路径?查询#锚点
IP地址唯一标识了Internet上的计算机,端口标识了计算机上的软件程序,而URL则标识了这些计算机上的资源。
类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
为了方便程序员编程,JDK中提供了URL类,该类的全名是 java.net.URL ,有了这样一个类,就可以使用它的各种方法来对URL对象进行分割、合并等处理。 java.net.URL 类(后面直接叫URL)是JDK对URL的统一抽象,它是一个final修饰的类,也就是不允许派生子类。
网络爬虫原理
URL url=new URL("https://www.baidu.com/img/bd_logo1.png");
InputStream in1=url.openStream();
File file=new File("bd_logo1.png");
OutputStream os=new FileOutputStream(file);
byte [] by=new byte[1024];
int len=0;
while ( (len=in1.read(by))!=-1) {
os.write(by,0,len);
}
os.flush();
in1.close();
os.close();
System.err.println("OK");
最简单的爬虫,爬了一张百度的LOGO,原理和输入输出流挂钩,但获取时要通过URL类。
传输层协议
协议
TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低
UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、效率高
UDP编程: DatagramSocket,DatagramPacket
UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
其特点为:非面向连接;传输不可靠;数据可能丢失。
DatagramSocket:用于发送或接收数据包:
当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象, 在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将 DatagramPacket 发送到网络上,然后被客户端的DatagramSocket接收。
DatagramSocket有两种构造函数。一种是无需任何参数的,常用于客户端。另一种需要指定端口,常用于服务器。常用方法:send,receive, close
DatagramPacket:数据容器(封包)的作用:
常用方法:构造函数、getAddrress(获取发送或接收方计算机的Ip地址)、getData(获取发送或接收的数据),setData(设置发送的数据
服务器端
①创建服务器 DatagramSocket类 +指定端口 (定义服务器端的监听端口)
②准备接收容器字节数组 +封装成DatagramPacket数据包 (准备容器接收数据)
③接收数据
④分析数据
⑤释放资源
客户端示例
①创建客户端 DatagramSocket类 +指定端口 (定义客户端的监听端口)
②准备数 据 字节数组
③封装成数据包,需要指定包发送的地址+端口即服务器地与端口 (打包要发送的数据)
④发送数据
⑤释放资源
服务器端代码
public class Server {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8999);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法
String string = new String(dp.getData(),0,dp.getLength());
//dp.getLength()返回实际收到的数据的字节数
System.out.println(string);
ds.close();
}
}
客户端代码
public class Client {
public static void main(String[] args) throws Exception {
// 创建要发送数据报包的工具,我本身占用9000端口向外面机器发数据包
DatagramSocket ds = new DatagramSocket(9000);
byte[] b = "aaaa".getBytes();
//必须告诉数据包要发到哪里去, 封装数据时才 指定 目标电脑以及端口
DatagramPacket dp = new DatagramPacket(b,b.length,new
InetSocketAddress("localhost",8999));
ds.send(dp);
ds.close();
}
}
TCP 编程:ServerSocket Socket
transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输 层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),类似于拨打电话。
特点
基于 tcp 协议,建立稳定连接的点对点的通信;实时、快速、安全性高、占用系统资 源多、效率低;“请求-响应”模式:
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
• Socket:发送 TCP 消息
• ServerSocket:创建服务器
套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通 过网络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点关闭连接。
实际上,套接字只是计算机上已编号的端口。如果发送方和接收方计算机确定好端口,他们就可以通信了。
服务器端
①创建服务器指定端口,创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口 接收客户端发来的消息!)
②等待客户端连接
ServerSocket调用accept()方法,使之处于阻塞状态
③分析接收数据
利用Socket进行接收和发送数据
客户端
①连接服务器: 创建客户端 +指定服务器地址 +端口
创建客户机Socket,并设置服务器的ip及端口,客户机发出连接请求,建立连接。
②发送数据
通过Socket发送数据,和接收数据
服务端代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class BasicSocketServer {
public static void main(String[] args) {
try {
//建立服务器端套接字
ServerSocket serverSocket = new ServerSocket(8888);
//tcp端口一共多少个??
//监听,等待客户端请求,并愿意接收连接。
System.out.println("服务端建立监听");
Socket socket = serverSocket.accept();
//通过流向客户端发送数据
// ObjectOutputStream oos = new
ObjectOutputStream(socket.getOutputStream());
// oos.writeObject("aaaaa");
// oos.close();
BufferedWriter bw = new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream()));
bw.write("hhhh");
bw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 最简单的Socket客户端
*
*/
public class BasicSocketClient {
public static void main(String[] args) {
try {
//指定的是所要连接的服务器的ip和端口。而不是自己机器的端口。发送端
口是随机的。
Socket socket = new
Socket(InetAddress.getLocalHost(),8888);
// ObjectInputStream ois = new
ObjectInputStream(socket.getInputStream());
// String string = (String) ois.readObject();
// System.out.println(string);
BufferedReader br = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样就实现了简单的通信对接对接
小编自己写了一份简易的聊天socket,已经上传,有需要的可以自己下载!
总结:网络编程很有趣,小编接触的是最初级的,所以继续加油努力学习,将来也写个TX,发家致富~.~
静以修身,俭以养德,非淡泊无以明志,非宁静无以致远!