系列文章目录
暂无
文章目录
前言
网络编程这里只记录如何用java实现,不介绍底层原理了 (我也说不明白)
一、InetAddress和InetSocketAddress
1.作用
网络编程中我们离不开IP地址和端口的套用,而InetAddress和InetSocketAddress就是java提供给我们的一种很好的封装工具
2.InetAddress
(1).封装对象:IP及DNS
(2).获得InetAddress对象的一些方法
InetAddress类没有构造方法,所以不能直接new出一个对象
可以通过InetAddress类的静态方法获得InetAddress的对象
- 使用getLocalHost方法为InetAddress创建对象
InetAddress ia = InetAddress.getLocalHost();//获取本地的IP地址
System.out.println(ia);
//输出:主机名+IP地址
- 根据域名得到InetAddress对象
InetAddress ia2 = InetAddress.getByName("google.com");
System.out.println(ia2);
//输出:域名+IP地址
- 根据ip得到InetAddress对象
InetAddress ia3 = InetAddress.getByName("140.82.112.3");
System.out.println(ia3);
输出:IP本身
2.InetSocketAddress
(1).封装对象:Socket地址(IP地址+端口)
(2).获得InetSocketAddress对象的一些方法
InetSocketAddress有构造方法
public InetSocketAddress(int port);//端口号
public InetSocketAddress(InetAddress addr, int port);//IP地址和端口号
public InetSocketAddress(String hostname, int port);//主机名和端口号
另外还可以用InetSocketAddress自带的getAddress方法创建InetAddress对象
InetAddress address = inetSocketAddress.getAddress();
二、套接字
1.作用
在TCP/IP参考模型的五层模型中,从上层到下层分别为:应用层、传输层、网络互联层、链路层。其中socket套接字就是用来沟通应用层与传输层的
传输层给应用层提供了socket接口,应用层通过与远程主机建立连接
其中,客户端用Socket发出连接请求,服务端用ServerSocket监听进入的连接
2.套接字的初始化
(1).Socket初始化
public Socket()
//构造一个Socket,因为没有指定目标主机和端口,所以不会通过网络进行连接。
public Socket(Proxy proxy)
//通过一个代理构建一个未连接的Socket。
public Socket(String host, int port) throws UnknownHostException, IOException
//通过主机名和端口构建一个Socket。
public Socket(InetAddress address, int port) throws IOException
//通过一个InetAddress 和端口构建一个Socket。
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
//通过一个要连接的远程主机(主机名)和端口,并指定从本地哪个ip和端口连接。
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
//通过一个要连接的远程主机(InetAddress)和端口,并指定从本地哪个ip和端口连接。
(2).ServerSocket初始化
ServerSocket()throws IOException
ServerSocket(int port) throws IOException
ServerSocket(int port, int backlog) throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
在以上构造方法中,参数port指定服务器要绑定的端口(服务器要监听的端口),参数backlog指定客户连接请求队列的长度,参数bindAddr指定服务器要绑定的IP地址
3.socket网络编程实现流程
(1).客户端
- 创建Socket对象
Socket socket = new Socket("localhost", 8888);
若发送请求
- 创建输入流
OutputStream os= socket.getOutputStream();
这个流只能写入字节数据,如果想写入别的类型的数据,建议再套个处理流
DataOutputStream dos=new DataOutputStream(os);
- 写入想传输的数据
dos.writeUTF("我是aftermath hello world");
若接收请求
- 创建输出流
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream= new DataInputStream(inputStream);
- 写出数据
String s = dataInputStream.readUTF();
System.out.println(s);
- 关闭所有流和套接字
dataInputStream.close();
inputStream.close();
dos.close();
os.close();
socket.close();
(2).服务端
- 创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(8888);
- 等待客户端发来的数据
Socket accept = serverSocket.accept();//返回接到的客户端socket
若接收数据
- 创建输出流
InputStream inputStream = accept.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
- 读取数据
String str=dataInputStream.readUTF();
System.out.println(str);
若传回数据
- 创建输入流
OutputStream outputStream=accept.getOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
- 写入信息
dataOutputStream.writeUTF("你好,我是服务器端,我接收到你的请求了");
- 关闭所有的流和套接字
dataOutputStream.close();
outputStream.close();
dataInputStream.close();
inputStream.close();
accept.close();
serverSocket.close();
总结
对于socket传输,一个一个开输入输出流太不方便了,从关流的时候就能看出来,可以考虑构造一个对象流传输,输入输出的数据统一用一个对象管理,正文里就不写了。