Java--Socket通信(客户端服务端双向)

发布时间 - 2026-01-10 22:40:10    点击率:

新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端

两个工程的读写操作线程类基本上完全相同

服务端:

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class Server { 
 
  public static final int PORT = 8000;//监听的端口号   
 
  public static void main(String[] args) {  
    Server server = new Server();  
    server.init();  
  }  
 
  public void init() {  
    ServerSocket serverSocket = null; 
    try {  
      serverSocket = new ServerSocket(PORT);  
      while (true) {  
        Socket client = serverSocket.accept();  
        //一个客户端连接就开户两个线程处理读写  
        new Thread(new ReadHandlerThread(client)).start();  
        new Thread(new WriteHandlerThread(client)).start();  
      }  
    } catch (Exception e) {  
      e.printStackTrace();  
    } finally{ 
      try { 
        if(serverSocket != null){ 
          serverSocket.close(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  }  
}  
 
/* 
 *处理读操作的线程  
 */ 
class ReadHandlerThread implements Runnable{ 
  private Socket client; 
 
  public ReadHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataInputStream dis = null; 
    try{ 
      while(true){ 
        //读取客户端数据  
        dis = new DataInputStream(client.getInputStream()); 
        String reciver = dis.readUTF(); 
        System.out.println("客户端发过来的内容:" + reciver);  
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    }finally{ 
      try { 
        if(dis != null){ 
          dis.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 
 
/* 
 * 处理写操作的线程 
 */ 
class WriteHandlerThread implements Runnable{ 
  private Socket client; 
 
  public WriteHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataOutputStream dos = null; 
    BufferedReader br = null; 
    try{ 
      while(true){ 
        //向客户端回复信息  
        dos = new DataOutputStream(client.getOutputStream());  
        System.out.print("请输入:\t");  
        // 键盘录入  
        br = new BufferedReader(new InputStreamReader(System.in)); 
        String send = br.readLine();  
        //发送数据 
        dos.writeUTF(send);  
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    }finally{ 
      try { 
        if(dos != null){ 
          dos.close(); 
        } 
        if(br != null){ 
          br.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

客户端:

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
 
public class Client { 
 
  public static final String IP = "localhost";//服务器地址  
  public static final int PORT = 8000;//服务器端口号  
 
  public static void main(String[] args) {  
    handler();  
  } 
 
  private static void handler(){ 
    try { 
      //实例化一个Socket,并指定服务器地址和端口 
      Socket client = new Socket(IP, PORT); 
      //开启两个线程,一个负责读,一个负责写 
      new Thread(new ReadHandlerThread(client)).start(); 
      new Thread(new WriteHandlerThread(client)).start(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}  
 
/* 
 *处理读操作的线程  
 */ 
class ReadHandlerThread implements Runnable{ 
  private Socket client; 
 
  public ReadHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataInputStream dis = null; 
    try { 
      while(true){ 
        //读取服务器端数据  
        dis = new DataInputStream(client.getInputStream()); 
        String receive = dis.readUTF();   
        System.out.println("服务器端返回过来的是: " + receive);  
      } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally{ 
      try { 
        if(dis != null){ 
          dis.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 
 
/* 
 * 处理写操作的线程 
 */ 
class WriteHandlerThread implements Runnable{ 
  private Socket client; 
 
  public WriteHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataOutputStream dos = null; 
    BufferedReader br = null; 
    try { 
      while(true){ 
        //取得输出流 
        dos = new DataOutputStream(client.getOutputStream()); 
        System.out.print("请输入: \t");  
        //键盘录入 
        br = new BufferedReader(new InputStreamReader(System.in)); 
        String send = br.readLine();  
        //发送数据 
        dos.writeUTF(send);  
      } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally{ 
      try{ 
        if(dos != null){ 
          dos.close(); 
        } 
        if(br != null){ 
          br.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      }catch(Exception e){ 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # socket双向通信  # java的socket通信  # java实现socket通信  # Java通过socket客户端保持连接服务端实现代码  # java客户端线上Apollo服务端的实现  # Java基于socket实现的客户端和服务端通信功能完整实例  # Java编程Socket实现多个客户端连接同一个服务端代码  # java实现socket客户端连接服务端  # 简单的java socket客户端和服务端示例  # java实现protocol传输的客户端和服务端的示例代码  # 客户端  # 服务端  # 请输入  # 的是  # 端口号  # 大家多多  # 完全相同  # final  # int  # PORT  # public  # Socket  # static  # Server 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解阿里云nginx服务器多站点的配置  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何挑选优质建站一级代理提升网站排名?  黑客如何通过漏洞一步步攻陷网站服务器?  如何快速搭建高效WAP手机网站?  IOS倒计时设置UIButton标题title的抖动问题  Android利用动画实现背景逐渐变暗  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何处理文件下载请求?(Response示例)  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Swift开发中switch语句值绑定模式  如何生成腾讯云建站专用兑换码?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  网站制作壁纸教程视频,电脑壁纸网站?  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel中的Facade(门面)到底是什么原理  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  中国移动官方网站首页入口 中国移动官网网页登录  浅析上传头像示例及其注意事项  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何在IIS中新建站点并配置端口与物理路径?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何做网站制作流程,*游戏网站怎么搭建?  网页设计与网站制作内容,怎样注册网站?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在IIS中新建站点并解决端口绑定冲突?  详解Android中Activity的四大启动模式实验简述  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  JavaScript如何实现音频处理_Web Audio API如何工作?  Python进程池调度策略_任务分发说明【指导】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何使用查询构建器?(Query Builder高级用法)  焦点电影公司作品,电影焦点结局是什么?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel怎么连接多个数据库_Laravel多数据库连接配置  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何制作一个表白网站视频,关于勇敢表白的小标题?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何在服务器上配置二级域名建站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?