我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java的ServerSocket类怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java的ServerSocket类怎么用

本篇内容主要讲解“Java的ServerSocket类怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的ServerSocket类怎么用”吧!

ServerSocket

  由于SSClient使用了流套接字,所以服务程序也要使用流套接字。这就要创建一个ServerSocket对象,ServerSocket有几个构造函数,最简单的是ServerSocket(int port),当使用ServerSocket(int port)创建一个ServerSocket对象,port参数传递端口号,这个端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。

  接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。

  由于存在单个服务程序与多个客户程序通讯的可能,所以服务程序响应客户程序不应该花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通讯的建立,然而服务程序和客户程序的会话有可能是很长的(这与电话类似),因此为加快对客户程序连接请求的响应,典型的方法是服务器主机运行一个后台线程,这个后台线程处理服务程序和客户程序的通讯。

  为了示范我们在上面谈到的慨念并完成SSClient程序,下面我们创建一个SSServer程序,程序将创建一个ServerSocket对象来监听端口10000的连接请求,如果成功服务程序将等待连接输入,开始一个线程处理连接,并响应来自客户程序的命令。下面就是这段程序的代码:

  Listing 3: SSServer.JavaXML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

// SSServer.java

import java.io.*;
import java.NET.*;
import java.util.*;

class SSServer
{
 public static void main (String [] args) throws IOException
 { 
  System.out.println ("Server starting...n");

  // Create a server socket that listens for incoming connection
  // requests on port 10000.

  ServerSocket server = new ServerSocket (10000);

  while (true)
  {
   // Listen for incoming connection requests from client
   // programs, establish a connection, and return a Socket
   // object that represents this connection.

   Socket s = server.accept ();

   System.out.println ("Accepting Connection...n");

   // Start a thread to handle the connection.

   new ServerThread (s).start ();
  }
 }
}

class ServerThread extends Thread
{
 private Socket s;

 ServerThread (Socket s)
 {
  this.s = s;
 }

 public void run ()
 {
  BufferedReader br = null;
  PrintWriter pw = null;

  try
  {
   // Create an input stream reader that chains to the socket's
   // byte-oriented input stream. The input stream reader
   // converts bytes read from the socket to characters. The
   // conversion is based on the platform's default character
   // set.

   InputStreamReader isr;
   isr = new InputStreamReader (s.getInputStream ());

   // Create a buffered reader that chains to the input stream
   // reader. The buffered reader supplies a convenient method
   // for reading entire lines of text.

   br = new BufferedReader (isr);

   // Create a print writer that chains to the socket's byte-
   // oriented output stream. The print writer creates an
   // intermediate output stream writer that converts
   // characters sent to the socket to bytes. The conversion
   // is based on the platform's default character set.

   pw = new PrintWriter (s.getOutputStream (), true);

   // Create a calendar that makes it possible to obtain date
   // and time information.

   Calendar c = Calendar.getInstance ();

 // Because the client program may send multiple commands, a
   // loop is required. Keep looping until the client either
   // explicitly requests teRmination by sending a command
   // beginning with letters BYE or implicitly requests
   // termination by closing its output stream.

   do
   {
    // Obtain the client program's next command.

    String cmd = br.readLine ();

    // Exit if client program has closed its output stream.

    if (cmd == null)
     break;
  
    // Convert command to uppercase, for ease of comparison.

    cmd = cmd.toUpperCase ();

    // If client program sends BYE command, terminate.

    if (cmd.startsWith ("BYE"))
     break;

    // If client program sends DATE or TIME command, return
    // current date/time to the client program.

    if (cmd.startsWith ("DATE") || cmd.startsWith ("TIME"))
     pw.println (c.getTime ().toString ());

    // If client program sends dom (Day Of Month) command,
    // return current day of month to the client program.

    if (cmd.startsWith ("DOM"))
     pw.println ("" + c.get (Calendar.DAY_OF_MONTH));

    // If client program sends DOW (Day Of Week) command,
    // return current weekday (as a string) to the client
    // program.

    if (cmd.startsWith ("DOW"))
     switch (c.get (Calendar.DAY_OF_WEEK))
 {
     case Calendar.SUNDAY : pw.println ("SUNDAY");
      break;

     case Calendar.MONDAY : pw.println ("MONDAY");
      break;

     case Calendar.TUESDAY : pw.println ("TUESDAY");
      break;

     case Calendar.WEDNESDAY: pw.println ("WEDNESDAY");
      break;

     case Calendar.THURSDAY : pw.println ("THURSDAY");
      break;

     case Calendar.FRIDAY : pw.println ("FRIDAY");
      break;

     case Calendar.SATURDAY : pw.println ("SATURDAY");
    }

    // If client program sends DOY (Day of Year) command,
    // return current day of year to the client program.

    if (cmd.startsWith ("DOY"))
     pw.println ("" + c.get (Calendar.DAY_OF_YEAR));

     // If client program sends PAUSE command, sleep for three
     // seconds.
 
    if (cmd.startsWith ("PAUSE"))
    try
    {
     Thread.sleep (3000);
    }
    catch (InterruptedException e)
    {
    }
   }
   while (true);
   {
   catch (IOException e)
   {
       System.out.println (e.toString ());
   }
   finally
   {
    System.out.println ("Closing Connection...n");
    try
    {
     if (br != null)
      br.close ();

      if (pw != null)
       pw.close ();

      if (s != null)
       s.close ();
    }
    catch (IOException e)
    {
    }
   }
  }
}


  运行这段程序将得到下面的输出:

Server starting...
Accepting Connection...
Closing Connection...


  SSServer的源代码声明了一对类:SSServer 和ServerThread;SSServer的main()方法创建了一个ServerSocket对象来监听端口10000上的连接请求,如果成功, SSServer进入一个无限循环中,交替调用ServerSocket的 accept() 方法来等待连接请求,同时启动后台线程处理连接(accept()返回的请求)。线程由ServerThread继承的start()方法开始,并执行ServerThread的run()方法中的代码。

  一旦run()方法运行,线程将创建BufferedReader, PrintWriter和 Calendar对象并进入一个循环,这个循环由读(通过BufferedReader的 readLine())来自客户程序的一行文本开始,文本(命令)存储在cmd引用的string对象中,如果客户程序过早的关闭输出流,会发生什么呢?答案是:cmd将得不到赋值。

  注意必须考虑到这种情况:在服务程序正在读输入流时,客户程序关闭了输出流,如果没有对这种情况进行处理,那么程序将产生异常。

  一旦编译了SSServer的源代码,通过输入Java SSServer来运行程序,在开始运行SSServer后,就可以运行一个或多个SSClient程序。

到此,相信大家对“Java的ServerSocket类怎么用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java的ServerSocket类怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java的ServerSocket类怎么用

本篇内容主要讲解“Java的ServerSocket类怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的ServerSocket类怎么用”吧!ServerSocket类  由于SSC
2023-06-03

java NIO SocketClinet和ServerSocket的实例用法

本篇内容介绍了“java NIO SocketClinet和ServerSocket的实例用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
2023-06-02

Java的BigDecimal类怎么用

这篇文章主要介绍“Java的BigDecimal类怎么用”,在日常操作中,相信很多人在Java的BigDecimal类怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的BigDecimal类怎么用
2023-06-17

Java的WinProcess类怎么使用

WinProcess类是一个在Java中用来执行Windows命令的辅助类。你可以使用以下步骤来使用WinProcess类:首先,将WinProcess类导入到你的Java代码中。你可以使用以下语句导入WinProcess类:import
2023-10-22

Java的Math类怎么使用

本篇内容主要讲解“Java的Math类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的Math类怎么使用”吧!Math类包含完成基本数学函数所需的方法。这些方法分为三类:三角函数
2023-06-27

Java的Freemarker类怎么使用

本篇内容介绍了“Java的Freemarker类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、工具类public class F
2023-06-29

Java的File类怎么使用

今天小编给大家分享一下Java的File类怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述要学习Java中的Fil
2023-06-29

Java BigDecimal类怎么用

这篇文章主要介绍了Java BigDecimal类怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、简介Java在java.math包中提供的API类BigDecima
2023-06-25

Java的FTP类库edtFTPj怎么用

小编给大家分享一下Java的FTP类库edtFTPj怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!edtFTPj是一个FTP客户端库,可让任何Java应用程
2023-06-17

Java库中的LocalDate类怎么用

这篇“Java库中的LocalDate类怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java库中的LocalDate
2023-06-26

java中的random类怎么使用

在Java中,Random类用于生成伪随机数。下面是一个简单的示例演示如何使用Random类:import java.util.Random;public class RandomExample {public static void m
java中的random类怎么使用
2024-03-04

java类库怎么使用

以使用Math类库编写求算术平方根程序为例:首先打开Java官方在线API文档在Java API文档中查看Math类库的sqrt函数的使用方法(推荐学习视频:java视频教程)打开记事本,输入下面的代码,并保存为Sqrt.java编译和运行Sqrt.java,
java类库怎么使用
2018-08-12

Java Object类怎么使用

这篇文章主要介绍“Java Object类怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Object类怎么使用”文章能帮助大家解决问题。1.equals方法==运算符比较运算符,即
2023-07-02

​Java MovieClip类怎么使用

MovieClip类是一个在Java中用于处理动画效果的类。下面是使用MovieClip类的简单示例:1. 首先,导入MovieClip类所在的包:javaimport com.sun.javafx.scene.traversal.Movi
2023-10-24

​Java CollapseAllHandler类怎么使用

CollapseAllHandler类是Eclipse JDT中的一个类,用于实现在Java编辑器中折叠所有代码块的操作。可以通过以下步骤来使用CollapseAllHandler类:获取当前活动的IWorkbenchWindow对象,通常
2023-10-21

Java中String类怎么用

这篇文章主要为大家展示了“Java中String类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中String类怎么用”这篇文章吧。大部分编程语言都能够处理字符串(String)。
2023-06-02

java properties类怎么使用

在Java中,可以通过Properties类来读取和写入属性文件。下面是Properties类的使用示例:1. 创建Properties对象并加载属性文件:```javaProperties properties = new Propert
2023-09-20

Java StringBuffer类怎么使用

本篇内容介绍了“Java StringBuffer类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!StringBuffer类Stri
2023-06-29

​Java HorizontalAlign类怎么使用

Java中没有内置的HorizontalAlign类,但是可以通过使用JavaFX的HorizontalAlignment类来实现水平对齐。下面是一个使用JavaFX水平对齐的示例代码:import javafx.application.
2023-10-21

Java Infoflow类怎么使用

Infoflow类是Java中用于处理信息流的一个类,它提供了一些方法和属性用于管理和操作信息流。要使用Infoflow类,你需要进行以下步骤:1. 导入Infoflow类:javaimport java.io.Infoflow;2. 创建
2023-10-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录