笔者: unirithe
日期:11/19/2021
下一篇:【Java实战】网络聊天室 (二) 实现管理员反馈信息给用户 | 引用多线程机制 | 添加注册登陆功能
运行环境
- JDK 1.8
- IDEA
实现效果
用户发消息:
后台接收到消息:
1. 知识面概要
参考博文:Java学习笔记@网络编程
- Java IO流处理
java.io.*
- Java 网络编程
java.net.*
网络通信三要素:IP地址、端口、网络协议
- IP地址:IP全称为Internet Protocol,即互联网协议地址,指设备在网络中 的地址、唯一标识
- 端口:应用程序在设备中的唯一标识
- 网络协议:数据在网络中传输的规则,常见的有TCP协议和UDP协议
1.1 网络协议
TCP协议特点:面向连接的可靠通信协议、支持大数据量传输,三次握手连接,四次挥手断开连接,但通信效率低
UDP协议特点:无连接,不可靠,可广播
本次案例中TCP协议建立连接的示意图如下:
1.2 套接字
在网络上,套接字是连接两个需要通信的程序的一个抽象概念
在Java语言中,套接字是实现两个Java程序通信的一个类,可以理解成一个管道,负责两端的通信
1.3 IO流
参考资料: Java学习笔记@IO流知识梳理与部分源码解读
IO流
即 Input / Output Stream,用于设备之间的数据传输
常见的有 System.out.println()
就是通过流处理而打印到控制台
本次案例用到的IO流处理如下:
2. 实现代码
Server.java
负责实现后台管理员接收消息
Client.java
负责实现用户发消息
测试时,请记得先开启 Server ,再开启 Client
Server.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动");
int port = 6666; // 连接端口号
ServerSocket serverSocket = new ServerSocket(port); // 建立连接管道
while(true) {
// 等待连接
Socket accept = serverSocket.accept();
// 来自客户端的字节输入流 -> 输入转换流 -> 字符缓冲输入流
BufferedReader r = new BufferedReader(
new InputStreamReader(
accept.getInputStream()
)
);
// 读取消息
String message;
while((message = r.readLine()) != null)
System.out.println("收到: " + message);
}
}
}
Client.java
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("客户端启动");
// 建立连接管道
Socket socket = new Socket("localhost", 6666);
// 控制台输入 -> 输出打印流(包含输出转换流和字符缓冲输出流)
PrintStream p = new PrintStream(socket.getOutputStream());
// 控制台输入
Scanner in = new Scanner(System.in);
while(true){
System.out.print("发送: ");
p.println(in.nextLine());
}
}
}
至此,基于IO流处理和网络编程的网络聊天室第一步已完成 ,下次步骤将在本次的基础上进行更新。
版权声明:本文为Unirithe原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。