Java自学日记之网络编程(一):InetAddress和InetSocketAddress,套接字以及通信方式的实现

系列文章目录

暂无



前言

网络编程这里只记录如何用java实现,不介绍底层原理了 (我也说不明白)


一、InetAddress和InetSocketAddress

1.作用

网络编程中我们离不开IP地址和端口的套用,而InetAddress和InetSocketAddress就是java提供给我们的一种很好的封装工具

2.InetAddress

(1).封装对象:IP及DNS

(2).获得InetAddress对象的一些方法

InetAddress类没有构造方法,所以不能直接new出一个对象
可以通过InetAddress类的静态方法获得InetAddress的对象

  1. 使用getLocalHost方法为InetAddress创建对象
InetAddress ia = InetAddress.getLocalHost();//获取本地的IP地址
System.out.println(ia);
//输出:主机名+IP地址
  1. 根据域名得到InetAddress对象
InetAddress ia2 = InetAddress.getByName("google.com");
System.out.println(ia2);
//输出:域名+IP地址
  1. 根据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).客户端

  1. 创建Socket对象
Socket socket = new Socket("localhost", 8888);

若发送请求
  1. 创建输入流
OutputStream os= socket.getOutputStream();

这个流只能写入字节数据,如果想写入别的类型的数据,建议再套个处理流

DataOutputStream dos=new DataOutputStream(os);
  1. 写入想传输的数据
dos.writeUTF("我是aftermath hello world");
若接收请求
  1. 创建输出流
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream= new DataInputStream(inputStream);
  1. 写出数据
String s = dataInputStream.readUTF();
System.out.println(s);

  1. 关闭所有流和套接字
dataInputStream.close();
inputStream.close();
dos.close();
os.close();
socket.close();

(2).服务端

  1. 创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(8888);
  1. 等待客户端发来的数据
Socket accept = serverSocket.accept();//返回接到的客户端socket

若接收数据
  1. 创建输出流
InputStream inputStream = accept.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
  1. 读取数据
String str=dataInputStream.readUTF();
System.out.println(str);
若传回数据
  1. 创建输入流
OutputStream outputStream=accept.getOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
  1. 写入信息
dataOutputStream.writeUTF("你好,我是服务器端,我接收到你的请求了");

  1. 关闭所有的流和套接字
dataOutputStream.close();
outputStream.close();
dataInputStream.close();
inputStream.close();
accept.close();
serverSocket.close();

总结

对于socket传输,一个一个开输入输出流太不方便了,从关流的时候就能看出来,可以考虑构造一个对象流传输,输入输出的数据统一用一个对象管理,正文里就不写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aftermath123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值