当前位置: 首页 > news >正文

TCP协议实现一对一聊天

服务端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * 发送消息线程
 */
class Send extends Thread{
    private Socket socket;
    public Send(Socket socket){
        this.socket  =socket;
    }
    @Override
    public void run() {
        this.sendMsy();
    }
    /**
     * 发送消息
     */
    private void sendMsy(){
        Scanner scanner =null;
        PrintWriter pw =null;
        try{
            scanner =new Scanner(System.in);
            pw =new PrintWriter(this.socket.getOutputStream());
            while(true){
                String str =scanner.nextLine();
                pw.println(str);
                pw.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (scanner!=null){
                scanner.close();
            }
            if (pw!=null){
                pw.close();
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
 
/**
 * 接收消息的线程
 */
class receive extends Thread{
    private Socket socket=null;
    public receive(Socket socket){
        this.socket =socket;
    }
 
    @Override
    public void run() {
        this.receiveMsg();
    }
    /**
     * 用于接收对方消息
     */
    private void receiveMsg(){
        BufferedReader br =null;
        try{
            br =new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while(true){
                String mr = br.readLine();
                System.out.println("A说:"+mr);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
        }
    }
}
 
public class ChatSocketServer {
    public static void main(String[] args) {
        ServerSocket serverSocket =null;
        try{
            serverSocket =new ServerSocket(8888);
            System.out.println("服务端已启动等待连接");
            Socket socket = serverSocket.accept();
            System.out.println("连接成功!");
            new Send(socket).start();
            new receive(socket).start();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
 
public class ChatSocketClient {
    public static void main(String[] args) {
 
        try {
            Socket socket =new Socket("127.0.0.1",8888);
            System.out.println("连接成功!");
            new ClientSend(socket).start();
            new Clientreive(socket).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/**
 * 用于发送消息线程类
 */
class ClientSend extends Thread{
    @Override
    public void run() {
        this.sendMsy();
    }
    private Socket socket;
    public ClientSend(Socket socket){
        this.socket  =socket;
    }
    /**
     * 发送消息
     */
    private void sendMsy(){
        Scanner scanner =null;
        PrintWriter pw =null;
        try{
            scanner =new Scanner(System.in);
            pw =new PrintWriter(this.socket.getOutputStream());
            while(true){
                String str =scanner.nextLine();
                pw.println(str);
                pw.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (scanner!=null){
                scanner.close();
            }
            if (pw!=null){
                pw.close();
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
 
/**
 *用于接收消息线程类
 */
class Clientreive extends Thread{
    private Socket socket=null;
    public Clientreive(Socket socket){
        this.socket =socket;
    }
 
    @Override
    public void run() {
        this.receiveMsg();
    }
    /**
     * 用于接收对方消息
     */
    private void receiveMsg(){
        BufferedReader br =null;
        try{
            br =new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while(true){
                String mr = br.readLine();
                System.out.println("B说:"+mr);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
        }
    }
}
运行服务端代码后,再运行客户端代码,即可实现一对一聊天。

相关文章:

  • XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known
  • html实现各种好看的鼠标滑过图片特效模板
  • 一个 postman实现参数化让我丢掉了一份20k的offer
  • 数论——质数
  • Mysql 日期函数大全
  • C语言期末考试复习PTA数据类型及表达式-分支结构程序-循环结构-数组经典选择题
  • 渗透测试学习day6
  • 第二十一章总结
  • HDFS常见题
  • ALTERNET STUDIO 9.1 Crack
  • 在Pytorch中使用Tensorboard可视化训练过程
  • jmeter接口自动化部署jenkins教程
  • 网站高性能架构设计——web前端与池化
  • hbuilder + uniapp +vue3 开发微信云小程序
  • 爬虫框架Scrapy
  • 【Leetcode】101. 对称二叉树
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [Vue CLI 3] 配置解析之 css.extract
  • [译]前端离线指南(上)
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Android组件 - 收藏集 - 掘金
  • CAP 一致性协议及应用解析
  • JavaScript标准库系列——Math对象和Date对象(二)
  • java概述
  • Java-详解HashMap
  • js操作时间(持续更新)
  • PHP变量
  • react 代码优化(一) ——事件处理
  • socket.io+express实现聊天室的思考(三)
  • SQLServer之创建数据库快照
  • unity如何实现一个固定宽度的orthagraphic相机
  • webpack4 一点通
  • 从PHP迁移至Golang - 基础篇
  • 从伪并行的 Python 多线程说起
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前嗅ForeSpider中数据浏览界面介绍
  • 算法---两个栈实现一个队列
  • 一个项目push到多个远程Git仓库
  • 终端用户监控:真实用户监控还是模拟监控?
  • 最简单的无缝轮播
  • const的用法,特别是用在函数前面与后面的区别
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #define,static,const,三种常量的区别
  • (39)STM32——FLASH闪存
  • (差分)胡桃爱原石
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)基于IDEA的JAVA基础1
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core 依赖注入的基本用发