Socket套接字学习笔记
套接字Socket
1.IP与端口
IP
IP地址标识Internet上的计算机
(待补充)
端口
端口号标识正在计算机上运行的进程(程序)。
端口号被规定为一个16位的065535($2^{16}-1$)之间的整数,其中01023被预先定义的服务通信占用(如telnet占用端口23、http占用端口80等),除非需要访问这些特定服务,否则应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突
2.什么是Socket
当两个程序需要通信时,它们可以通过Socket类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)
3.客户端的套接字对象
Socket构造方法
host是服务器的IP地址,port是端口号
异常
建立套接字对象可能发生IOException异常,要处理好异常
输入输出信息
套接字建立后,可以想象一条通信“线路”已经建立起来
我们可以用getInputStream()
获得一个输入流,然后用这个输入流读取服务器放入“线路”的信息(不能读取自己放入线路的信息)。
我们也可用getOutputStream()
获得一个输出流,然后用这个输出流将信息写入“线路”。
后面把mysocket用方法getInputStream()
得到的输出流连接到一个DataInputStream
流上,向这个流发送信息,因为这个流有更好的向流中写入信息的方法,getOutStream()
同理
4.ServerSocket类
为了使客户成功连接至服务器,服务器必须建立一个ServerSocket对象,该对象将客户端的套接字对象和服务端的一个套接字对象连接。
构造方法
port是端口号,该端口号必须和客户呼叫的端口号相同。(这里端口可以理解为通道的编号?)
异常
建立ServerSocket对象时可能发生IOException异常
accept方法
对象建立后,就可以用accept()方法将客户端的套接字和服务器端的套接字连接起来
accept()
方法会返回一个和客户端Socket对象相连接的Socket对象
服务器端通过accept()
方法得到的这个对象sc使用方法getOutputStream()
获得的输出流将指向客户端的mysocket使用方法getInputStream()
获得的那个输出流。
同样,服务器端的sc使用方法getInputStream()
获得的输出流将指向客户端mysocket使用方法getOutputStream()```获得的输出流
因此,当服务器向这个输出流写入信息时,客户端就能读取,反之亦然。
注意accept()
方法会堵塞线程
accept()
方法会堵塞线程的继续执行,直到接收到客户的呼叫。
在下述代码中,如果没有客户呼叫服务器,那么下述代码中的System.out.println("ok")
就不会执行
获取IP
连接建立后,服务器端的套接字对象调用getInetAddress()
方法可以获取一个InetAddress对象,该对象含有客户端的IP地址和域名
同样,客户端的套接字对象调用getInetAddress()
方法可以获取一个InetAddress对象,该对象含有服务器端的IP地址和域名
关闭套接字连接
通信完毕后,应使用close()
方法关闭套接字连接
5.把套接字连接放在一个线程中
客户使用Socket类不带参数的构造方法Socket()
创建一个套接字对象,该对象调用
请求和参数SocketAddress
指定地址的套接字对象建立连接
为了使用connect
方法,可以使用SocketAddress
的子类InetSocketAddress
创建一个对象。InetSocketAddress
的构造方法如下:
__EOF__

本文链接:https://www.cnblogs.com/chengzhid/p/15616524.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通