网络编程多线程(TCP 线程的创建) 3

TCP通信协议

TCP 通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端( Client )与服务端( Server )。
两端通信时步骤:
  1. 服务端程序,需要事先启动,等待客户端的连接。
  2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
Java 中,提供了两个类用于实现 TCP 通信程序:
  • 客户端:java.net.Socket类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信
  • 服务端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接

Socket类

Socket类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

构造方法:

public Socket(String host, int port):创建套接字对象并将其连接到指定的主机上的指定端口,如果指定的host是null,则相当于指定地址为会送地址.

Socket client=new Socket("127.0.0.1",6666);

成员方法

public InputStream getInputStream():返回此套接字的输入流
  • 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
  • 关闭生成的InputStream也将关闭相关的Socket

public OutputStream getOutputStream():返回此套接字的输出流

  • 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
  • 关闭生成的OutputStream也将关闭相关的Socket

public void close():关闭次套接字

  • 一旦一个socket被关闭,它不可再使用。
  • 关闭此socket也将关闭相关的InputStreamOutputStream

public void shutdownOutput():禁用此套接字额输出流

  • 任何先前写出的数据将被发送,随后终止输出流

ServerSocket类

ServerSocket类:这个类实现了服务器套接字,该对象等待通过网络的请求。

构造方法

public ServerSocket(int port)::使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

ServerSocket server=new ServerSocket(6666);

成员方法:public Socket accept()::侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

 简单的TCP网络程序

1. 【服务端】启动 , 创建 ServerSocket 对象,等待连接。
2. 【客户端】启动 , 创建 Socket 对象,请求连接。
3. 【服务端】接收连接 , 调用 accept 方法,并返回一个 Socket 对象。
4. 【客户端】 Socket 对象,获取 OutputStream ,向服务端写出数据。
5. 【服务端】 Scoket 对象,获取 InputStream ,读取客户端发送的数据。
6. 【服务端】 Socket 对象,获取 OutputStream ,向客户端回写数据。
7. 【客户端】 Scoket 对象,获取 InputStream ,解析回写数据。
8. 【客户端】释放资源,断开连接。

简单的TCP通信案例

客户端向服务器发送数据--客户端程序

public class ClientYCP{
    public static void main(String[] args) throws Exception{
        System.out.println("客户端发送数据");
        //1.创建Socket(ip,port),确定连接到哪里.
        Socketclient=newSocket("localhost",6666);
        //2.获取流对象.输出流
        OutputStreamos=client.getOutputStream();
        //3.写出数据.
        os.write("你好么?tcp,我来了".getBytes());
        //4.关闭资源.
        os.close();
        client.close();
    }
}
客户端向服务器发送数据 -- 服务器端程序
public class ServerTCP{
    public static void main(String[] args) throws IOException{
        System.out.println("服务端启动,等待连接....");
        //1.创建ServerSocket对象,绑定端口,开始等待连接          
        ServerSocket ss=new ServerSocket(6666);
        //2.接收连接accept方法,返回socket对象.
        Socket server=ss.accept();
        //3.通过socket获取输入流
        InputStream is = server.getInputStream();
        //4.一次性读取数据
        //4.1创建字节数组
        byte[]b=new byte[1024];
        //4.2据读取到字节数组中.
        int len=is.read(b);
        //4.3解析数组,打印字符串信息
        String msg=new String(b,0,len);
        System.out.println(msg);
        //5.关闭资源.
        is.close();
        server.close();
    }
}
服务器向客户端回写数据 -- 服务器端程序
public class ClientTCP{
    public static void main(String[] args) throws Exception{
        System.out.println("客户端发送数据");
        //1.创建Socket(ip,port),确定连接到哪里.
        Socket client=new Socket("localhost",6666);
        //2.通过Scoket,获取输出流对象
        OutputStream os=client.getOutputStream();
        //3.写出数据.
        os.write("你好么?tcp,我来了".getBytes());
        //==============解析回写=========================
        //4.通过Scoket,获取输入流对象
        InputStream in=client.getInputStream();
        //5.读取数据数据
        byte[] b=new byte[100];
        int len=in.read(b);
        System.out.println(newString(b,0,len));
        //6.关闭资源.
        in.close();
        os.close();
        client.close();
    }
}
服务器向客户端回写数据 -- 客户端程序
public class ServerTCP{
    public static void main(String[] args) throws IOException{
        System.out.println("服务端启动,等待连接....");
        //1.创建ServerSocket对象,绑定端口,开始等待连接
        ServerSocket ss=new ServerSocket(6666);
        //2.接收连接accept方法,返回socket对象.
        Socket server=ss.accept();
        //3.通过socket获取输入流
        InputStream is=server.getInputStream();
        //4.一次性读取数据
        //4.1创建字节数组
        byte[] b=new byte[1024];
        //4.2据读取到字节数组中.
        int len=is.read(b);
        //4.3解析数组,打印字符串信息
        String msg=new String(b,0,len);
        System.out.println(msg);
        //=================回写数据=======================
        //5.通过socket获取输出流
        OutputStream out=server.getOutputStream();
        //6.回写数据
        out.write("我很好,谢谢你".getBytes());
        //7.关闭资源.
        out.close();
        is.close();
        server.close();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40959890/article/details/107449829