网络编程Socket
名词解释
互联网(Internet):又称国际网络,指的是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。
点与点相连
万维网(www-world wide web):基于客户机/服务器方式的信息发现技术和超文本技术的综合。
端与端相连
物联网(IOT-Internet of things):即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与网络结合起来而形成的一个巨大网络,实现任何时间、任何地点,人、机、物的互联互通.
物与物相连
网络编程:
让计算机与计算机之间建立连接,进行通讯
OSI网络架构
简介:
Open System Interconnect
开放式系统互连
存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用
一层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线、 光导纤维)
作用:建立、维护、断开物理连接。
第二层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性。(MAC)
TCP/IP网络框架
IP协议
作用:接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,
拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传
输。
第三层:网络层负责定义了能够标识所有网络节点的逻辑地址。(IP地址)
作用:逻辑寻址,IP地址,在下两层的基础上向资源子网提供服务
第四层: 传输层负责是否选择差错恢复协议、数据流重用、错误顺序重排。(TCP、 UDP)
作用:提供可靠和不可靠的传输机制,TCP、UDP
第五层:会话层负责使应用建立和维持会话,使通信在失效时继续恢复通信。(断点续传).
作用:建立、终止、管理实体间的会话连接
第六层:表示层负责定义转换数据格式及加密,允许选择以二进制或ASCII格式传输。
作用:封装数据的格式(加密解密、压缩解压缩)
第七层:应用层负责文件访问和管理、可靠运输服务、远程操作服务。(HTTP、 FTP、SMTP)
作用:人与机器电脑交互的窗口
OSI模型数据传输流程
TCP/IP网络框架
TCP协议: Transmission Control Protocol传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。
UDP协议: User Datagram Protocol用户数据报协议
是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB。
IP协议
简介:
tnternet Protocol Address
互联网协议地址/网际协议地址
分配给互联网设备的数字标签(唯标识)。说人话就是计算机在互联网中的地址
IP地址分为两种:
IPV4: 4字节32位整数,并分成4段8位的进制数,每8位之间用圆点隔开,每8位整数可以转换为一个
0~255的十进制整数。
格式: D.D.D.D
例如: 255.255.255.255
IPV6: 16字节128位整数,并分成8段十六进制数,每1 6位之间用圆点隔开,每16位整数可以转换为一个0~65535的十进制数。
格式: X.X.X.X.X.X.X.X
例如: FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
IPV4应用分类
A类:政府机构,1.0.0.1 ~ 126.255.255.254
B类:中型企业,128.0.0.1 ~ 191.255.255.254
C类:个人用户,192.0.0.1 ~ 223.255.255.254
D类:用于组播,224.0.0.1 ~ 239.255.255.254
E类:用于实验,240.0.0.1 ~ 255.255.255.254
回环地址: 127.0.0.1,指本机,一般用于测试使用。
查看IP命令: ipconfig
测试IP命令: ping D.D.D.D
对应类:InetAddress
常用方法:
public static InetAddress getLocalHost():获取本机地址
如:
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
打印结果:
LAPTOP-RE2FI941/192.168.0.105
public static InetAddress getByName(String host):通过主机名词获取地址
如:
InetAddress inetAddress = InetAddress.getByName("LAPTOPRE2FI941");
System.out.println(inetAddress);
打印结果:
LAPTOP-RE2FI941/192.168.0.105
注意:
127.0.0.1,Localhost,域名都表示本机
public static InetAddress[] getAllByName(String host):获取所有相关地址对象
如:
InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");
for (InetAddress address : addresses) {
System.out.println(address.getHostAddress()+"--"+address.getHostName());
}
输出结果:
14.215.177.39--www.baidu.com
14.215.177.38--www.baidu.com
public String getHostAddress():获取主机地址
public String getHostName():获取主机名词
Port端口
端口号:在通信实体上进行网络通讯的程序的唯一标识。端口分类:
公认端口: 0~1023
注册端口: 1024~49151
动态或私有端口: 49152~65535
常用端口:
MySql: 3306
Oracle: 1521
Tomcat: 8080
SMTP: 25
Web服务器: 80
FTP服务器: 21
TCP/IP的数据传输流程
Socket编程
简介
Socket:套接字,网络中的一个节点
通讯要求:IP地址+端口号
TCP
简介:是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。
注意:分为客户端Scoket与服务器ServerSocket
开发步骤:
服务端:ServerSocket
1,创建ServerSocket,指定端口
2,调用accept等待客户端接入
3,使用输入流,接收客户端请求中的数据
4,使用输出流,给客户端回馈数据(可选)
5,关闭释放资源
客户端:Socket
1,创建Socket对象,指定服务器IP+端口
2,使用输出流,发起请求,给服务器发生数据
3,使用输入流,接收服务器返回的数据(可选)
4,关闭释放资源
代码:
服务器:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws Exception{
ServerSocket listener=new ServerSocket(服务器开放的端口);
System.out.println("服务器已启动...");
Socket socket=listener.accept();
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new
InputStreamReader(is,"utf-8"));
String data=br.readLine();
System.out.println("客户发送:"+data);
br.close();
socket.close();
listener.close();
}
}
客户端:
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws Exception{
Socket socket=new Socket(服务器IP, 服务器开放的端口);
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new
OutputStreamWriter(os,"utf-8"));
bw.write("好久不见");
bw.close();
socket.close();
}
}
客户端和服务端无限期通信
方法类:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class OneService {
private Socket socket;
public OneService(Socket socket) {
super();
this.socket=socket;
}
public OneService() {
super();
}
public void fun(){
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(new Runnable() {
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
String str="";
while(!str.equals("886")&&true) {
str=br.readLine();
System.out.println(str);
}
reader.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
pool.submit(new Runnable() {
@Override
public void run() {
try {
OutputStream stream = socket.getOutputStream();
OutputStreamWriter os = new OutputStreamWriter(stream);
BufferedWriter writer = new BufferedWriter(os);
Scanner sc = new Scanner(System.in);
String str="";
while(!str.equals("886")&&true) {
str=sc.next();
writer.write(str);
writer.newLine();
writer.flush();
}
os.close();
writer.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
pool.shutdown();
}
}
服务端:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket sockets = new ServerSocket(9232);
Socket socket = sockets.accept();
System.out.println(socket.getInetAddress());
OneService oneService = new OneService(socket);
oneService.fun();
}
}
客户端:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("10.35.162.54",9900);
OneService oneService = new OneService(socket);
oneService.fun();
}
}
进行客户端和服务的交互时,输入流与输出流需要注意的地方
在通过输出流将数据输入到文件中,当输入结束后系统回自动在文件末添加EOF(结束标识符,值为-1);输入流在读取时读取到EOF时返回-1,表示文件读取结束,此时可将数据看着存放在内存中,数据末没有EOF进行结尾,因此在读取内存中的数据时在读取完后因为数据末没有EOF因此回进行无限期的等待.
UDP
简介:UDP协议是一种不可靠的网络协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB,速率快
注意:分为接收端与发送端
开发步骤:
发送端:
1.创建发送端的Socket对象(DatagramSocket)
2.创建数据,并打包
3.调用DatagramSocket对象的方法发送数据
4.关闭发送端
接收端:
1、创建接收端的Socket对象(DatagramSocket)
2、创建一个数据包,用于接收数据
3、调用DatagramSocket对象的方法接收数据
4、解析数据包,并在控制台显示
5、关闭接收端
代码:
发送端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] sendData = "要发送的内容".getBytes();
InetAddress address = InetAddress.getByName(接收端的IP);
DatagramPacket packet = new DatagramPacket(sendData,sendData.length, address, 9999);
socket.send(packet);
socket.close();
}
}
接收端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpGet {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b, b.length);
socket.receive(packet);
byte[] data = packet.getData();
int length = packet.getLength();
System.out.println("接收的内容:"+new String(data,0,length));
socket.close();
}
}