java网络编程之TCP通信程序【二】

1.概述

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

两端通信时步骤:

  • 服务端程序,需要事先启动,等待客户端的连接。
  • 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

在Java中,提供了两个类用于实现TCP通信程序:

  • 客户端:java.net.Socket 类。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
  • 服务端:java.net.ServerSocket 类。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

2.通信步骤

在这里插入图片描述

3.通信客户端

java.net.Socket 类:该类实现客户端套接字。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

构造方法:

public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。 

常用方法:

public InputStream getInputStream():返回此套接字的输入流。 
public OutputStream getOutputStream():返回此套接字的输出流。
public void close():关闭此套接字(会同时关闭相关的InputStream和OutputStream)。 

通信步骤:

  1. 创建客户端对象Socket,绑定服务器的IP地址端口号
  2. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象。
  3. 通过网络字节输出流OutputStream对象中的write()向服务发送数据。
  4. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream 对象。
  5. 使用网络字节输入流InputStream 对象中的read(),读取服务器回写的数据。
  6. 释放资源

4.通信服务器

java.net.ServerSocket 类:该类实现服务器套接字

服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

构造方法:

public ServerSocket(int port) :创建绑定到特定端口的服务器套接字。 

常用方法:

 Socket accept() :侦听并接受到此套接字的连接。 

通信步骤:

  1. 创建服务器对象ServerSocket,绑定端口号。
  2. 使用ServerSocket对象中的方法accept(),获取请求的客户端对象Socket。
  3. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream 对象。
  4. 使用网络字节输入流InputStream 对象中的read(),读取客户端发送的数据。
  5. 使用Socket对象中的方法getOutputStream获取网络字节输出流OutputStream对象。
  6. 通过网络字节输出流OutputStream对象中的write()向客户端发送数据。
  7. 关闭资源(Socket 和 ServerSocket)。

5 简单演示

客户端示例代码:

package com.hanyxx.socket;

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

/**
 * @author layman
 */
public class ClientDemo01 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        OutputStream os = socket.getOutputStream();
        // 发送数据
        os.write("你好服务器!".getBytes());

        // 接受数据
        InputStream  is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println("客户端接受到的数据: "+new String(bytes,0,len));

        // 关闭资源
        socket.close();
        System.out.println("客户端关闭!");
    }
}

服务端示例代码:

package com.hanyxx.socket;

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

/**
 * @author layman
 */
public class ServerDemo02 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();

        // 读取数据
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println("服务器端接受到的数据: "+ new String(bytes,0,len));

        // 回传数据
        OutputStream os = socket.getOutputStream();
        os.write("你好客户端".getBytes());

        // 关闭资源
        socket.close();
        serverSocket.close();
        System.out.println("服务器端关闭!");
    }
}
posted @ 2021-03-16 18:48  layman~  阅读(41)  评论(0)    收藏  举报