1、TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。
2、区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。
3、而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。
4、UDP主要关注接收端监听接收端的端口号;TCP主要关注服务器端的端口号
TCPServer.java(服务器端):
package cn.xxx.demo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 实现TCP服务器程序
* 服务器端套接字类: java.net.ServerSocket
* 客户端套接字类: java.net.Socket
* 构造方法:
* ServerSocket(int port) 传递端口号
*
* 注意: 必须要通过accept()方法,获得客户端的套接字对象Socket
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8888); // 创建服务器端套接字,指定端口号
Socket socket = server.accept(); // 通过accept()方法,获取客户端套接字。 会阻塞线程,直到获取到客户端连接的套接字。
//通过客户端套接字socket,获取字节输入流;读取客户端发送来的数据
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data); // 从字节输入流中读取数据到字节数组中,返回读取长度
System.out.println(new String(data,0,len));
//通过客户端套接字socket,获取字节输出流;向客户端写数据
OutputStream out = socket.getOutputStream();
out.write("收到,谢谢".getBytes());
InetAddress inet = socket.getLocalAddress(); // 通过客户端套接字,获取客户端IP对象
socket.close(); // 关闭资源。 同时会关闭套接字中的输入、输出流
server.close(); // 关闭资源
}
}
TCPClient.java(客户端):package cn.xxx.demo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args)throws IOException {
//创建Socket对象,连接服务器。 构造函数一执行,就会进行TCP连接(连接失败,抛异常)
Socket socket = new Socket("127.0.0.1", 8888); // 创建客户端套接字,指定服务器地址和服务器端口号
//通过客户端的套接字Socket,获取字节输出流,将数据写向服务器
OutputStream out = socket.getOutputStream();
out.write("服务器OK".getBytes());
//socket.shutdownOutput(); //给服务器写终止序列;同时会关闭输出流(服务器端会读到流结尾标志"-1")。上传文件时,客户端可以从本地文件流中读到流结束标志"-1",但不能将流结束标志也同时输出(写)到服务端,需要手动再写一个流结束标志。
//通过客户端的套接字Socket,获取字节输入流,读取服务器端的数据
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
socket.close(); // 关闭资源。 同时会关闭套接字中的输入、输出流
}
}