Java网络编程笔记——Socket用法详解

Socket笔记——Socket用法详解

       在客户/服务器通信模式中,客户端需要主动创建与服务器连接的Socket,服务器端接收到了客户端的连接请求,也会创建与客户点的连接Socket。Socket可以看作是通信连接两端的收发器,服务器与客户端都通过Socket来收发数据。

构造Socket

Socket() //通过系统默认类型的 SocketImpl 创建未连接套接字 

Socket(InetAddress address, int port)//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) //创建一个套接字并将其连接到指定远程地址上的指定远程端口。 

 

设置等待建立连接的超时时间

       当客户端的Socket构造方法请求与服务器连接时,可能需要等待一段时间。默认情况下,Socket构造方法会一直等待下去,知道连接成功,或者出现异常。Socket构造方法请求连接时,受底层网络的传输速度影响,可能会处于长时间的等待状态。

如果希望限定等待连接的时间,需要设置建立连接的超时时间,此时需要一个不带啊承诺书的构造方法:

Socket socke = new Socket();

SocketAddress remoteAddr = new InetSocketAddress("localhost":8000);

socket.connect(remoteAddr,60000);//等待建立连接超时时间为1分钟

如果程序在1分钟内成功连接,则connect()方法顺利返回;如果在1分钟内出现某种异常,则抛出该异常;如果超过1分钟,既没有连接成功,也没有出现其他异常,则会抛出SocketTimeoutException。Socket类的connect(SocketAddress endpoint,int timeout)方法负责连接服务器,参数endpoint指定服务器地址,参数timeout设定超市时间,以毫秒为单位,如果参数timeout设为0,表示永远不会超时

 

设定服务器地址:

       Socket除了一个不带参数的构造方法,其它的构造方法都需在参数中设定服务器的地址,包括服务器的IP地址或者主机名,以及端口:

Socket(InetAddress address,int port)//第一个参数address表示主机的IP地址

Socket(String host,int port)//第一个参数host代表主机的名字

InetAddress类表示服务器的IP地址,InetAddress类提供了一系列静态方法,用于构造自身实例,例如:

//返回本地主机IP地址

InetAddress addrl = InetAddress.getLocalHost();

//返回“222.23.2.2”的IP地址

InetAddress addr2 = InetAddress.getByName("222.23.2.2);

//返回域名为www.googel.com的ip地址

InetAddress addr3 = InetAddress.getByName("www.googel.com");

 

设定客户端的地址

       在一个Socket对象中,既保包含了远程服务器的IP地址和端口信息,也柏涵了本地客户端的IP地址和端口信息。默认情况下客户端的IP地址来自于客户端程序所在的主机。客户端的端口地址则来自于操作系统的随机分配。

Socket类还有两个构造方法允许显示地设置客户端的IP地址和端口

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 

          创建一个套接字并将其连接到指定远程地址上的指定远程端口。

如果一个主机同时属于两个以上的网络,它就可能拥有连个以上的IP地址。

 

获得Socket信息:

getInetAddress():获得远程服务器的IP地址

getPort():获得远程服务器的端口

getLocalAddress():获得客户班底的IP地址

getInputStream():获得输入流。如果Socket还没有连接,或者已近关闭,或者已经通过shutdownInput()方法关闭输入刘,那么此方法会抛出IOException。

getOutputStream():获得输出流,如果Socket还没有连接,或者让已经关闭,或者已近通过shutDown()方法关闭输出流,那么此方法会抛出IOException

关闭Socket:

当客户端与服务器的通信借宿,应该即使关闭Socket,以释放Socket占有的包括端口在内的各种资源。Socket的close()方法负责关闭Socket。放一个Socket对象被关闭,就不能再通过他的输入流和输出流进行I/O操作,否则会导致IOException

为了确保关闭Socket的操作总是被执行,强烈建议把这个操作放在finally代码块中

 

设置Socket选项:

SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址

SO_TIMEOUT:表示接收数据时的等待超时时间

SO_LINGER:表示当执行Socket的close方法时,是否立即关闭底层的Socket

SO_SNFBUF:表示发送数据的缓存区大小

SO_RCVBUF:表示接受数据的缓冲区大小

SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。

 

TCP_NODELAY:表示立即发送数据

设置选项:public void setTcpNoDelay(boolean on)throws SocketException

读取选项: public boolean getTcpNoDelay()throws SocketException

默认情况下,发送数据采用Negale算法,Negale算法发送数据不会立即发送,而是先放在缓冲区内,等缓存区满了以后再发出去。发送完一批数据后,会等待接受放对这批数据的回应,然后才发送下一批数据。Negale适用于发送放需要发送大批量数据,并且接收方会及时做出回应的场合,这种算法通过减少传输数据的次数来提高通信效率。

不过对于GUI程序,如网络游戏程序等需要实时发送数据到服务器上,由于Negale算法采用缓冲,大大降低了实时的响应速度,导致客户程序运行很慢。

TCP_NODELAY默认值为false,表示采用Negale算法。如果调用setTcpNoDelay(true),就会关闭Sokcet的缓冲,确保数据即使发送

SO_RESUSEADDR选项

设置该选项:public void setResuseAddress(boolean on)throws SocketException

读取该选项:public void getResusAddress(boolean on)throws SocketExcpetion

当接收放通过Socket的close()方法关闭Socket时候,如果网络上还有发送到这个Socket的数据,那么底层的Socket不会释放本地端口,而是等待一段时间,确保接收到了网络上发送来的延迟数据,然后再释放端口。Socket接收到的延迟数据后,不会对这些数据做任何树立,Socket接收延迟数据的目的是,确保这些数据不会被其他碰巧绑定到同样端口的新进程接收到。

为了确保一个进程关闭Socket后,即使它还没有释放端口,同一个主机上的其他进程还可以立刻重用该端口,可以调用Socket的setResuseAddress(true)方法:

if(!socket.getResuseAddress())socket.setResuseAddress(true):

值得注意的是socket.setResuseAddress(true)方法必须在Socket还没绑定到一个本地端口之前调用,否则执行socket.getResuseAddress(true)方法无效。

SO_TIMEOUT选项

设置该选项:public void setSoTimeout(int milliseconds)throws SocketException

读取该选项: public int getSoTimeOut()throws SocketException

当通过Socket的输入流读取数据时,如果还没有数据就会等待,例如在一下代码中,in.read(buff)方法从输入流中入去1024个字节:

byte[] buff = new byte[1024];

InputStream in=socket.getInputStream();

in.read(buff);

如果输入流中没有数据,in.read(buff)就会等待发送方发送数据,知道满足一下情况才结束等待:

1)输入流中有1024个字节,read()方法把这些字节读入到buff中,再返回读取的字节数

2)当已近快接近输入流的末尾,距离末尾还有小于1024字节,read()方法会把这些字节读取到buff中,再返回读取的字节数

3)已近读到输入流的末尾,返回-1

4)连接已近断开,抛出IOException

5)如果通过Socket的setSoTimeout方法设置了等待超时时间,那么超过这一时间后抛出SocketTimeoutException

Socket类的SO_TIMEOUT选项用于设定接收数据的等待超时时间,单位为毫秒,它的默认值为0,表示会无线等待,永远不会超时

SO_LINGER选项

设置该选项:public void setSoLinger(boolean on,int seconds)throws SocketException

读取该选项:public void getSoLinger()throws SocketException

SO_LINGER选项用来控制Socket关闭时的行为,默认情况下,执行Socket的close()方法,该方法会立刻返回,但底层的Socket实际上并不会立即关闭,它会延迟一段时间,知道发送完所有剩余的数据,才会真正关闭Socket,断开连接

如果执行以下方法:socket.setSoLinger(true,0):

那么执行Socket的close()方法,该方法也会立即返回,但底层的Socket也会立刻关闭,所有为发送完的剩余数据被丢弃

SO_KEEPALIVE选项

设置该选项:public void setKeepAlive(boolean on)throws SocketException

读取该选项:public void getKeepAlive()throws SocketException

当SO_KEEPALIVE选项为true时,表示底层的TCP实现会见识该连接是否有效。如果连接处于空闲状态超过2小时,本地的TCP实现会发送一个数据包给远程的Socket。如果远程Socket没有发回响应,TCP实现就会持续尝试11分钟,知道接收到响应为止。如果12分钟内未收到响应,TCP实现会自动关闭本地Socket,端口连接,在不同的网络平台上,TCP实现尝试与远程Socket对话的时限会有所差别

 

Socket 简介与 Java Socket 编程示例 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点。它是应用程序通过网络协议进行通信的接口,上联应用进程,下联网络协议栈。物理与逻辑层面:在物理层面上,Socket可能并不真实存在,它更多的是一个逻辑上的概念。但在网络编程中,Socket是不可或缺的组成部分。Socket是网络通信中的核心组件之一,它提供了应用层进程之间进行数据交换的机制。通过Socket,不同主机上的应用进程可以建立连接并传输数据。 阅读详情

相关推荐

HighTec安装(官网免费)编译 嘎嘎详细~

安装软件最好有自己的一套安装规则,工程软件除了安装主体外还会有很多其他的东西,比如license或者还会有一些驱动,如果所有都随意安装会导致你需要卸载,或者更新软件时,有的需要将原来软件卸载干净,如果没有清晰的安装路径那真是灾难啊~请确保此目录中只有个人许可证。这样基本的配置就ok了,下面打开hightec软件检验下license是否识别到了,会让你选个工作区,建议自己建一个,要不你以后就找不到了,,,如下图拉到下面,按照要求填写信息,随便写就行,注意主要的MAC地址要填本机的物理地址,然后点击2即可。

weixin_60793044的博客 1万+

Socket介绍及使用Java实现socket通信

使用Java实现socket通信。

weixin_49561506的博客 2万+

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

Java中的Socket编程详解

Socket(套接字)是网络通信的端点,允许在两台计算机之间通过网络进行数据交换。Socket是网络编程中必不可少的一部分,它建立在TCP/IP协议上,用于管理连接、传输数据。客户端Socket:用于连接远程服务器。服务器Socket:用于侦听客户端请求并与其建立连接。Java中的Socket编程通过和Socket类可以轻松实现客户端与服务器之间的通信。在实际开发中,Socket编程通常用于构建底层网络协议的基础。通过本文的示例,你应该对Java中的Socket编程有了基本的了解。

上进!努力!!! 7536

自监督学习原理与代码实战案例讲解

自监督学习原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 自监督学习的起源与发展 1.1.1 监督学习的局限性

AI天才研究院 623

µC/OS-II---任务就绪表

意思是:将变量OSRdyGrp中最低位为1的位数赋给y,那么,y就是最高优先级任务所在就绪表的行号,那么最高优先级的任务就在OSRdyGrp[y]行中,再根据。

weixin_45880844的博客 1649

Java网络编程——Socket 编程

Java网络编程——Socket 编程

涛涛的个人博客 1万+

SAP RAP 里的 EML 全解:从语言定位到事务语义,再到真实案例的落地方式

摘要:EML(Entity Manipulation Language)是ABAP RAP模型的核心组件,作为ABAP的子集用于操作业务对象(BO)。它通过声明式语法(READ/MODIFY/EXECUTE/COMMIT)统一访问BO的行为与数据,并由RAP运行时自动处理校验、锁定、草稿管理等生命周期。EML将业务语义融入代码,确保与Fiori应用共享同一套校验逻辑,并通过FAILED/REPORTED/MAPPED管道传递错误与消息。其事务控制(IN LOCAL MODE与COMMIT ENTITIES)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 528

java学习笔记————Socket网络编程小总结

**对于网络编程其实就相当于,在生活中人与人之间的交流,提问的一方作为用户端,回答问题的一方作为服务器端** 接下来我就和大家我学习socket网络编程所学到的知识

Belief的博客 497

【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用(图文记录详细步骤)

【详解】【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用

tttzzzqqq2018的博客 2452

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 827

java网络编程之socket编程笔记

网络编程也就是使得程序可以在网络上进行交互操作,使其具有网络功能,现在大部分程序开始转变为网络化,实时化。我们常用的QQ,等通讯工具,现在文字工具也开始网络化,如金山的wps。网络化的好处我就不多说了,你懂的! 开始正题吧: 由于刚刚学习网络编程,暂时是用socket来进行的。不知道大家对端口号这个东西了解不?如果不了解,可以去查看计算机网络这本书,讲得很详细。这里稍微讲一下,一般是指TCP/

yinqianhui1990的专栏 1137

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具,支持docker使用GPU。

周陽讀書 3820

java网络编程Socket笔记

    1.socket是对 tcp/ip协议的一个抽象接口,并非是对tcp/ip的一个封装。     2.socket系在java中的类关系:                             图中只列出了相关的的类,并没有列出相关的接口。    与socket联系最紧密,也是最核心的类为SocketImpl,但是他们的关系并不是通过继承而实现。而是通过了类似于静态代理的方式形成。 ...

automannn 460

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

网络编程 Socket 【java笔记】

Socket: 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。Socket通常用来实现client-server、连接。java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端。建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)-1204以下

冰叶的故事 524

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JAVA网络编程个人笔记 第8章 TCP Socket编程

JAVA网络编程个人笔记 第8章 TCP Socket编程TCP Socket编程计算机组网简介Socket与ServerSocket介绍相关知识简介使用Socket进行网络通信的过程Socket主要方法简介构造方法Socket的输入/输出流管理关闭Socket设置/获取Socket数据Socket演示建立Socket--在客户端建立Socket--在服务器端在客户端和服务器端同时打开输入/输出流关闭输入/输出流和Socket代码实例端口扫描客户端服务器端 TCP Socket编程 计算机组网简介

mcyuuji的博客 527

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java学习笔记--网络编程Socket

**今天学习了网络编程,主要用到Socket语句。 1.首先了解网络编程三要素 a.ip:一个计算机的标识,是一个网络之间互联的协议(Internet Protocol),每个终端有且仅有一个ip地址。 b.端口:设备与外界进行通信的出口,用来进行通信,分为物理端口和逻辑端口,这里用到的端口是逻辑端口, 有效端口的范围在0~65535之

qq_38026169的博客 272

Java 网络编程 学习笔记二 Socket 用法

<br /> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}

zwei_006的专栏 520

【Java学习笔记】基于Socket的TCP网络编程和UDP网络编程

一、基于Socket的TCP网络编程 TCP协议的特点: 使用TCP协议前,须先建立TCP连接,形成传输数据通道 传输前,采用“三次握手” 方式,点对点通信, 是可靠的 TCP协议进行通信的两个应用进程:客户端、 服务端。 在连接中可进行大数据量的传输 传输完毕,需释放已建立的连接, 效率低 客户端Socket 客户端程序的工作过程包含以下四个基本的步骤: 创建 Socket: 根据指定服务...

ENKU1的博客 433

Java网络编程精解笔记2:Socket详解

Socket用法详解      在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据.   1.构造Socket  1.Socket()  2.Socket(InetAddress addre

清闲的专栏 1132

java中socket包边界结束标记,《JAVA学习笔记》---网络编程Socket篇

一.Socket概述在JAVA的网络编程中主要涉及到的内容就是Socket编程。而Socket也称为套接字,是两台主机之间逻辑链接的端点。值得一提的是:Socket通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含了进行网络通信所必备的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。Socke...

weixin_32498321的博客 861

JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结

1、Socket可以说是对网络的一种抽象,通过它可以对网络中的数据进行读写,根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。 2、应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地

小冯的Blog 526

Java网络编程学习笔记(五)客户端Socket

使用SocketSocket是两台主机之间的一个连接。它可以完成7个基本操作: 连接远程机器。 发送数据。 接受数据。 关闭连接。 绑定端口。 监听入站数据。 在绑定端口上接受来自远程机器的连接。 Java的Socket类(客户端和服务端都可以使用)提供了前4个操作的方法。后面3个操作仅服务器需要,即等待客户端的连接,这些操作由ServerSocket类实现。构造和连接Socketjava.net.

DOUBLEYANCY 611

Java笔记网络编程-socket编程(TCP连接)

Socket:Socket就是为网络编程提供的一种机制;通信两端都有Socket;网络通信其实就 是;Socket之间的通信;数据在两个Socket间通过IO传输。

活在当下的博客 943

Java网络编程(Socket)学习笔记一

Java网络编程(Socket) 阻塞式方法,尝试获取资源,成功向下执行,否则线程一直等待。 客户端,服务端通信 Server public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new Server...

水滴的专栏 232
上一篇: 更有效率的使用Bitmap
下一篇: Java网络编程笔记_客户端协议处理框架
justdojava
博客等级 码龄17年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值