JAVA中的网络编程
四层机构:物理层、网络层、传输层、应用层
协议:IP、TCP、UDP、HTTP、FTP、SMTP等
TCP:面向连接的服务。可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。
比如打电话
UDP,无连接的服务。不可靠,差错控制开销较小,传输大小限制在64K以下,不需要建立连接。
比如写信
Socket(套接字)
Socket 是网络上的两个进程经过双向的通信而建立起来的一个实现数据传输的通道,这个双向链路的每一端都是一个Socket。
Socket由IP地址和端口号组成
IP地址:定位到网络中的一台PC
端口号:定位到PC中的一个进程
疑问:
开发者基于TCP协议的网络编程,
是否四层中所有细节都需涉及到呢?
答:
不需要
Java语言是目前最受欢迎的网络编程语言之一,
使用它能够轻松实现网络编程,只需涉及传输层。
Java网络编程涉及到的package: java.net
InetAddress类
URL类
URLConnection类
套接字类
Socket 类
ServerSocket类
DatagramPacket类
Java网络编程涉及到的package: java.io
InputStream/OutputStream
BufferedInputStream/BufferedOutputStream
DataInputStream/DataOutputStream
BufferedReader/PrintWriter
ObjectInputStream/ObjectOutputStream
Java网络编程涉及到的package: java.lang
Thread
Runnable
InetAddress:描述Internet地址的类
常用方法:
static InetAddress getLocalHost();返回本地主机
static InetAddress getByName(String host) 给定主机名,确定主机IP地址
String getHostAddress(); 返回主机IP地址
String getHostName(); 获得主机名
java.net.URL:
URL类代表一个统一资源定位器,一个万维网中的“资源”
一个URL的格式
通信协议://主机:端口/文件
URL(String spec)
方法
openStream()
openConnection()
java.net.URLConnection:
它代表应用程序和 URL 之间的通信链接
此类的实例可用于读取此 URL 引用的资源
构造函数
URLConnection(URL)
方法
connect()
getInputStream()
URL和URLConnection类封装的从远程站点检索信息的复杂性
支持HTTP资源
URL url = new URL(“http://www.gem-inno.com”)
打开一个URL连接
URLConnection urlconn = url.openConnection()
只需打开一个输入流
InputStream in = url.openStream()
Socket:(套接字)
两个网络进程采用套接字方式通信(基于TCP协议)时,因扮演的角色不同,它们使用的套接字也不同。
客户端Socket和服务器端ServerSocket
Socket :
构造方法:
Socket(String host, int port)
Socket(InetAddress address, int port)
Socket类提供的主要方法有:
InetAddress getInetAddress()
int getPort()
void close()
InputStream getInputStream()
OutputStream getOutputStream()
ServerSocket :
构造方法:
ServerSocket(int port)
ServerSocket(int port,int count)
Socket类提供的主要方法有:
Socket accept() throws IOException
void close()
服务器端代码:
客户端代码:
服务端Socket流程:
1.创建一个服务器套接字
2.接受一个连接来自客户机的请求,并返回一个新的套接字
3.从套接字上获得输入流/输出流
4.使用数据包装流
从流中接收/发送信息
释放资源
客户端Socket流程:
1.创建一个套接字
2.从套接字上获得输入流和/或输出流
3.使用数据包装流(可选)
4.从流中接收/发送信息
释放资源
处理并发连接:
一个服务端需要处理多个客户端的连接请求,
使用多线程技术可以解决此类问题。
每当请求到达时,服务器新建一个线程来为这个请求服务。
服务端代码 – 多线程
线程实现类:
客户端代码: