Java网络编程基础 1 建立一个提供当前时间字符串的ServerSocket

Java从入门到精通十三(java网络编程) 计算机网络编程就是在我们具体的网络通信协议的规则下,进行实现不同计算机上运行程序的一个数据交换或者说是数据通信的一个过程实现。 阅读详情

一个在本机7777端口提供字符串时间的Socket服务,程序运行后,可以在命令行直接telnet localhost 7777进行测试。

程序虽然简单,但包含了很多相当有用的知识。在程序后面列举了几个我觉得需要注意的地方。(当然还有很多可以讨论地方。)

复杂的东西都是一点一滴建立在简单的模型或者框架上的。所以要想写出很漂亮和健壮的Socket程序,还得从头开始吧。

下面一篇文章我会写一个简单的客户端Socket程序用以和这个ServerSocket交互。

1 只能同时处理一个客户端,想想为什么? @_@

 

import java.util.Date;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ClientServer
    extends Thread {
  private int port;
  private ServerSocket serverSocket;

  public ClientServer(int port) throws IOException {
    this.port = port;
    this.init();
  }

  private void init() throws IOException {
    this.serverSocket = new ServerSocket(this.port);
    this.setDaemon(true);
    this.start();
  }

  public void run() {
    Socket clientSock = null;
    while (true) {
      try {
        System.out.println("---------------DateServerTcpServer run----------------------");
        clientSock = this.serverSocket.accept();  //
见注意点2
  boolean validConnection = true;
  //do sth to check clientSock
        if (validConnection) {
    System.out.println("Connection accepted : " + clientSock.toString());
    //send a message to client
    PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSock.getOutputStream())));//
见注意点4
    String info = "a message from server!";
    Date now = new Date();
    writer.println(info+now.toString());
    writer.flush();
    //receive a message from client
    System.out.println("[wait a response]");
    try{
   Thread.currentThread().sleep(15000);
    }catch(Exception e){
    }
    BufferedReader reader = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
    System.out.println(reader.readLine());//
见注意点2
    writer.close();
    reader.close();
    clientSock.close();//
见注意点3
        }
      }
      catch (Exception e) {
    e.printStackTrace();
        try {
          if (clientSock != null) {
            clientSock.close();
          }
        }
        catch (Exception ee) {
          clientSock = null;
        }
      }
    }
  }

  public int getPort() {
    return port;
  }

  public static void main(String[] args) {
    try {
        int port = 7777;
        ClientServer server = new ClientServer(port);
    } catch (IOException ex) {
        ex.printStackTrace();
    }

 

    while (true) {
      try {     //
见注意点1
          Thread.currentThread().sleep(30*1000);//server run for 30 seconds!
      }
      catch (InterruptedException e) {
          e.printStackTrace();
      }

    }
  }
}


 

注意点:(不知道有没有理解错误的地方)

 

1 在这里这个ServerSocket是放在一个后台线程里运行的,所以当主线程(main所在的那个线程)退出时,后台线程也自动中断退出了。这里 通过在main里用Thread.currentThread().sleep(30*1000);让主线程休息30秒来让ServerSocket达到运行30秒的效果,如果要让程序运行1个小时,把sleep里的参数改成(60*60*1000)(单位是毫秒)。(后台线程指无法单独运行的线程)

 

 

2 clientSock = this.serverSocket.accept(); 和 System.out.println(reader.readLine());都是阻塞语句 (不知道用这个词语恰不恰当),,正常情况下,只有当条件满足,程序才会继续执行下去。clientSock = this.serverSocket.accept()表示只有当客户端尝试去连接这个ServerSocket的(程序里是本机的7777端口)。程序才会返回一个新Socket用于跟客户端通信。(当然这是正常情况,非正常情况程序也有其他途径返回的,比如抛出异常)。

Accept()应该是ServerSocket最重要的方法了,所以这里列出JDK中的资料供参考

accept

public Socket accept()

              throws IOException

侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

创建新套接字 s,如果存在安全管理器,则使用 s.getInetAddress().getHostAddress() 和 s.getPort() 作为参数调用安全管理器的 checkAccept 方法,以确保允许该操作。这可能会导致 SecurityException 异常。

返回:

新套接字

抛出:

IOException - 如果等待连接时发生 I/O 错误。

SecurityException - 如果安全管理器存在并且其 checkListen 方法不允许进行该操作。

SocketTimeoutException - 如果以前使用 setSoTimeout 设置了超时并且已到达超时值。

IllegalBlockingModeException - 如果此套接字具有相关联的通道、通道处于非阻塞模式并且不存在准备接受的连接

另请参见:

SecurityManager.checkAccept(java.lang.String, int)

在这里ServerSocket主要是提供时间服务的,所以并不需要客户端响应。这里提供System.out.println(reader.readLine())的语句,只是为了表明服务端跟客户端的

交互是双向的。readLine()也是阻塞语句,正常情况下只有在流中读到行才会正常返回。在JDK文档中BufferdReader的readLine()方法并没有提到是不是阻塞的。

因为readLine()方法的实质只是一个不断的调用read()方法的过程。所以我们再参考下read()方法。(看下面说明),在里面也没有提到阻塞这个概念!

因为BufferedReader的read()的方法是覆盖父类的read()方法,所以也有必要参考下父类Reader的read()方法。在JDK中是这么说明的

读取单个字符。在有可用字符、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

BufferedReader类

readLine

public String readLine()

                throws IOException

读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('/n')、回车 ('/r') 或回车后直接跟着换行。

返回:

包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

抛出:

IOException - 如果发生 I/O 错误

 

read

public int read()

         throws IOException

读取单个字符。

覆盖:

类 Reader 中的 read

返回:

作为范围 0 到 65535 (0x00-0xffff) 的整数读入的字符,如果已到达流末尾,则返回 -1

抛出:

IOException - 如果发生 I/O 错误

3 因为Socket是有限的系统资源,所以我们在使用完以后应该使用clientSock.close();关闭以便还给系统。

4 PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSock.getOutputStream())));

在这里,其实不用以这么麻烦的形式去往流里仅仅输入字符串形式的时间的,但是以这么优美的语句去书写想要表达的概念确实

一个非常痛快的事情。用最直接,最简洁的语句表达出想要做的事情, 是程序员最喜欢的形式。~~~(本来就是因为有好用的接口,好用的标准库,

直观简洁的代码才喜欢Java.~~~@_@)

 

YOLOv8使用设备摄像头实时监测 阅读详情

相关推荐

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 819

BufferedReader的readLine()为非阻塞

BufferedReader的readLine()为非阻塞,阻塞部分主要在 Socket clientSocket = serverSocket.accept(); public class ShutDownServer { static ServerSocket serverSocket = null;// 服务socket public stat

u012507301的博客 3237

用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南

本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。

weixin_28842269的博客 402

java网络TCP套接字使用Object I/O stream出现异常

起因:Object I/O stream带有Data I/O stream的大部分方法,而且功能更为强大,在使用Data I/O stream的大部分地方都是可以使用Object I/O stream的,又因为文本I/O是需要转码的,二进制I/O的效率比文本I/O的效率更高一些,而Object I/O 又带有今天例题里面需要的writeDouble() 等方法,我便用Object I/O stre

long for us 674

下载Python3.10的相关方法及问题解决

下载Python3.10的相关方法及问题解决 报错unable to locate package python3.10-dev以及subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决

Istil 1555

在mdk文件移植太多_XCubeClassB代码 的移植

前言ST在www.st.com官网上提供了针对IEC60730/IEC60335 ClassB认证的软件包。软件包分为三个,分别适用STM8,STM32(基于标准外设库)和STM32(基于HAL库):STM8-SafeCLASSB,STM32-CLASSB-SPL,X-CUBE-CLASSB。本文以X-CUBE-CLASSB为例介绍如何做代码的移植以及经常遇到的问题的解决办法。X-CUB...

weixin_28898707的博客 1832

【 java网络编程 】Socket、ServerSocket 的用法

通过这个输出流写出的字节数据会通过网络发送给对方。读取的是远端计算机发送过来的数据。该方法会获取一个字节输出流,通过该方法获取的字节输入流,

qq_36028783的博客 870

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

本文全面解析了复旦微FMQL100TAI900 FPGA原型验证板在国产AI硬件领域的创新突破。该板卡采用全栈国产化设计,具备出色的AI推理性能、视频处理能力和接口生态,特别适合工业质检、智能交通等场景。文章详细介绍了其芯片架构、存储子系统、接口扩展及电源设计,并分享了实战开发经验,为开发者提供了一套可靠的国产计算平台解决方案。

weixin_29250573的博客 456

Java基础系列十二 Java网络编程

Java基础系列第十二章 Java网络编程 网络编程基础:通信协议、Java网络编程,IP地址与InetAddress类,通信端口与URL类,Socket技术:Socket类、ServerSocket类、TCP协议

924

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

前程算法屋的博客 5593

Simulink仿真状态空间中状态变量时域响应

起因 今天老师留了一道关于状态空间变量响应的题,于是想用simulink仿真,一开始使用state-space模块,但是发现它只能输出y,没办法显示状态变量的变化情况。然而状态变量之间的关系都可以表示为一阶微分方程组,因此我们考虑在Simulink中搭建微分方程组来求解这个问题。 微分方程组 x1˙=x2x2˙=−4x1−5x2+1(1)\dot{x_1}=x_2\\ \dot{x_2}=-4x_...

ZYunfei的博客 7447

Java_网络编程中的Socket与ServerSocket的应用方法

Java_网络编程中的Socket与ServerSocket的应用方法 Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 构造方法 public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指 定的host是null ,则相当于指定地址为回送地址。 成员方法 public InputStream getInputStream():返回此套接字的输入流。 如果此Scoket具有相关联的通道,则生成的Inp

LiMgYe_OK的博客 550

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3267

java中的网络编程(秒懂)

通过计算机网络可以实现多台计算机的连接,但是不同计算机的操作系统和硬件结构不同,为了提供通信支持,以及两台计算机之间如何进行数据传输,传输数据的格式是怎样的,为此制定了一个网络中计算机之间通信的协议(制定的通信的一种规则),对数据的传输格式,传输速率,传输步骤等做了一系列的规定。

2301_77721901的博客 1587

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java网络编程

Java网络编程

YIYIYI 1101

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java-网络编程基础

无连接:UDP 不需要像 TCP 那样先建立连接,直接发送数据包。不可靠:不保证数据包一定能送达、不保证顺序、不保证不重复。:负责通信端点(发送/接收)。:负责封装数据及其目标/来源信息。发送时构造需要指定目标地址和端口。接收时构造只需指定缓冲区,接收后可通过和getPort()获取来源信息。注意receive()方法是阻塞的。注意异常处理 (

m0_56561113的博客 851

【Java基础】 网络编程

在数字化时代,网络编程已成为软件开发中的重要组成部分。无论是构建分布式系统、实现实时通讯还是进行Web开发,都需要深入了解网络编程的基础知识和技术。这种技能不仅在IT领域至关重要,还在非计算机行业的岗位中发挥着越来越重要的作用。。网络编程的核心在于实现不同计算机之间的数据交换,而Java为此提供了丰富的类库和接口。一般情况下,在进行网络编程之前,应该掌握与网络有关的知识,甚至对细节也非常熟悉。例如网络通信协议、网络参考模型等。本文只介绍Java网络编程的相关概念,有关网络知识的内容请参看其他资料。

good good study day day up 1402

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

hutao8896的博客 903

1.10(java高级特性)网络编程

前言 感谢大家的观看,如果中间遇到写的有问题的地方,请多多指教 此文章,我是通过尚硅谷的视频进行编写的。我在之后的时间会将此类文章全部编写出来。完成我的java冲刺小专栏。谢谢大家的观看 [硅谷学习路线](2021年度全网最全Java学习路线 - 哔哩哔哩 (bilibili.com)) 网络编程 Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本

weixin_46401545的博客 2041

Java网络编程:TCP与UDP通信实现及网络编程基础

是Java中用于表示IP地址的类,提供了获取主机名、IP地址等网络信息的方法。UDP:无连接、速度快、不可靠,适用于实时通信(如视频、游戏);TCP:面向连接、可靠、速度较慢,适用于数据准确性要求高的场景(如文件传输、登录)。开发步骤上,UDP通过和实现数据报传输,TCP通过和Socket实现字节流传输。实际开发中,需根据业务需求选择协议,并注意资源释放(如关闭Socket)、并发处理(如线程池)等问题。

FUYY'S BLOG 1335

Java网络编程基础知识,适合新手小白,收藏这篇就够了

UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

Libra1313的博客 1071

java网络编程:Socket和ServerSocket类

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议

chenpeng19910926的专栏 1173

[网络编程】网络编程的基础使用

在本文中主要讲解了TCP和UDP两个协议之间的区别;同时对UDP网络编程进行了最基础的创建。

Starc_的博客 1262

Java网络编程--C/S架构

2.1 概述 TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。 两端通信时步骤: 服务端程序,需要事先启动,等待客户端的连接。 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。 在Java中,提供了两个类用于实现TCP通信程序: 客户端:java.net.Socket 类表示。创建Socket对象,向服务...

cat marshal的博客 7350

java网络编程基础——TCP网络编程一

基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路。 Java使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 1、ServerSocket java中能接收其他通信实体连接请求的类是ServerSocket,他会监听来自客户端Socket连接,如果没有连接,它...

weixin_30708329的博客 101

JAVA网络编程基础

1、TCP和UdP在java中支持网络通讯程序的开发。 Tcp协议是可靠的连接传输,使用三方握手的方式完成通讯的 udp协议不可靠的连接传输,传输额时候接收方不一定可以接受到。   2、IP internet protocol 电脑在互联网中的身份 Ip地址=网路地址

刚上路的IT小兵 780
上一篇: C++开源跨平台类库集
下一篇: 大端法,小端法,位域[1]
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值