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构造方法

Socket(String host, int port)

host是服务器的IP地址,port是端口号

异常

建立套接字对象可能发生IOException异常,要处理好异常

try { Socket mysocket = new Socket("http://192.168.0.78",1880); } catch(IOException e){}

输入输出信息

套接字建立后,可以想象一条通信“线路”已经建立起来

我们可以用getInputStream() 获得一个输入流,然后用这个输入流读取服务器放入“线路”的信息(不能读取自己放入线路的信息)。
我们也可用getOutputStream()获得一个输出流,然后用这个输出流将信息写入“线路”
后面把mysocket用方法getInputStream()得到的输出流连接到一个DataInputStream流上,向这个流发送信息,因为这个流有更好的向流中写入信息的方法,getOutStream()同理

4.ServerSocket类

为了使客户成功连接至服务器,服务器必须建立一个ServerSocket对象,该对象将客户端的套接字对象和服务端的一个套接字对象连接。

构造方法

ServerSocket(int port)

port是端口号,该端口号必须和客户呼叫的端口号相同。(这里端口可以理解为通道的编号?)

异常

建立ServerSocket对象时可能发生IOException异常

try { ServerSocket server_socket = new ServerSocket(1880); } catch(IOException e){}

accept方法

对象建立后,就可以用accept()方法将客户端的套接字和服务器端的套接字连接起来

try { Socket sc = server_socket.accept(); } catch(IOException e){}

accept()方法会返回一个和客户端Socket对象相连接的Socket对象

服务器端通过accept()方法得到的这个对象sc使用方法getOutputStream()获得的输出流将指向客户端的mysocket使用方法getInputStream()获得的那个输出流。
同样,服务器端的sc使用方法getInputStream()获得的输出流将指向客户端mysocket使用方法getOutputStream()```获得的输出流

因此,当服务器向这个输出流写入信息时,客户端就能读取,反之亦然。

注意accept()方法会堵塞线程
accept()方法会堵塞线程的继续执行,直到接收到客户的呼叫。
在下述代码中,如果没有客户呼叫服务器,那么下述代码中的System.out.println("ok")就不会执行

try { Socket sc = server_socket.accept(); System.out.println("ok"); } catch(IOException)

获取IP

连接建立后,服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有客户端的IP地址和域名
同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有服务器端的IP地址和域名

关闭套接字连接

通信完毕后,应使用close()方法关闭套接字连接

5.把套接字连接放在一个线程中

客户使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象调用

public void connect(SocketAddress endpoint) throws IOException

请求和参数SocketAddress指定地址的套接字对象建立连接
为了使用connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象。InetSocketAddress的构造方法如下:

public InetSocketAddress(InetAddress addr, int port)

__EOF__

本文作者cheng_zhi
本文链接https://www.cnblogs.com/chengzhid/p/15616524.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cheng_zhi  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示