Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现

一:Socket服务器端

  1. package com.founderit;
  2.  
  3. import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
  4.  
  5. public class HelloServer {
  6.  
  7. public static void main(String[] args) {
    InputStream in = null;
    OutputStream out = null;
    try {
    ServerSocket serverSocket= new ServerSocket(1234);
    while (true){
    Socket socket= serverSocket.accept();
    in=socket.getInputStream();
    InputStreamReader reader= new InputStreamReader(in);
    StringBuilder builder=new StringBuilder();
    for (int c = reader.read(); c != -1; c = reader.read()) {
    builder.append((char)c);
    }
    System.out.println("收到的客户端请求为:-------"+builder.toString());
    out=socket.getOutputStream();
    out.write("请求已接收,over".getBytes());
    out.flush();
    socket.shutdownOutput();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    try {
    in.close();
    out.close();
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }
    }
  8.  
  9. 二:Socket客户端

  1. package com.founderit.controller;
  2.  
  3. import java.io.*;
    import java.net.Socket;
  4.  
  5. public class SocketClient {
    public static void main(String[] args) {
    OutputStream out=null;
    InputStream in=null;
    Socket socket=null;
    try {
    socket=new Socket("localhost",1234);
    out=socket.getOutputStream();
    out.write("呼叫服务器,收到请回答".getBytes());
    socket.shutdownOutput();
    //获取输入流,并读取服务器端的响应信息
    in=socket.getInputStream();
    BufferedReader br=new BufferedReader(new InputStreamReader(in));
    StringBuilder sb=new StringBuilder();
    String info=null;
    while ((info=br.readLine())!=null){
    sb.append(info);
    }
    System.out.println("收到服务端回复:"+sb.toString());
    br.close();
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    try {
    out.flush();
    out.close();
    in.close();
    socket.close();
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }
  6.  
  7. }
  8.  
  9. 首先执行Socket服务端,它会一直运行等待接收请求,创建socketServer需要绑定端口,这个端口需需要与客户端一致
    然后执行Socket客户端,它会发送Socket请求给服务端并接收服务器端反馈,运行效果如下

需要注意的是无论是客户端与服务端,执行write()方法后最好执行socket.shutdownOutput()方法关闭输出流,不然有几率写入不成功(原因未知)

----------------------------------------------------------------------------------------------------------------------我是分割线---------------------------------------------------------------------------------------------------------------------------------------------上面的Demo只是个单机版,在实际工作中不会只有一个客户端请求,下面我们将改造Socket服务器端,使其支持多线程

Socket服务器端

首先抽调具体实现,新建个具体实现类

  1. package com.founderit;
  2.  
  3. import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Date;
  4.  
  5. public class HelloRunable implements Runnable{
    Socket socket;
    InputStream in = null;
    OutputStream out = null;
    public HelloRunable(Socket clientSocket){
    this.socket=clientSocket;
    }
    @Override
    public void run() {
    try {
    in=socket.getInputStream();
    InputStreamReader reader= new InputStreamReader(in);
    StringBuilder builder=new StringBuilder();
    for (int c = reader.read(); c != -1; c = reader.read()) {
    builder.append((char)c);
    }
    System.out.println("收到的客户端请求为:-------"+ new Date().toString()+ builder.toString());
    out=socket.getOutputStream();
    out.write("请求已接收,over".getBytes());
    out.flush();
    socket.shutdownOutput();
    }catch (Exception e){
    e.printStackTrace();
    }finally {
    try {
    in.close();
    out.flush();
    out.close();
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }
    }
  1. 接收类

  1. package com.founderit;
  2.  
  3. import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
  4.  
  5. public class HelloServer {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. try {
    ServerSocket serverSocket= new ServerSocket(1234);
    while (true){
    Socket socket=serverSocket.accept();
    new Thread(new HelloRunable(socket)).start();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    改造后,Socket服务端接收到请求后,会直接开启一个新线程执行任务
  1.  

Socket简单Demo的更多相关文章

  1. windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

    设置方法 int nNetTimeout=10000;//10秒,    //设置发送超时    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *) ...

  2. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  3. 设计模式之单例模式的简单demo

    /* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...

  4. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  5. 使用Spring缓存的简单Demo

    使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...

  6. Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...

  7. angular实现了一个简单demo,angular-weibo-favorites

    前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...

  8. 12、android socket使用demo:网络聊天

    目录: 一.效果图 二.原代码分享 三.代码分析 四.总结 一.效果图如下: 客户端1: 客户端2:           二.原代码分享如下: 1.java代码只有一个 MainActivity.ja ...

  9. Solr配置与简单Demo[转]

    Solr配置与简单Demo 简介: solr是基于Lucene Java搜索库的企业级全文搜索引擎,目前是apache的一个项目.它的官方网址在http://lucene.apache.org/sol ...

随机推荐

  1. ubuntu编译PCRE时出现 line 81: aclocal-1.14: command not found错误

    WARNING: 'aclocal-1.14' is missing on your system. You should only need it if you modified 'acinclud ...

  2. CF888G 【Xor-MST】

    妙妙题-- 看到\(MST\),想到\(Kruskal\),看到异或,想到\(Trie\) 首先我们模拟一下\(Kruskal\)的流程:找到最小边,如果联通就忽略,未联通就加边 我们把所有点权值加入 ...

  3. LAMP架构介绍

    介绍一下LAMP架构 LMAP即Linux+Apache+Mysql/MariaDB+Perl/PHP/Python的首字母缩写.这是一组常用来搭建动态网站或者服务器的开源软件.它们本身都是各自独立的 ...

  4. 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun 一.涉及知识点 1.薅羊毛逻辑漏洞 2.jwt-cookies伪造 Python反序列化 二.解题方法 刷题记录:[CIS ...

  5. #C++初学记录(STL容器以及迭代器)

    STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...

  6. 第06组 Alpha事后诸葛亮

    一.组长博客: https://www.cnblogs.com/mhq-mhq/p/11923194.html 二.Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚 ...

  7. MySql通过数据库文件恢复数据库

    以表”Table”为例: 如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中. 如 ...

  8. 004 vue组件

    一:创建组件 1.第一种创建方式 主要有Vue.extend,Vue.component. 注释掉的代码是一步一步的推断,后面的代码是简化的代码. <!DOCTYPE html> < ...

  9. jdbc调用存储过程获取多个结果集

    jdbc调用存储过程获取多个结果集 2017年07月26日 21:20:22 Kenny-Liu 阅读数:1486 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  10. 【面试】c++单例模式

    1. 单例模式 #include <iostream> using namespace std; class CSingleton { private: CSingleton() {} / ...