怎么使用为数不多的Java基础制作一个聊天室

103 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

学过网络编程之后,我们是不是不满足于简单的客户端服务端连接,那么和我一起,制作一个简单的网络聊天吧。

这是结果截图,可以实现双向的互动哦~

image.png image.png

那么在这次实验中,我们需要了解的是Java 语言中的 Socket 编程常用到 Socket 和 ServerSocket 这两个类, Socket 用于端对端的通信,而 ServerSocket 常用于服务端对象的创建,它们都位于 java.net 包中。

Socket 首先用于建立网络连接,在连接成功后,应用程序两端都会产生一个 Socket 实例,操作这个实例,就可以完成所需的会话啦。

那么如何编写代码呢?

第一个和其他不同的是:虽然Socket 编程是由服务器端和客户端两部分组成的,但是二者是相互交错通信的,因此在编写代码时就不能像以前那样先把一个类写完毕之后再编写第二个类,而应该是交错式的同步编写。 。

图层 1.png 这是我们书写网络编程的流程。

在客户端和服务端双向聊天时,程序的基本流程是:

客户端通过 Socket 输出流向服务端发送一句聊天内容,之后服务端通过 Socket 输入流接收到这条聊天内容并打印显示,然后再通过 Socket 输出流向客户端反馈一条聊天内容,之后客户端再通过 Socket 输入流接收这条聊天内容。可以一直这样进行数据交互操作。当客户端发送字符串 bye 时,客户端会显示 ”已退出聊天“ ,服务器端也会有客户端退出的提示信息。

所以写代码第一步!打开idea

搞错了。

新建Java文件

TestSockServer
TestSockClient

在server启动服务:

serverSocket = new ServerSocket(8888);

端口号可以自己确定奥

在server等待客户端加入:

while (true) {
    Socket socket = serverSocket.accept();
   ......
}

为啥使用了while?因为相互聊天,会一直等待客户端发信息

回到client,连接服务端

socket = new Socket("localhost", 8888);

接下来是输入输出流,由于聊天需要两边同时交互,使用两个文件都需要输入输出。

DataInputStream dis = new DataInputStream(socket.getInputStream());

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

这里需要硬我们创建的socket对象点方法,来获取流,和之前学文件流不一样奥。

那么在client文件里面,我们先写发送消息。

用输出流,输出提示消息,然后scanner。

System.out.println("请输入要向服务端发送的信息(输入字符串 bye 结束会话):");
String msg = input.nextLine();

我们看到了,bye表示退出,那么我们通过if,加上equals,判断msg是不是bye,如果是就退出。 如果不是,我们就通过

writeUTF

把消息输出。

然后回到server里面,用下面代码接收消息。

if ((receive = dis.readUTF()) != null){
    System.out.println("\n服务端发来的内容:" + receive);
}

反过来,客户端向服务端发送也一样的。

但是这样有一个问题,就是回车直接就发送了,不能发送多行消息,这个怎么解决呢?

这就要从我们输出流和输入流出手了。 write,和read+UTF,都是读或者打印一个字符串。 那么第一个反应就是,scanner里面,我们不用nextLine,用next,但是结果以失败告终,反而我们代码还有bug

那么应该怎么解决呢?

image.png 直到我看到了这个。如果我们把输入输出流搞成字节数组,这不就解决了。