Socket编程

网络基础知识

两台计算机进行通讯的三个条件:
- IP地址,协议, 端口号

TCP/IP五层模型

应用层:HTTP,FTP,SMTP,Telnet等
传输层:TCP/IP
网络层
数据链路层:端口
物理层:网线,双绞线,网卡

端口

应用程序与外界进行交流的出口,但是每个功能必须独占一个,不能重复;
端口号范围是0-65535,其中0-1023为系统保留。
Socket实际上就是IP地址+端口号,Socket是网络上运行的程序之间双向通信链路的终结点。

套接字

通过具有唯一标识IP地址和端口构成唯一的套接字,套接字之间通过IO进行数据传输。

JAVA中的网络支持:

  • InetAddress:用于标识和获取通信端硬件资源,IP地址。
//通过静态方法获取本机InetAddress实例
InetAddress address =InetAddress.getLocalHost();
3 address.getHostName();//获取计算机名
4 address.getHostAddress();//获取IP地址
5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分
6 
7 //获取其他主机的InetAddress实例
8 InetAddress address2 =InetAddress.getByName("其他主机名");
9 InetAddress address3 =InetAddress.getByName("IP地址");
  • URL(Uniform Resource Locator) 统一资源定位符,

    1. 表示某网上的地址。用来定位网上资源。
      格式 协议:地址

    2. 使用URL获取资源的网页内容

 //使用URL读取网页内容
 2 //创建一个URL实例
 3 URL url =new URL("http://www.baidu.com");
 4 InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流
 5 InputStreamReader isr =newInputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码
 6 BufferedReader br =newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率
 7 String data = br.readLine();//读取数据
 8 while(data!=null){
 9 System.out.println(data);//输出数据
10 data = br.readerLine();
11 }
12 br.close();
13 isr.colose();
14 is.close();

TCP编程

  • TCP协议是面向连接的,可靠的,有序的以子节流的方式发送数据,通过三次握手建立安全的连接,形成数据传输通道,在连接中进行大量数据的传输,效率会稍低。

  • Java中基于TCP协议实现网络通信的类
    服务端:ServerSocket。确定在本机的那个端口通信。
    客户端:Socket。确定连接到那个服务端,需要IP与端口号。

  • Socket 通信的步骤
    1,创建套接字服务端和客户端。
    2,服务端开启监听,获取套接字。
    3,获取套接字中的输入输出流。
    4,按照协议,对套接字进行读写操作。
    5,关流,关套接字。

    • 服务端:
ServerSocket ss = null;
String line = null;
try {
    //建立服务端
    ss = new ServerSocket(8111);
    on:while (true){
        //监听,等待客户端连接
        Socket socket = ss.accept();
        InputStream inputStream = socket.getInputStream();
        //读取客户端返回给服务端套接字中流的数据。
        InputStreamReader inputStreamReader= new InputStreamReader(inputStream);
        //封装成缓冲字符流,读取更方便
        BufferedReader br = new BufferedReader(inputStreamReader);
        while ((line = br.readLine())!=null) {
            System.out.println("client say:" +line);
            if (line.equals("88")) {
                break on;
            }
        }
    }
} 
  • 客户端
Socket socket = null;
try {
    //指定服务端
    socket = new Socket("127.0.0.1",8111);
    //获取输出流,向服务端套接字输出需要发送的信息。
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write("88".getBytes());
    outputStream.close();
    socket.close();
} 

服务端使用多线程处理客户端请求

  1. 线程
private Socket socket=null;
    private ServerSocket ss=null;

    public ServerThread(Socket socket, ServerSocket ss){
        this.socket = socket;
        this.ss = ss;
    }
    public void shutdownServerSocket(ServerSocket ss){
        try {
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        InputStream inputStream = null;
        try {
            inputStream = this.socket.getInputStream();
            //读取客户端返回给服务端套接字中流的数据。
            InputStreamReader inputStreamReader= new InputStreamReader(inputStream);
            //封装成缓冲字符流,读取更方便
            BufferedReader br = new BufferedReader(inputStreamReader);
            String line;
            while ((line = br.readLine())!=null) {
                System.out.println("client say:" +line);
                System.out.println(Thread.currentThread().getId() + "---" + Thread.currentThread().getName());
                if (line.equals("88")) {
                    this.shutdownServerSocket(ss);
                }
            }
        }
  1. 服务端
ServerSocket ss = null;
        String line = null;
        try {
            //建立服务端
            ss = new ServerSocket(8111);
            while (true){
                //监听,等待客户端连接
                Socket socket = ss.accept();
                ServerThread serverThread = new ServerThread(socket, ss);
                serverThread.start();

            }
        } 

客户端还是一样

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值