Java网络通信Part2:TCP通信及Socket

一、TCP通信概念

TCP通信:实现两台计算机之间的数据交互
严格区分客户端(Client)和服务器端(Server)

客户端和服务端会建立一个逻辑连接
这个连接中包含一个对象 即IO对象
客户端和服务端即可使用IO对象来进行通信

通信数据不仅仅是字符 因此IO对象为字节流
在这里插入图片描述
多个客户端同时和服务器进行交互 服务器必须明确和哪个客户端进行的交互
在服务器端有一个方法:accept() 能够获取到请求的客户端的对象

多个客户端同时和服务器进行交互 就需要多个IO流对象
但是 服务器是没有IO流的
服务器可以获取到请求的客户端对象:Socket
使用每个客户端Socket中提供的IO流和客户端进行交互


服务器使用客户端的字节输入流读取客户端发送的数据

服务器使用客户端的字节输出流给客户端回写(发送)数据


★ 服务端程序必须事先启动 等待客户端连接
Java提供了服务端类java.net.ServerSocket
创建ServerSocket对象 相当于开启一个服务 并等待客户端的连接

★ 客户端主动连接服务器端 连接成功才可通信
Java提供了客户端类java.net.Socket
创建Socket对象 向服务端发出连接请求 服务端响应请求 两者建立连接开始通信

java.net.Socket:该类实现客户端套接字 套接字是两台机器间通信的端点

套接字:包含了IP地址和端口号的网络单位

二、代码实现

1、客户端和服务器端进行交互 必须使用Socket对象中提供的网络流 不能使用自己创建的流对象

2、当创建客户端对象Socket的时候 就会去请求服务器 并和服务器经过三次握手 以建立连接通路
此时若服务器未启动 则抛出异常
若服务器已启动 则可进行交互了

★ 服务端

ServerSocket(int port)创建绑定到特定端口的服务器套接字

Socket accept()侦听并接受到此套接字的连接
服务器端必须明确是哪个客户端请求的服务器 因此才可使用accept()方法获取到请求的客户端对象的Socket

getOutputStream()返回此套接字的输出流
getInputStream()返回此套接字的输入流

close()关闭此套接字

下面是一个服务端的栗子:

1、创建服务器ServerSocket对象 向系统要指定的端口号
ServerSocket serverSocket=new ServerSocket(8888);

2、使用ServerSocket对象中的accept()方法 获取到请求的客户端对象Socket
Socket socket=serverSocket.accept();

3、使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
InputStream inputStream=socket.getInputStream();

4、使用网络字节输入流InputStream对象中的方法read() 读取客户端发送的数据
byte[] bytes=new byte[1024];
int len=inputStream.read(bytes);
System.out.println(new String(bytes,0,len));

5、使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream outputStream=socket.getOutputStream();

6、使用网络字节输出流OutputStream对象中的write()方法 给客户端回写数据
outputStream.write("你好哟".getBytes());

7、释放资源(Socket,ServerSocket)
socket.close();
serverSocket.close();

★ 客户端

Socket(String host , int port)创建一个流套接字并将其连接到指定主机上的指定端口号
host:服务器主机的名称/服务器的IP地址
port:服务器的端口号

getOutputStream()返回此套接字的输出流
getInputStream()返回此套接字的输入流

close()关闭此套接字

下面是一个客户端的栗子:

1、创建一个客户端对象Socket 构造方法绑定服务器端的IP地址和端口号
Socket socket=new Socket("192.168.00.00",8888);

2、使用Socket对象中的方法getOutputStream(0获取网络字节输出流OutputStream对象
OutputStream outputStream=socket.getOutputStream();

3、使用网络字节输出流OutputStream对象中的方法write() 给服务器发送数据
outputStream.write("服务器,你好!".getBytes());

4、使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
InputStream inputStream=socket.getInputStream();

5、使用网络字节输入流InputStream对象中的方法read() 读取服务器回写的数据
byte[] bytes=new byte[1024];
int len=inputStream.read(bytes);
System.out.println(new String(bytes,0,len));

6、释放资源(Socket)
socket.close();

发布了56 篇原创文章 · 获赞 0 · 访问量 1181

猜你喜欢

转载自blog.csdn.net/Piconjo/article/details/104619720