网络编程
使用ip地址来确定目标主机,使用端口号来确定哪个进程
使用
UDP编程
原理
通过传输层,将数据转换为数据包发送
udp协议是无连接的、不可靠的
发送端步骤
- 创建发送端的socket对象
- 把要发送的数据封装成数据报包(五个参数的)
- 利用send方法发送
- close
接收端步骤
- 创建接收端的socket对象
- 创建用于接收的数据报包(此时是空包)
- 利用receive方法去接收数据报包(接收完了后包里才有数据)
- 解析数据报包
- close
DatagramSocket
此类表示用来发送和接收数据报包的套接字。
构造方法
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
成员方法
void | receive(DatagramPacket p) 从此套接字接收数据报包。 |
void | send(DatagramPacket p) 从此套接字发送数据报包。 |
DatagramPacket
此类表示数据报包。
构造方法
构建用法发送的数据报包
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
构建用于接收的数据报包
DatagramPacket(byte[] buf, int offset, int length) 构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
成员方法
byte[] | getData() 返回数据缓冲区。 |
int | getLength() 返回将要发送或接收到的数据的长度。 |
int | getOffset() 返回将要发送或接收到的数据的偏移量。 |
注意:如果要想实现互相聊天的功能,必须使用多线程,否则会产生只能你发一句然后我等待之后才能发送的情况,因为是串行的
TCP编程
原理
服务端创建一个ServerSocket,利用accept方法侦听客户端的连接,以此来获取Socket对象,可以从中获取输入输出流与客户端通信
客户端创建客户端的Socket对象,可以从中获取输入输出流与服务端通信
TCP协议是有连接的、可靠的;建立连接是在网际层
客户端步骤(Client)
- 创建客户端Socket对象
- 从中获取输入输出流
- 从输入 输出流中读取 写入 数据
- close
服务端步骤(Server)
- 创建服务端的Socket对象 ServerSocket
- 利用accept方法去建立连接,得到Socket对象
- 从socket对象中获取输入 输出流
- 可以利用输入输出流 读写数据
- close
Socket
此类实现客户端套接字(也可以就叫“套接字”
构造方法
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
成员方法
InputStream | getInputStream() 返回此套接字的输入流。 |
OutputStream | getOutputStream() 返回此套接字的输出流。 |
void | shutdownOutput() 禁用此套接字的输出流 |
socket.getInetAddress 可以获取正在通信的ip地址
ServerSocket
此类实现服务器套接字
构造方法
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
成员方法
Socket | accept() 侦听并接受到此套接字的连接 |
必须要先启动服务端再启动客户端,否则会抛出连接异常
java.net.ConnectException: Connection refused: connect
socket的半关闭
shutdownOutput() 禁用流
在实现客户端上传文件,服务端给出反馈的时候,如果不禁用流的话会造成服务端一直等待客户端发送而不继续往下执行的情况,因为服务端无法知道客户端已经发送完毕,因此需要使用shutdownOutput() 关闭流来通知服务端,这就是半关闭。如果直接调用流的close方法的话,会直接造成全关闭导致连接断开