网络--03使用协议进行通信

tcp连接建立以后,就可以基于这个连接通道来发送和接受消息了,TCP、UDP都是在基于Socket概念上为某类应用场景而扩展出的传输协议,那么什么是socket呢?socket是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,把数据读写到磁盘上一样。
使用socket可以把应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。不同类型的Socket与不同类型的底层协议簇有关联。主要的socket类型为流套接字(stream socket)和数据报文套接字(datagram socket)
stream socket把TCP作为端对端协议(底层使用IP协议),提供一个可信赖的字节流服务。
数据报文套接字(datagram socket)使用UDP协议(底层同样使用IP协议)提供了一种“尽力而为”的数据报文服务。

在这里插入图片描述

基于TCP协议实现通信

简单的从客户端发送一个消息到服务端的功能

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TT {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=null;
        BufferedReader in=null;
        /**
         * TCP 的服务端要先监听一个端口,一般是先调用bind 函数,给这个Socket 赋予一个IP 地址和端口。为什么需要端口呢?要知道,你写的是一个应用程序,
         * 当一个网络包来的时候,内核要通过TCP 头里面的这个端口,来找到你这个应用程序,把包给你。
         * 为什么要IP 地址呢?有时候,一台机器会有多个网卡,也就会有多个IP 地址,你可以选择监听所有的网卡,也可以选择监听一个网卡,
         * 这样,只有发给这个网卡的包,才会给你。
         */
        try{
            serverSocket=new ServerSocket(8080);
            //阻塞等待客户端连接接下来,服务端调用accept 函数,拿出一个已经完成的连接进行处理。如果还没有完成,就要等着。
            Socket socket=serverSocket.accept();
            //连接建立成功之后,双方开始通过read 和write 函数来读写数据,就像往一个文件流里面写东西一样。
            in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(in.readLine());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(in!=null){
                try{
                    in.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                serverSocket.close();
            }
        }
    }
}
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class TT2 {
    public static void main(String[] args) {
        Socket socket = null;
        PrintWriter out = null;
        try{
            socket = new Socket("127.0.0.1",8080);
            out = new PrintWriter(socket.getOutputStream(),true);
            out.println("hello,word");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(out!=null){
                out.close();
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

基于TCP实现双向通信对话功能

TCP是一个全双工协议,数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。我们来做一个简
单的实现

Server端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TT3 {
    public static void main(String[] args) {
        try{
            //-->>创建一个8080的端口在客户端的请求
            ServerSocket serverSocket = null;
            serverSocket = new ServerSocket(8080);
            //使用accept()阻塞等待客户的请求,有客户端的请求,则产生一个Socoket对象,并继续执行
            Socket socket = serverSocket.accept();
            String line = "";
            //由Socket对象得到输入流,并构造相应的BUfferReader对象
            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //socker对象得到输出流,并构造PrintWriter对象
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            //由系统标准输入设备构造BufferReader对象
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println(is.readLine());
            line = sin.readLine();
            while (!line.equals("byebye")){
                os.println(line);
                os.flush();
                System.out.println("server:"+line);
                System.out.println("client:"+is.readLine());
                line = sin.readLine();
            }
            os.close();
            is.close();
            socket.close();
            serverSocket.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

Client端

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TT4 {
    public static void main(String[] args) {
        try{
            Socket socket = new Socket("127.0.0.1",8080);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String line="";
            line = sin.readLine();
            while(!line.equals("ByeBye")){
                os.println(line);
                os.flush();
                System.out.println("client:"+line);
                System.out.println("sever:"+is.readLine());
                line = sin.readLine();
            }
            os.close();
            is.close();
            socket.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值