@MRsunhuimin
2019-08-01T13:02:08.000000Z
字数 3223
阅读 186
java基础
分为局域网(LAN)、城域网(MAN)和广域网(WAN)
TCP/IP 5层模型
应用层
传输层
网络层
数据链路层
物理层
概念:
唯一标识网络上的每一台计算机
组成:
32位,由4个8位二进制数组成
IP地址 = 网络地址 +主机地址
网络地址:标识计算机或网络设备所在的网段
主机地址:标识特定主机或网络设备
0.0.0.0:本机
127.0.0.1:本机回环地址,用于本机测试
255.255.255.255:当前子网,一般用于向当前子网广播信息
配置和检测:
查看本机的IP地址
ipconfig
测试网络是否通畅
ping 目标IP地址
1. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。
2. 任何一个Socket都是由IP地址和端口号唯一确定的。
3. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
4. Socket也称为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。
5. 在Java语言中,Socket可以分为两种类型:
(1)面向连接的Socket通信协议(TCP,传输控制协议)
(2)面向无连接的Socket通信协议(UDP,用户数据报协议)
首先,Server端Listen指定的某个端口是否有连接请求(建议端口号大于1024);
其次,Client端向Server端发出Connect请求;
最后,Server端向Client端发回Accept消息。
一个连接就建立起来了,会话随即产生。
Server端和Client端都可以通过Send、Writer等方法与对方通信。
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,通常并未使用到显示的close)
1. port(服务器的端口号)
2. backlog(最大客户端等待队列数,可选填)
用于ServerSocket,配置ServerSocket的最大客户端等待队列。等待队列的意思。
下面这个服务器最多可以同时连接3个客户端,其中2个等待队列:
int backlog = 2;
ServerSocket serverSocket = new ServerSocket(port, backlog);
这个参数设置为-1表示无限制,默认是50个最大等待队列,如果设置无限制,那么你要小心了,如果你服务器无法处理那么多连接,那么当很多客户端连到你的服务器时,每一个TCP连接都会占用服务器的内存,最后会让服务器崩溃的。
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
其中address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和 bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。例如:
Socket client = new Socket(“127.0.01.”, 80);
ServerSocket server = new ServerSocket(80);
【注意】在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出异常。
PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。
不过PrintWriter提供println()方法可以写不同平台的换行符,即自动换行,而BufferedWriter可以任意设定缓冲大小,但不能自动换行,需手动。
//OutputStream可以直接传给PrintWriter(BufferedWriter不能接收),如:
PrintWriter pw
= new PrintWriter(new BufferedOutputStream(new FileOutputStream("foo.out")));
//或者用OutputStreamWriter来将OutputStream转化为Wrtier.这时就可以用BufferedWriter了。
端口被占用的结果,需要修改一下端口。
Socket网络编程一般可以分成如下步骤进行:
1. 建立连接
2. 打开Socket关联的输入输出流
3. 数据流中读写信息
4. 关闭所有的数据流和Socket
基于UDP协议的Socket网络编程步骤:
1. 利用 DatagramPacket 对象封装数据包
2. 利用 DatagramSocket 发送数据包
3. 利用 DatagramSocket 接收数据包
4. 利用 DatagramPacket 处理数据包
对比内容 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |