Java基于TCP的网络编程

By | 2017年 3月 15日

Java基于TCP的网络编程

1.Socket类

  • 构造方法
    • Socket(InetAddress | String host,int port) 创建连接到指定远程主机和端口号的Socket对象,该构造方法没有指定本地地址和本地端口号,默认使用本地主机IP地址和系统动态分配的端口;
    • Socket(InetAddress | String host,int port,InetAddress localAddr ,int localPort)创建连接到指定主机和端口号的Socket对象,并指定本地IP地址和本地端口号,适用用本地主机有多个IP地址的情况
方法 功能描述
public InetAddress getInetAddress() 返回连接到远程主机的地址,如果连接失败则返回以前连接的主机
public int getPort() 返回Socket连接到远程主机的端口号
public int getLocalPort() 返回本地连接终端的端口号
public InputStream getInputStream() 返回一个输入流,从Socket读取数据
public OutputStream getOutputStream() 返回一个输出流,往Socket中写数据
public synchronized void close() 关闭当前Socket连接
  • 创建步骤:
      1. 根据指定IP地址和端口号创建一个socket对象
      1. 调用getInputStream()方法或getOutputStream()方法打开连接到Socket的输入/输出流
      1. 客户端和服务器根据协议进行交互,直到关闭连接
      1. 关闭客户端的Socket

实例代码

上面的代码创建了一个连接到本机,端口为28888的Socket对象;再使用getOutputStream()获取Socket对象的输出流,用于往服务器发送信息,然后使用getInputStream()获取Socket对象的输入流,读取服务器返回的数据;最后关闭输入/输出流和Socket连接,释放所有的资源

2.ServerSocket类

ServerSocket是服务器套接字,运行在服务器端,通过指定端口主动监听来自客户端的Socket连接,当客户端发送Socket请求并与服务器端建立连接时,服务器将验证并接受客户端的Socket,从而建立客户端与服务器之间的网络虚拟链路,一旦两端的实体之间建立了虚拟链路,就可以互相传送数据。

  • 构造方法
    • ServerSocket(int port)---- 根据指定端口来创建一个ServerSocket对象;
    • ServerSocket(int port,int backlog)----创建一个ServerSocket对象,指定端口和连接队列长度,此时增加一个用来改变连接队列长度的参数backlog;
    • ServerSocket(int port,int backlog,InetAddress localAddr)----创建一个ServerSocket对象,指定端口,连接队列长度和IP地址;当机器拥有多个IP地址时,才允许使用localAddr参数指定具体的IP地址。
方法 功能描述
public Socket accept() 接受客户端Socket连接请求,并返回 一个与客户端Socket对应的Socket实例;该方法是一个阻塞方法,如果没有接收到客户端发送的Socket,则一直处于等待状态,线程也会被阻塞
public InetAddress getInetAddress() 返回当前ServerSocket实例的地址信息
public synchronized void close() 关闭当前Socket实例
  • 具体步骤:
      1. 根据指定的端口号来实例化一个ServerSocket对象;
      1. 调用serverSocket对象的accept()方法接受客户端发送的Socket对象;
      1. 调用Socket对象的getInputStream()/getOutputStream()方法来建立与客户端进行交互的IO流
      1. 服务器与客户端根据一定的协议交互,直到关闭连接;
      1. 关闭服务器端的Socket;
      1. 回到第2步,继续监听下一次客户端发送的Socket请求连接;

示例代码:

上述代码服务器端是一个多线程应用程序,能为多个客户提供服务。在ServerSocketDemo构造方法中,先创建一个用于监听28888端口的ServerSocket对象,在调用this.start()方法启动线程。在线程的run()方法中,先调用ServerSocket对象的accept()方法来接收客户端发送的Socket对象,再使用getInputStream()获取Socket对象的输入流,用于读取客户端发送的数据信息;然后使用getOutputStream()获取Socket对象的输出流,往客户端发送信息;最后关闭输入,输出流和Socket释放所有的资源。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注