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通信,咱们下篇见 ~ ~

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志也

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章