socket实现简易聊天功能

最近在看网络编程这一块 小有收货 分享一哈  希望可以帮到有需要的人

编码开始 

功能实现类如图

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);
         log.info("服务端已启动,端口号:" + port);
         log.info("。。。。。。简易聊天室启动。。。。。。。");

         //通过无线循环监听客户端连接
         //如果没有客户端接入,将阻塞在accept操作上。
         while (true) {
            Socket socket = serverSocket.accept();
            new Thread(new ServerHandler(socket)).start();
         }
      }catch (Exception e){
         e.printStackTrace();
         log.info("创建socket 异常");
      }finally {
         if(serverSocket!=null){
            try {
               serverSocket.close();
            } catch (IOException e) {
               e.printStackTrace();
               log.info("关闭socket 异常");
            }
            serverSocket = null;
         }
      }
   }
}

 

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(System.in));
         String result;
         String outPut;
         while ((result = in.readLine()) != null) {
            log.info(("client :" + result));
            if(result.equals("exit")){
               out.println("exit");
               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(System.in));
         String input ;
         log.info("聊天开始。。。。。。输入exit即可关闭");
         while ((input = reader.readLine())!=null){
            pw.println(input);
            String s = br.readLine();
            if(s.equals("exit")){
               log.info("聊天终止。。。。。。");
               break;
            }
            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();
   }
}

 

界面运行效果如图

这样 简易聊天功能实现了 

@Slf4j 这个注解 来自于lombok 

pom依赖 

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

idea 工具也是需要安装lombok插件的

我这里已经安装好了  这个插件 需要使用的话 必须要安装的

愿君度过美好的一天,明天加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值