socket实现简易聊天功能
最近在看网络编程这一块 小有收货 分享一哈 希望可以帮到有需要的人
编码开始
功能实现类如图
![b8b1b057f11e7fcfae6949d294599e9f.png](https://i-blog.csdnimg.cn/blog_migrate/e4ad719a12dd6dd85453c2c109c5eec5.png)
client :主要模拟客户端 发送消息
server :服务端
serverHandler :服务端业务处理类
Test :测试类
1:首先开始写 Server 服务端 (@SuppressWarnings("all") 防止提示 看着难受 )
@Slf4j
@SuppressWarnings("all")
public class Server {
private static final int DEFAULT_PORT = 8888;
private static ServerSocket serverSocket;
public static void start(){
start(DEFAULT_PORT);
}
/**
* socket 连接建立
* @param defaultPort defaultPort
*/
private synchronized static void start(int port) {
if (serverSocket != null){
return;
}
try {
//通过构造函数创建ServerSocket
//如果端口合法且空闲,服务端就监听成功
serverSocket = new ServerSocket(port); http:// log.info ("服务端已启动,端口号:" + port); http:// log.info ("。。。。。。简易聊天室启动。。。。。。。");
//通过无线循环监听客户端连接
//如果没有客户端接入,将阻塞在accept操作上。
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ServerHandler(socket)).start();
}
}catch (Exception e){
e.printStackTrace(); http:// log.info ("创建socket 异常");
}finally {
if(serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace(); http:// log.info ("关闭socket 异常");
}
serverSocket = null;
}
}
}
![04459d0e506c8e9d41a3edcac190a30f.png](https://i-blog.csdnimg.cn/blog_migrate/cc311840111b8b84400b52fb61fed080.png)
2:serverHandler 服务业务处理端
@Slf4j
public class ServerHandler implements Runnable {
/**
* socket 连接
*/
private Socket socket;
ServerHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader in = null;
PrintWriter out = null;
BufferedReader reader;
try{
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
reader = new BufferedReader(new InputStreamReader( http:// System.in ));
String result;
String outPut;
while ((result = in.readLine()) != null) { http:// log.info (("client :" + result));
if(result.equals("exit")){
out.println("exit"); http:// log.info ("哇哈哈 聊天结束了!!!");
break;
}
outPut =reader.readLine();
out.println(outPut);
}
}catch (Exception e){
e.printStackTrace();
log.error("server 处理处理异常 ");
}finally {
if(out!=null){
out.close();
}
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3:编写我们的客户端
@Slf4j
public class Client {
private static final int DEFAULT_PORT = 8888;
private static final String DEFAULT_IP = "127.0.0.1";
public static void send(){
send(DEFAULT_IP,DEFAULT_PORT);
}
/**
* 发送
* @param ip defaultIp
* @param port defaultPort
*/
private static void send(String ip, int port) {
Socket socket = null;
BufferedReader br = null;
PrintWriter pw = null;
BufferedReader reader;
try{
socket = new Socket(ip,port);
pw = new PrintWriter(socket.getOutputStream(),true);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
reader = new BufferedReader(new InputStreamReader( http:// System.in ));
String input ; http:// log.info ("聊天开始。。。。。。输入exit即可关闭");
while ((input = reader.readLine())!=null){
pw.println(input);
String s = br.readLine();
if(s.equals("exit")){ http:// log.info ("聊天终止。。。。。。");
break;
} http:// log.info (("server answer :" + s));
}
}catch (Exception e){
log.error("创建连接失败:"+e.getLocalizedMessage());
}finally {
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(pw!=null){
pw.close();
}
}
}
}
4:编写测试类 进行测试
public class Test {
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
Server.start();
}).start();
Thread.sleep(2000);
new Thread(() ->{
Client.send();
}).start();
}
}
界面运行效果如图
![4d50328e85cec409c027773890c24bc3.png](https://i-blog.csdnimg.cn/blog_migrate/31089bdac6c799e5620ba2285413e51e.png)
![fc2b9ee21ce737c15bcadf391f1cf7e3.png](https://i-blog.csdnimg.cn/blog_migrate/26c815b69e68f5300e1e7dfc19212fcb.png)
这样 简易聊天功能实现了
@Slf4j 这个注解 来自于lombok
pom依赖
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
idea 工具也是需要安装lombok插件的
我这里已经安装好了 这个插件 需要使用的话 必须要安装的
愿君度过美好的一天,明天加油