网络编程socket类

通信要素

  • ip + 端口号
  • 传输协议

TCP/IP协议簇

  • ip协议
    • 计算机网络地址定位协议
    • IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信
  • tcp协议/udp协议,实际使用协议
    • 传输协议
    • TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
    • 区别:
tcp/udp tcp udp
通道 使用TCP协议前,须先建立TCP连接,形成传输数据通道 将数据、源、目的封装成数据包,不需要建立连接
可靠性 传输前,采用“三次握手”方式,是可靠的 因无需连接,故是不可靠的
节点 TCP协议进行通信的两个应用进程:客户端、服务端
传输 在连接中可进行大数据量的传输 每个数据报的大小限制在64K内
效率 传输完毕,需释放已建立的连接,效率低 发送数据结束时无需释放资源,速度快
应用 传输文件,压缩包,等不可破环的文件 视频,直播,语音等缺少一两个字节仍没关系的
  • OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广(各层有功能重叠现象)
OSI参考模型 TCP/IP参考模型 TCP/IP参考模型各层对应协议
应用层 应用层 HTTP、ftp、telnet、DNS…
表示层
会话层
传输层 传输层 TCP、UDP、…
网络层 网络层 IP、ICMP、ARP…
数据链路层 物理+数据链路层 Link

端口号

  • 端口号标识正在计算机上运行的进程(程序)
  • 不同的进程有不同的端口号
  • 被规定为一个 16 位的整数 065535。其中,01023被预先定义的服务通信占用(如MySql占用端口3306,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突
  • 理解,系统分配给应用对网路交流的总线地址,和端口绑定,当网络有数据传来,系统通过端口号来传给相应的应用
  • 端口号与IP地址的组合得出一个网络套接字

InetAddress类

  • 代表ip
  • Internet上的主机有两种方式表示地址:
    • 域名(hostName):www.atguigu.com
    • IP 地址(hostAddress):202.108.35.210
  • InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
  • InetAddress 类对象含有一个 Internet 主机地址的域名和IP地址:www.atguigu.com 和 202.108.35.210。
  • 域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。 -------域名解析
  • ip4: 4字节编码;ip6: 16字节编码,几乎可以把网络上的一切进行编码
  • 常用方法:
    • static InetAddress[] getAllByName(String host)根据host拿到ip序列
      • Given the name of a host, returns an array of its IP addresses, based on the configured name service on the system.
    • static InetAddress getByName(String host) 获取ip
      • Determines the IP address of a host, given the host's name.
    • String getHostName() 获取本类ip
      • Gets the host name for this IP address
    • java.net.InetAddress 类
      • 更多方法查询api。

socket

  • 网络套接字,上面的了解,socket是实际编程中使用的类,会编写基本的代码即可。
  • ServerSocket(int poart) //服务器端(端口号)
  • Socket accept()//等待请求,阻塞状态,返回套接字对象
  • Socket(String,poart) //客户端,创建即连接
  • 127.0.0.1,代表本机,另外loacal也代表本机
  • 浏览器访问Serversocket(),地址栏输入协议、ip、端口号即可
方法 功能
InetAddress getLocalAddress() 返回对方Socket中的IP的InetAddress对象
int getLocalPort() 返回本地Socket中的端口号
InetAddress getInetAddress() 返回对方Socket中IP地址
int getPort() 返回对方Socket中的端口号
void close() throws IOException 关闭Socket,不可在以后的网络连接中使用,除非创建新的套接字
InputStream getInputStream() throws IOException 获取与Socket相关联的字节输入流,用于从Socket中读数据。
OutputStream getOutputStream() throws IOException 获取与Socket相关联的字节输出流,用于向Socket中写数据。

ServerSocket类

方 法 功 能
Socket accept() throws IOException 等待客户端的连接请求,返回与该客户端进行通信用的Socket对象
void setSoTimeout(int timeout) throws SocketException 设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效。
void close()throws IOException 关闭监听Socket
InetAddress getInetAddress() 返回此服务器套接字的本地地址
int getLocalPort() 返回此套接字在其上监听的端口号
SocketAddress getLocalSocketAddress() 返回此套接字绑定的端点的地址

基于Socket的TCP编程

  • 客户端Socket的工作过程包含以下四个基本的步骤:
    1. 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
    2. 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
    3. 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
    4. 关闭 Socket:断开客户端到服务器的连接,释放线路
  • 客户端
    • 客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造方法是:
      • Socket(String host,int port)throws UnknownHostException,IOException:向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。
      • Socket(InetAddress address,int port)throws IOException:根据InetAddress对象所表示的IP地址以及端口号port发起连接。
    • 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求
//客户端模型
Socket s = new Socket(“192.168.40.165”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();
  • 服务器程序的工作过程包含以下四个基本的步骤:
    • 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
    • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
    • 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
    • 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
//服务器模型
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();
posted @ 2018-11-25 11:14  热风轻浮  阅读(384)  评论(0编辑  收藏  举报