客户端类:Socket类


  • TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流

  • java.lang.Object
    继承者 java.net.Socket

  • 构造方法:

    1. Socket(String host, int port)
      创建一个流套接字并将其连接到指定主机上的指定端口号。
      参数:
      String host:服务器主机名/IP地址
      int port:服务器的端口号
  • 成员方法:
    1. OutputStream getOutputStream()
      返回此套接字的输出流。
    2. InputStream getInputStream()
      返回此套接字的输入流。
    3. void close()
      关闭套接字
  • 注意:
    1. 客户端和服务器端交互时,必须使用Socket中提供得网络流,不能使用自己创建的流对象
    2. 当我们创建客户端Socket对象时,就会使用TCP协议与服务器建立连接通路,若服务器没有启动,就会抛出异常。

服务器类:ServerSocket类


  • TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据,两次IO流,一直处于等待状态

  • java.lang.Object
    继承者 java.net.ServerSocket

  • 构造方法:
    1. ServerSocket(int port)
      创建绑定到特定端口的服务器套接字,不设置操作系统随机分配,无法通信。
  • 成员方法
    1. Socket accept()
      侦听并接受到此套接字的连接。
  • 注意: 服务器端必须明确一件事,必须知道是哪个客户端请求的服务器,所以可以使用accept()方法获取到请求的客户端对象Socket


package cn.learn.web;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class client {
    public static void main(String[] args) throws IOException {
        //1.创建客户端对象Socket,构造方法绑定服务器IP地址和端口号
        Socket socket = new Socket("127.0.0.1",8020);
        //2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream outputStream = socket.getOutputStream();
        //3.使用流中的write方法给服务器发送数据,需要转换成字节数组
        outputStream.write("服务器你好".getBytes());

        //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream clientIn = socket.getInputStream();
        //5.使用InputStream对象中的read()方法,读取服务器回写的数据
        byte[] bytes = new byte[1024];
        int len =clientIn.read(bytes);
        //打印看看
        System.out.println(new String(bytes,0,len));

        //6.释放资源,只关闭Socket的IO流就行
        socket.close();

    }
}

package cn.learn.web;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        //1.设置通信端口号,不然系统随机分配
        ServerSocket server = new ServerSocket(8020);

        //2.使用serverSocket对象中的方法accept,获取到请求的客户端对象Socket(含地址和端口号)
        Socket socket1 = server.accept();

        //3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream serveIn = socket1.getInputStream();

        //4.使用serveIn的方法read,读取客户端发送的数据
        byte[] bytes = new byte[1024];
        //获取读取的数据有效长度
        int len = serveIn.read(bytes);
        //打印看看
        System.out.println(new String(bytes,0,len));

        //5.使用Socket对象中的方法getOutputStream()获取网络字节输入流OutputStream对象
        OutputStream serverOut = socket1.getOutputStream();

        //6.使用serverOut中的write方法回写给客户端
        serverOut.write("我收到了".getBytes());

        //7.释放socket1与server的流
        server.close();
        socket1.close();
    }
}
01-19 16:10