开发者学堂课程【大数据 ZooKeeper 快速入门: 网络编程:socket—基于 TCP 协议编程】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/549/detail/7582
网络编程:socket—基于 TCP 协议编程
一、socket—基于 TCP 协议编程
Tcp最大的特点就是在于发送数据的时候不需要打包,需要建立链接,一旦建立链接成功之后就会形成数据传输的通道,就可以在通道中进行输入流和输出流来进行数据的发送和接收。客户端代码实现:客户端中 java 核心 API 叫做 socket,通过socket 构造客户端的 socket 对象,打开 idea 进行代码实现:
首先创建一个包 cn.itcast.socket.tcp
在包中创建客户端中的一个类:TCPSocketClient,Client 主要用于数据的发送。
流程:在客户端即发送数据端,第一步创建 socket 对象,对象是 socket 通信的基石,通过对象来指定发送数据的主机、目的地,通过建立之后,在对象当中形成数据传输的通道,就是所谓的输入流和输出流,在这个流当中进行数据的输入和输出。
代码实现思路:
创建客户端的 socket 服务核心类 Socket
1、在 socket 指定传输数据的目的ip和端口
2、通过 socket 建立的通道输出数据
3、释放资源
public class TCPSocketclient {
//首先创建 main 方法,
public static void main(String[] args)throws Exception {
//创建客户端的 socket 服务Socket
//在 socket 指定传输数据的目的 ip 和端口,new 一个 socket 需要输入一些信息,分别是主机 ip(127.0.0.1)和地址(端口12321),这样就完成了客户端 socket 的建立以及端口的指定,发现代码中,直接抛出最大的一个异常 throws Exception
Socket client = new Socket( "127.0.0.1",12321);
//通过 socket 建立的通道输出数据
//取得输出流,写数据,从 client 包中调用 getOutputStream() 进行输出调用,最后封装给 outputstream
Outputstream outputstream = client.getOutputStream();
//通过 write 方法写出数据,这是需要一个 byte 数组,这样就通过 outputStream 完成了对数据的写出
outputStream.write( "hello,this is tcp".getBytes());
//释放资源
client.close();
}
以上完成了对客户端代码的书写,创建一个服务,通过对象获取一个输出流,之后通过写数据即可
服务端实现:
服务端
核心 API:ServerSocket
流程逻辑:
1. 创建 ServerSocket 服务,然后绑定在服务器的 IP 地址和端口
2. 监听连接请求
3. 如果有客户端接受请求,建立了 TCP 连接
4. 获取输入流读取数据,并显示
5. 释放资源
在服务端创建一个了类:TCPSocketServer
public class TCPSocketServer {
//首先创建 main 方法
public static voidmain ( String[]args) throws Exception{
//建立服务端 socket 服务 ServerSocket(注意服务端的核心API:ServerSocket)并且监听本机的一个端口,new 一个 ServerSocket 对象进行绑定本地端口,注意端口与客户端保持一致,若不一致将不能进行链接传输数据,然后进行抛出异常 throws Exception
ServerSocket server = new ServerSocket(12321);
//监听连接阻塞方法 有请求过来 建立连接 返回与之对应的 socket 来 通信,调用 accept(方法),阻塞:程序运行到这将会一直等待,如果没有客户端发送 socket 请求,就会一直停留在这,如果有请求就会进行反应一个请求,放回方法直接是一个 socket,封装给 s,然后由客户端和服务端的 socket 进行通信,ServerSocket 继续保持服务,
Socket s = server.accept();
//获取输入流读取数据,然后就能写入数据,调用 getInputStream 方法进行输入,接收数据,返回为 Inputstream 类型
Inputstream inputStream = s.getInputStream();
//设置一个 byte 数组1024
Byte[] bys = new byte[1024];
//针对 inputStream 进行读取,调用 read 方法读取数据 bys,把数据存放到 len 中,因为读取的是长度 lenth
int len = inputstream.read (bys);
//sout 打印数据,从bys数组中第一个读取到最后(最大长度)
System.out.println( new String(bys,0,len));
//释放资源,打印完毕后需要进行关闭资源
s.close();
server .close();
}}
以上代码完成,右键进行运行测试:发现堵塞在那没有结束运行
接下来运行客户端程序:
hello,this is tcp
发现已经返回了结果,这样就完成了基于 TCP 协议的传输,重点需要明白协议的特点以及使用哪个 API 作为参数