Java聊天室【1.0版】
单线程实现简单模拟聊天室
设计思路
功能:
服务器
客户端
业务:
客户端发数据给服务器,服务器接收数据,并打印
服务器响应数据给客户端,客户端接收数据,并打印
技术:
服务器:ServerSocket 类
客户端:Socket类
服务器程序, 客户端程序
JDK8, Maven管理
实现步骤:
1.创建Maven工程(2个程序)
2.Maven配置
3.服务器端实现
准备ServerSocket对象
接收客户端连接,Socket对象
接收数据,发送数据
4.客户端实现
准备Socket对象,连接到服务器端
发送数据,接收数据
5.配置Maven项目可执行的Java程序
具体代码
服务端代码
package com.niu.chatroom.single.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SingleThreadServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(6666);
//等待链接
System.out.println("等待客户端链接。");
Socket clientSocket = serverSocket.accept();
//接收
InputStream clientInput = clientSocket.getInputStream();
Scanner scanner = new Scanner(clientInput);
String clientData = scanner.next();
System.out.println("来自客户端的消息:" + clientData);
//发送
OutputStream clientOutput = clientSocket.getOutputStream();
//字节流转字符流
OutputStreamWriter writer = new OutputStreamWriter(clientOutput);
writer.write("欢迎连接服务器。\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
package com.niu.chatroom.single.server;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SingleThreadClient {
public static void main(String[] args) {
//创建客户端
try {
Socket clientScoket = new Socket("127.0.0.1",6666);
//fasongshuju
OutputStream clientOutput = clientScoket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(clientOutput);
writer.write("你好,我是客户端\n");
writer.flush();
//接收
InputStream clientInput = clientScoket.getInputStream();
Scanner scanner = new Scanner(clientInput);
String serverData = scanner.nextLine();
System.out.println("来自服务器端的数据:"+serverData);
//关闭
clientScoket.close();
System.out.println("客户端关闭");
} catch (IOException e) {
e.printStackTrace();
}
}
}
遇到的问题及解决方法
问题一:
在服务端处于等待连接的状态时,启动客户端发现服务端接收不到来自客户端的信息
原因:
刚开始是用得到scanner的nextLine()方法,而输入的信息没有换行导致读不进去数据。
解决:
将nextLine()换成next()方法。
问题二:
链接之后,读数据时读不到数据:
原因:
报文是分包的,要刷新flush
解决方法:
可以用PrintStream()自动刷新或者用flush()方法自动刷新。