Java Socket TCP

TCP简介

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 [1]

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( [1] MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 [1] 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和

下面为大家介绍Java Socket TCP协议数据传输的用法

涉及到的java类

  • ServerSocket (服务器)
  • Sokcet (客户端)
  • InetSocketAddress (IP、端口信息)

ServerSocket(socket服务端)

1.创建ServerSocket
ServerSocket serverSocket = new ServerSocket(2000);

这样就创建了一个ServerSocket 监听给2000端口发送的数据

2.监听客户端连接

通过调用serverSocket的accept方法接受客户端的请求

Socket socket = serverSocket.accept();

accpet方法是一个阻塞方法 只有接到客户端的连接后,才会向下继续执行

返回的对象就是客户端socket对象(包含客户端ip,端口port,终端名称等)

####3.获取客户端发送的数据

InputStream is=socket.getInputStream();
byte[] buffer=new byte[1024];
//rLen代表读取到字节数量
int rLen=is.read(buffer);

socket.getInputStream()方法拿到客户端的输入流 用来读取客户端发送的数据

创建一个1024个字节的缓冲区用于读取客户端发送字节数据,这里一般需要循环读取直到rLen的值为0 说明数据读取完毕(ps 可以创建一个字节集合存放读取的的数据)

4.发送数据给客户端
OutputStream os=socket.getOutputStream();
String responseContent="respones 数据";
//将字符数据转换成字节数组
byte[] buffer=responseContent.getBytes();
//发送到客户端
os.write(buffer);

socket.getOutputStream()获取客户端的输出流,用来发送数据给客户端

下面是完整代码实现

public static void main(String[] args) throws IOException {
    //创建一个server socket
    ServerSocket serverSocket = new ServerSocket(2000);
    System.out.println("服务器准备就绪..");
    System.out.println("服务器信息:IP " + serverSocket.getInetAddress() + " P " + serverSocket.getLocalPort());
    //开启监听客户端请求
    for (; ; ) {
        Socket socket = serverSocket.accept();
        ClientHandler clientHandler = new ClientHandler(socket);
        clientHandler.start();
    }
}

public static class ClientHandler extends Thread {
    private final Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();
        System.out.println("新客户端连接:IP " + socket.getInetAddress() + " P " + socket.getPort());
        try {
            PrintStream printStream = new PrintStream(socket.getOutputStream());
            InputStream inputStream = socket.getInputStream();
            BufferedReader socketInput = new BufferedReader(new InputStreamReader(inputStream));
            while (true) {
                String receiveMsg = socketInput.readLine();
                if ("bye".equals(receiveMsg)) {
                    printStream.println("bye");
                    break;
                } else {
                    System.out.println(receiveMsg);
                    printStream.println("server 说:" + receiveMsg.length());
                }
            }
            socketInput.close();
            printStream.close();

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("连接异常断开");
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("客户端断开连接:IP " + socket.getInetAddress() + " P " + socket.getPort());
    }
}

Socket客户端

1.创建并连接SocketServer
//创建一个socket客户端对象
Socket socket = new Socket();
//连接服务器 ip 端口port 2000 超时时间3000毫米
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000);
2.获取输出流用于发送数据
OutputStream outputStream = socket.getOutputStream();
String requestContent="request 数据";
//将字符数据转换成字节数组
byte[] buffer=requestContent.getBytes();
//发送到服务器
os.write(buffer);
3.获取输入流用于读取server发送的数据
InputStream is=socket.getInputStream();
byte[] buffer=new byte[1024];
//rLen代表读取到字节数量
int rLen=is.read(buffer);

拿到server的数据进行处理

下面是客户端的完整代码实现

public static void main(String[] args) throws IOException {
    Socket socket = new Socket();
    socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000);
    System.out.println("发起服务器连接...");
    System.out.println("客户端信息:IP " + socket.getLocalAddress() + " P " + socket.getLocalPort());
    System.out.println("服务器信息:IP " + socket.getInetAddress() + " P " + socket.getPort());
    try {
        send(socket);
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("异常关闭");
    } finally {
        socket.close();
        System.out.println("客户端已退出");
    }
}

public static void send(Socket socket) throws IOException {
    InputStream in = System.in;
    //键盘输入流
    BufferedReader input = new BufferedReader(new InputStreamReader(in));
    InputStream socketInputStream = socket.getInputStream();
    BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(socketInputStream));
    OutputStream outputStream = socket.getOutputStream();
    PrintStream printStream = new PrintStream(outputStream);
    while (true) {
        String request = input.readLine();
        printStream.println(request);
        String response = socketBufferedReader.readLine();
        if ("bye".equals(response)) {
            break;
        } else {
            System.out.println(response);
        }
    }
    input.close();
    socketBufferedReader.close();
    printStream.close();
}

这就是tcp Java socket api的基本使用

下篇准备给大家讲下UDP相关知识以及用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值