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. Building a Service Mesh with HAProxy and Consul

    转自:https://www.haproxy.com/blog/building-a-service-mesh-with-haproxy-and-consul/ HashiCorp added a s ...

  2. C语言第一篇博客

    你对网络专业或者计算机专业了解是怎样? 进行网络安全,防止信息泄露. 你了解C语言么?C语言主要应用有哪些? C语言简言之就是一门计算机的编程语言. C语言主要应用于应用软件,服务器端开发,系统软件和 ...

  3. coci2011 debt 还债

    coci2011 debt 还债 Description 有N个人,每个人恰好欠另一个人Bi元钱,现在大家都没有钱,政府想要给其中一些人欠,使得大家都不欠别人钱. 如A欠B 50,B欠C 20,则当政 ...

  4. Comparison of SIFT Encoded and Deep Learning Features for the Classification and Detection of Esca Disease in Bordeaux Vineyards(分类MobileNet,目标检测 RetinaNet)

    识别葡萄的一种虫害,比较了传统SIFT和深度学习分类,最后还做了目标检测 分类用的 MobileNet,目标检测 RetinaNet MobileNet 是将传统深度可分离卷积分成了两步,深度卷积和逐 ...

  5. 第06组 Beta冲刺(5/5)

    队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 准备beta版本的答辩 GitHub签入记录 接下来的计划 整理任务, ...

  6. qtcreator 添加 cppreference 离线文档

    https://en.cppreference.com/w/File:qch_book_20190607.zip 下载后放到 D:\Qt\Qt5.10.0\Docs\Qt-5.10.0目录下, 并在q ...

  7. 布局优化: <include />、<merge /> 、<ViewStub /> 标签的使用

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...

  8. postgresql - relation 权限相关问题

    GRANT ALL PRIVILEGES ON DATABASE 数据库.[schema] TO [用户名]; GRANT ALL ON schema [schema] TO [用户名]; GRANT ...

  9. C# Newtonsoft.Json解析json字符串处理 - JToken 用法

    //*调用服务器API(获取可以处理的文件) //1.使用JSON通信协议(调用[待化验任务API]) String retData = null; { JToken json = JToken.Pa ...

  10. matlab学习笔记11_1低维数组操作

    一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...