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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 基于java实现Socket套接字一对一聊天系统源码+项目说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 简介 Socket,又称套接字,在TCP/IP协议分层架构中,属应用层和传输层之间的一个抽象层(也有的说是属于传输层),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。 ![在这里插入图片描述](README.assets/01.png) ## 1.2 优点 1. 传输数据时间短,性能高 2. 可以加密,数据安全性强 3. 适合客户端和服务器端之间信息实时交互 4. 传输数据为字节级,传输数据可自定义,数据量小 ## 1.3 缺点 相对于http协议传输,增加了开发量 服务端 1. **创建Socket,bind()绑定地址,listen()监听套接字** > ServerSocket只需要一行代码就可以完成创建、绑定、监听Socket,绑定的地址没填默认就是本机的ip(在源码中InetAddress.anyLocalAddress()方法得出的结论),监听Socket监听的是改Socket的最大连接数,如果队列满时,会出现提示,并拒绝连接(源码的listen(int backlog)方法这样解释)。 ```java ServerSocket serverSocket = new ServerSocket(端口号); ``` 2. **accept()监听连接** > accept()方法侦听要与ServerSocket建立的连接并接受它。该方法会阻塞,直到建立连接。 ``` Socket socket = serverSocket.accept(); ``` 3. **read()读数据** 客户端 1. **创建Socket、connect()连接Socket** 客户端创建Socket,`new Socket(String host, int port);`需要抛出异常,当IP地址错误、端口号错误、服务器`ServerSocket`未启动时,都会抛出异常,即连接失败。 ```java try { Socket socket = new Socket(String host, int port); } catch (Exception e) { e.printStackTrace(); } ``` 2. **write()写数据** > 同服务端 3. **read()读数据** > 同服务端 4. **close()关闭连接** ```java // 方法一: socket.close(); // 方法二: // 给服务器发送相关消息,由服务器断开与指定客户端的连接 【备注】更多详情介绍见项目说明!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aftermath123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值