WebSocket聊天室
JavaSE入门项目,WebSocket聊天室的实现(一)
你好! 我同样是一个正在入门的程序员,经过本科四年时间的浪费,“实至名归”的还是一名菜菜,我不避讳,但是终有一天我会变强。
这篇文章开始介绍一个学完JavaSE的内容之后可以练习的项目,WebSocket聊天室的实现。
项目准备
网络协议这些东西就不赘述了,因为让我说我也说不清,这些可以通过查询,计算机网络的分层,TCP/UDP的连接。这里就说一下该项目ServerSocket和Socket、以及可以学习到的内容。
- ServerSocket: 可以将Socket理解为一个通道,ServerSocket顾名思义就是服务器端的通道,可以将ServerSocket理解为一个水池。
- Socket: 可以将Socket理解为一个水龙头,当用户需要水(获取信息),就需要将水龙头与水池用水管连接(访问服务器,建立连接)。
涉及的知识点
网络通信,线程同步,JavaSE基本语法,异常,static关键字,获取用户输入……
了解服务器与客户端的连接过程
客户端
//服务器端创建端口,就像水池创建一个供水龙头连接的接口
ServerSocket serverSocket = new ServerSocket(8888);
//获取客户端套接字,就开始等待客户端的连接,类似一个监听
Socket socket = serverSocket.accept();
客户端
//连接服务器端创建的端口,就像水龙头连接上了水池
Socket socket = new Socket("127.0.0.1",8888);
这时候服务器端(水池)与客户端(水龙头)就可以实现信息(水)的流通了。
但是怎么使用这样一个联通建立通信呢(让水龙头里面的水流通起来)?
接下来就涉及到IO流的操作了,先实现一个简单的功能就是客户端发送信息,服务端接收并打印出来。
客户端
//(1)socket.getOutputStream()获取输出流
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
//创建数据字节输出流,给输出流带上信息
dataOutputStream.writeUTF("在吗?");
客户端
//获取输入流
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
//获取客户端送过来的输出流之后读输出流中的信息
String message = dataInputStream.readUTF();
//接着就可将输出流中获取的信息打印出来了
System.out.println(message);
代码
public static void main(String[] args) {
//客户端
//创建ServerSocket
try {
/*创建ServerSocket(服务端套接字)并指定端口号
* 在同一台电脑上不可以发布一个端口多次
*/
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("----服务器暴露成功----");
/*通过服务端套接字 监听客户端的连接 如果没有客户端连接,
* 那么程序会一直停留在此处,accept方法返回值就是客户端的套接字
* 通过套接字获取客户端交互
*/
Socket socket = serverSocket.accept();
//获取客户端套接字,获取对应的输入流,通过此输入流就能拿到客户端发送过来的信息
InputStream inputStream = socket.getInputStream();
//将属于字节流包装成数据字节输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
String message = dataInputStream.readUTF();
System.out.println("客户发送的信息:"+message);
System.out.println("----程序执行完毕----");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String[] args) {
//客户端
try(Socket socket = new Socket("127.0.0.1",8888);
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
) {
//创建客户端套接字,用于交互服务端
//创建数据字节输出流
dataOutputStream.writeUTF("在吗?");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}