TCP/IP协议是目前世界上应用最为广泛的协议。
是以TCP和IP为基础的不同层次上多个协议的集合。
也称:TCP/IP协议族 或 TCP/IP协议栈
TCP:Transmission Control Protocol 传输控制协议
IP : Internet Protocol互联网协议
TCP/IP分为5层
应用层 HTTP超文本传输协议
传输层
网络层 IP在网络层
数据链路层
物理层 例如网线,网卡等
IP地址:
为实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识----IP地址
IP地址格式:数字型,如:192.168.0.1
IPV4:IP传输协议第四个版本,长度为32位的2进制。
端口:
1:用于区分不同应用程序
2:端口号范围为0~65535,其中0~1023为系统所保留
3:IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UPD的基础
4:常用的端口号http:80 ftp:21 telnet:23
Java中的网络支持
针对网络通信的不同层次,Java提供的网络功能有四大类:
1 InetAddress:用于标识网络上的硬件资源。也就是IP地址的相关信息
2 URL:统一资源定位符 通过URL可以直接读取或写入网络上的数据。
3 Sockets:使用TCP协议实现网络通信的Socket相关的类。
4 Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信。
Java中InetAddress类
用于标识网络上的硬件资源。也就是IP地址的相关信息
实例化的方法
InetAddress address=InetAddress. getLocalHost();//通过本机端口号的方式获取InetAddress实例
InetAddress address=InetAddress. getByName("admin");//通过主机名的方式获取InetAddress实例
InetAddress address=InetAddress. getByName("1.1.1.10");//通过IP地址的方式获取InetAddress实例
提供的一些方法:
address.getHostName():返回主机名
address.getHostAddress():返回IP地址
address.getAddress();返回字节数组形式的IP地址,返回一个byte[ ]字节数组。
URL
1 URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址。
2 URL由两部分组成:协议名称和资源名称,中间用冒号隔开。
如http://www.imooc.com/video/2858
http为协议名称,后面的内容统称为资源名称,video为目录,2858是资源,省略了端口号。
3 在java.net包中,提供了URL类来表示URL。
URL代表一个统一资源定位符,它时指向互联网“资源”的指针。
常用方法:
URL url2=new URL("http://www.imooc.com"); //创建一个URL对象
//根据现有的URL去创建一个新的URL。实际上是指定了更详细的资源位置
URL url=new URL(url,"/index.html?username=tom#test"); //?后面表示参数,#后面表示锚点
url.getProtoclo():获取协议信息。 输出为:http
url.getHost() :获取主机名 输出为:www.imooc.com
url.getPort():获取端口号 //如果未指定端口号,则使用默认的端口号,所以这个方法返回值为-1。输出为:-1
url.getPath():获取文件路径 输出为:/index.html
url.getFile():获取文件名 输出为:/index.html?username=tom
url.getRef():获取相对路径 输出为:test
url.getQuery():查询字符串 输出为:username=tom
URL url=new URL("http://www.baidu.com");
InputStream is=url.openSteam();//通过URL的openStream方法获取URL对象所表示的资源的字节输入流
InputStreamReader isr=new InputStreamReader(is);//将字节输入流转换为字符输入流。此处可以利用重载的方法,在第二个参数上添加指定字符编码。
BufferedReader br=new BufferedReader(isr);
String data=null;
while((data=br.readLine())!=null){
syso("data");
}
br.close();
isr.close();
is.close();
Socket简介
TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据。
Socket通信实现步骤
1:创建ServerSocket和Socket
2:打开连接到Socket的输入/输出流
3:按照协议对Socket进行读/写操作
4:关闭输入输出流,关闭Socket
ServerSocket类
ServerSocket:此类实现服务器套接字,服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
常用的构造方法:
ServerSocket(int port):创建绑定到特定端口的服务器套接字。
常用方法:
Socket accept():监听并接收到此套接字的连接。
void close():关闭此套接字
InetAdress getInetAddress():返回此服务器套接字的本地地址。
int getLocalPort():返回此套接字在其上监听的端口。
Socket类
Socket类实现客户端套接字
常用构造方法:
Socket(InetAddress address,int port):根据InetAddress实例和端口号来创建
Socket(String host,int port):根据主机的地址和端口号创建
常用方法
void close():关闭此套接字
InetAddress getInetAddress():返回套接字连接的地址,返回InetAddress实例
InputStream getInputStream():返回此套接字的输入流
OutputStream getOutputStream():返回此套接字的输出流
void shutdownInput():关闭Socket输入流
void shutdownOutput():关闭Socket输出流
用Socket套接字实现服务器和客户端的交互
服务端:
public class Server {
public static void main(String[] args) throws Exception{
//1:创建一个服务器端ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8452);
//2:调用accept()方法开始监听,,进入阻塞状态,等待客户端的连接
Socket socket=serverSocket.accept();
//3:获取输入流用,来读取客户端信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);//将字节流包装成字符流
BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
String data=null;
while((data=br.readLine())!=null){
System.out.println(data);
}
socket.shutdownInput();//关闭输入流
//4:获取输出流,响应客户端的请求,返回给客户端一条信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("Welcome");
pw.flush();//调用flush()方法缓冲输出
//5:关闭相应的资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
}
}
客户端
public class Client {
public static void main(String[] args) throws Exception, IOException {
//1:创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//2:获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
//获取输入流,并读取服务器端的响应信息。
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String data=null;
while((data=br.readLine())!=null){
System.out.println("Welcome too");
}
//4:关闭相关资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
}
}
基于UPD的Socket编程
UPD协议(用户数据报协议)是无连接,不可靠的,无序的。
UPD协议以数据报作为数据传输的载体
进行数据传输时,首先需要将传输的数据定义成数据包(Datagram),在数据报中指明数据所要达到的
Socket(主机地址和端口号),然后再将数据报发送出去。
相关的类:
DatagramPacket:表示数据报包
常用的构造方法
DatagramPacket(byte[ ] buf,int length):构造DatagramPacket,用来接收长度为length的数据包
DatagramPacket(byte[ ] buf,int length,InetAddress address,int port):构造数据报包,用来将长度为length
的包发送到指定主机上的指定端口号。
DatagramSocket:此类用来发送和接收数据报包的套接字。
常用构造方法:
DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port,InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。
常用方法:
void close():关闭
InetAddress getInetAddress():返回此套接字连接的地址。
int getPort():返回此套接字的端口
void send(DatagramPacket p):从此套接字发送数据报包
void receive(DatagramPacket p):从此套接字接收数据报包。
服务端
public class UPDServer {
public static void main(String[] args) throws Exception {
//1:创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8452);
//2:创建数据报,用于接收客户端发送的数据
byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//3:接收客户端发送的数据
socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
//4:读取数据
String info=new String(data,0,packet.getLength());
System.out.println("我是服务器:客户端说"+info);
}
}
客户端:
public class UPDClient {
public static void main(String[] args) throws Exception {
//1:定义服务器的地址,端口号,和数据
InetAddress address=InetAddress.getByName("localhost");
int port=8452;
byte[] data="用户名:admin;密码:123".getBytes();
//2:创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length, address,port);
//3:创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4:向服务器发送数据报
socket.send(packet);
}
}
总结:
使用TCP通信传输对象:一般用到ObjectOutputStream来写对象
socket编程传递文件:利用字符流传输