Java Socket编程实现简单的问候服务

 更新时间:2016年01月15日 16:11:10   作者:gloomyfish  
这篇文章主要为大家介绍了Java Socket编程实现简单的问候服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例讲解了Java Socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下

服务器端:

实现一个最简单的Hello服务,打印输出客户端IP地址到控制台,对任何连接的客户端都会发送一串字符(Hello, Java Socket)然后关闭与客户端连接。等待下一个客户端的连接请求到来。

客户端:

实现一个最简单的Socket连接到Hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台。

关键技巧:

由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触JAVA SOCKET编程时,由于对网络字节通信的本质缺乏了解,直接一个readline()去接受Socket字节流。但是由于发送一方并没有发送/r/n导致一直无法读到数据,这个是最常见的一个错误。另外一些常见的错误包括没有初始化接受缓冲区导致字符乱码,没有按照读入接受到字节数重新组装,导致接受到的数据异常。所以代码演示了什么叫按字节发送与按字节接受,这个是网络编程中非常重要的概念与原则。让那些输入流println()方法与输出流readline()方法见鬼去吧,不是不好用,而是我建议你不要用,因为那些会妨碍你的网络编程本质的认识与理解。另外我要特别说明一下:有时候flush()真的不是必须的除非你使用了带有缓冲的输入与输出流来读写字节。

服务器端代码:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class HelloService extends Thread { 
  private ServerSocket serverSocket; 
  public HelloService(int port) throws IOException { 
    serverSocket = new ServerSocket(port); 
  } 
 
  public void run() 
  { 
    try { 
      while(true) 
      { 
        System.out.println("Waiting for client on port " + serverSocket.getLocalPort()); 
        Socket client = serverSocket.accept(); // blocked & waiting for income socket 
        System.out.println("Just connected to " + client.getRemoteSocketAddress()); 
        DataOutputStream dos = new DataOutputStream(client.getOutputStream()); 
        byte[] hello = "Hello, Java Socket".getBytes(); 
        dos.write(hello, 0, hello.length); 
        dos.close(); 
        client.close(); 
      } 
    } catch(Exception e) { 
      e.printStackTrace(); 
    } 
  } 
   
  public static void main(String[] args) { 
    try { 
      HelloService service = new HelloService(9999); 
      service.start(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

服务器在端口9999监听并等待连接,使用Java Thread来实现服务器端启动。
客户端代码如下:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
 
public class HelloClient { 
  private int clientNumber; 
  private SocketAddress address; 
  public HelloClient(int clientNum) { 
    clientNumber = clientNum; 
  } 
   
  public void setupClients(String serverHostName, int port) throws IOException { 
    address = new InetSocketAddress(serverHostName, port); 
    for(int i=0; i<clientNumber; i++) { 
      System.out.println(); 
      System.out.println("start client No. " + (i+1)); 
      Socket socket = new Socket(); 
      socket.connect(address); 
      DataInputStream bufferedReader = new DataInputStream(socket.getInputStream()); 
      byte[] cbuff = new byte[256]; 
      char[] charBuff = new char[256]; 
      int size = 0; 
      while( (size = bufferedReader.read(cbuff))> 0) { 
        convertByteToChar(cbuff, charBuff, size); 
        System.out.println(charBuff); 
      } 
      bufferedReader.close(); 
      socket.close(); 
    } 
  } 
   
  private void convertByteToChar(byte[] cbuff, char[] charBuff, int size) { 
    for(int i=0; i<charBuff.length; i++) { 
      if(i < size) { 
        charBuff[i] = (char)cbuff[i]; 
      } else { 
        charBuff[i] = ' '; 
      } 
    } 
     
  } 
 
  public static void main(String[] args) { 
    try { 
      HelloClient client = new HelloClient(10); 
      client.setupClients("localhost", 9999); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

启动10个客户端去连接服务器端,接受到服务器端问候以后客户端关闭连接。
特别提示:一定要初始化缓冲区charBuff
程序运行结果:

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

相关文章

  • Java毕业设计实战之生活旅行分享平台的实现

    Java毕业设计实战之生活旅行分享平台的实现

    这是一个使用了java+Springboot+JPA+Jsp+Html+js+Ajax+maven+mysql开发的生活旅行分享平台,是一个毕业设计的实战练习,具有分享发布平台该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • SpringBoot集成Hadoop实现文件的上传和下载功能

    SpringBoot集成Hadoop实现文件的上传和下载功能

    Spring Hadoop简化了Apache Hadoop,提供了一个统一的配置模型以及简单易用的API来使用HDFS、MapReduce、Pig以及Hive,这篇文章主要介绍了SpringBoot集成Hadoop实现文件的上传和下载,需要的朋友可以参考下
    2024-07-07
  • SpringCloud Config配置中心原理以及环境切换方式

    SpringCloud Config配置中心原理以及环境切换方式

    这篇文章主要介绍了SpringCloud Config配置中心原理以及环境切换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详解java线程的开始、暂停、继续

    详解java线程的开始、暂停、继续

    本文将介绍通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。具有一定的参考作用,下面跟着小编一起来看下吧
    2017-01-01
  • gradle安装配置以及使用最新方法

    gradle安装配置以及使用最新方法

    这篇文章主要给大家介绍了关于gradle安装配置以及使用的相关资料,Gradle是一个基于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Maven项目部署到服务器设置访问路径以及配置虚拟目录的方法

    Maven项目部署到服务器设置访问路径以及配置虚拟目录的方法

    今天小编就为大家分享一篇关于Maven项目部署到服务器设置访问路径以及配置虚拟目录的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • JDK源码分析之String、StringBuilder和StringBuffer

    JDK源码分析之String、StringBuilder和StringBuffer

    这篇文章主要给大家介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用jdk具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Mybatis-Plus主键生成策略的方法

    Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java9中对集合类扩展的of方法解析

    Java9中对集合类扩展的of方法解析

    这篇文章主要介绍了Java9 中对集合类扩展的of方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • idea企业开发之新建各类型项目的详细教程

    idea企业开发之新建各类型项目的详细教程

    这篇文章主要介绍了idea企业开发之新建各类型项目的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论