/*
* 两个计算机进行通信,数据交换需要 3 部分
*
* 1. IP:网络上计算机的唯一标识
* 2. 协议:规定了交换的数据以什么格式组织
* TCP
* UDP
* 3. 端口号:用来区分计算机上的不同程序
*
* Java 中使用 Socket 技术实现网络通信
*
* 通信的两台设备:
* 一个叫做服务器:
* 一个叫做客户端:
*/
Server
//需要关闭的流可以用try with resource进行关闭
public static void main(String[] args) {
// Server 就是服务器上的程序
// 服务器不能重复启动,同一个端口,不允许同时有多个程序使用
try {
/*
* 创建服务器 ServerSocket,并绑定端口号
* 发送到 8889 端口的数据,都会交由我们这个程序进行处理
* 端口号范围是:0-65535,0-1023 都被系统占用了,我们的程序不能使用
*
* ServerSocket 才用的是 TCP 协议(Transmission Control Protocol)
* 是一种可靠的数据传输协议,能够确保数据一定送到,送不到会给你反馈
*/
ServerSocket serverSocket = new ServerSocket(8889);
System.out.println("---- 服务器创建成功,等待客户端的链接 ----");
/*
* 等待客户端的链接,程序进入阻塞状态
* 后边的代码都不执行,直到有客户端链接上
* 返回值就是链接上的客户端 Socket 对象
*/
Socket socket = serverSocket.accept();
System.out.println("---- 客户端链接成功 ----");
/*
* 使用输入流接收客户端发送的数据
*/
InputStream inputStream = socket.getInputStream();
// InputStreamReader:把字节流转换为字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
// 增加缓冲区
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 读取数据
String content = bufferedReader.readLine();
System.out.println("---- 客户端说:" + content);
// 结束输入
socket.shutdownInput();
// 使用输出流把文字发送给客户端:你好,我是服务器
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.write("你好,我是服务器");
printWriter.flush();
// 结束输出
socket.shutdownOutput();
// 关闭流
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Client
public static void main(String[] args) {
// Client 客户端上的程序
try {
/*
* 创建客户端:
* 1. 服务器的主机名:服务器的 ip 地址
* 自身的 ip/127.0.0.1/localhost
* 2. 服务器端口号:
*
* 自动链接到对应的服务器上
*/
Socket socket = new Socket("127.0.0.1", 8889);
System.out.println("---- 客户端链接服务器成功 ----");
/*
* 使用输出流把数据发送给服务器
*
* getOutputStream() 获得对应的字节输出流
*/
OutputStream outputStream = socket.getOutputStream();
// 转换为 PrintWriter 的字符输出流,方便传输文字
// 字节流转换为字符输出流
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.write("你好,我是客户端");
// PrintWriter 是具有缓冲区的,
// 需要通过 flush() 把没有填满缓冲区的数据给传输出去
printWriter.flush();
// 结束输出
socket.shutdownOutput();
// 关闭流
//
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String content = bufferedReader.readLine();
System.out.println(content);
//
socket.shutdownInput();
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}