Java基础(39)——网络编程相关知识详解及示例分析六(TCP通信技术详解及示例)
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、TCP通信
1、TCP通信基础知识
(1)通信过程
TCP协议用来控制两个网络设备之间的点对点通信,两端设备按作用分为客户端和服务端。服务端为客户端提供服务,通常等待客户端的请求消息,有客户端请求到达后,及时提供服务和返回响应消息;客户端向服务端主动发出请求,并接收服务的响应消息,它的通信过程步骤如下:
1、首先启动服务端程序,并开始等待网络中的客户端请求,然后客户端主动向服务端发出连接请求,服务端接收到客户端的连接请求后,将和客户端之间建立一个稳定的TCP/IP通信的连接。
2、现在客户端将向服务端主动发出请求,服务端接收客户端消息,并及时返回响应消息。这是通过I/O流(字节流)实现的
3、通信完成后,由客户端主动关闭和服务端之间的连接;如果客户端未主动关闭和服务端之间的连接,服务端在等待指定的时间后将会自动关闭这个连接
(2)TCP通信的特点
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket (通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。TCP通讯类似于打电话,必须双方把电话接通后,才能进行通话,任何一方断线都会造成无法进行通话,须再次连接
(3)Socket和ServerSocket
因为TCP通信两端的行为是不同的,所以在客户端使用Socket 类实现通信,而服务器使用ServerSocket实现通信
网络通信不是必须要有两个物理主机,而是需要有两个不同的Socket 就可以通信。例如,在同一主机上IP地址是相同的,但是使用不同的端口创建不同的Socket, 这样的两个Socket之间也是可以实现TCP/IP通信
(4)TCP通信的实现
无论一个TCP通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤:
1、在服务端指定一个端口号来创建ServerSocket,并使用accept 方法进行侦听,这将阻塞服务器线程,等待用户请求
2、在客户端指定服务器的主机IP和端口号来创建Socket,并连接到服务端ServerSocket,现在服务端的accept方法将被唤醒,同时返回一个和客户端通信的Socket
3、在客户端和服务端分别使用Socket来获得网络通信的输入/输出流,并按照一定的通信协议对Socket 进行读/写操作
4、在通信完成后,在客户端和服务端中分别关闭Socket
通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的
1、TCP通信示例
同样,我们使用TCP通信技术来实现一个简单的通信,客户端向服务端发送一个消息“Hello”,服务端接收到客户端的消息后返回一个消息:“Welcome”,即可,下面我们来就这个示例开始我们的代码编写吧 ~ ~
服务端代码:
package qfbd.com;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public class Server {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
try {
server = new ServerSocket(4444);
//等待客户端连接
socket = server.accept();
//从socket中获取网络流
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
//接收客户端消息
System.out.println("从客户端接收到的消息为:"+dataInputStream.readUTF());
//向客户端返回消息
dataOutputStream.writeUTF("Welcome!!!");
//如果不调用此函数则消息可能发送不成功,因为缓冲区未满
dataOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(server!=null){
try {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
客户端代码:
package qfbd.com;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public class Client {
public static void main(String[] args){
Socket socket = null;
try {
socket = new Socket("127.0.0.1",4444);
//从socket中获取网络流
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
//向服务端发送消息
dataOutputStream.writeUTF("Hello!!!");
//不调用此方法消息可能会发送不成功,因为缓冲区未占满
dataOutputStream.flush();
//接收服务端回传的消息
System.out.println("服务器回传的消息为:"+dataInputStream.readUTF());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
首先如下执行服务端代码,让其进入监听状态,然后运行客户端代码,执行结果如下:
这样我们就用Java语言实现了一个简单的TCP通信,咱们下篇见 ~ ~
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志也