【Socket网络编程进阶与实战】------ Socket网络编程快速入门

前言

本篇博客主要是分享,socket网络编程进阶与实践☞socket网络编程快速入门


一、聊一聊Socket

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

学习目标与收获

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

网络编程

在这里插入图片描述
在这里插入图片描述

  • 归纳为:
    在这里插入图片描述
  • 对应关系
    在这里插入图片描述

二、Socket与TCP、UDP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP

在这里插入图片描述
在这里插入图片描述

UDP

在这里插入图片描述
在这里插入图片描述

Client-Server Application

在这里插入图片描述

三、Socket TCP牛刀小试-客户端实现

  • 构建TCP客户端,服务端
  • 客户端发送数据
  • 服务器读取数据并打印

client

package com.zcw.demo;


import java.io.*;
import java.net.*;

/**
 * @ClassName : Client
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-07-07 10:09
 */
public class Client {
    public static void main(String[] args) throws IOException {
      //初始化socket
        Socket socket = new Socket();
        //设置超时时间
        socket.setSoTimeout(3000);
        //设置连接的超时时间与连接的端口号
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);
        System.out.println("已发起服务器连接,并进入后续流程");
        System.out.println("客户端信息:"+socket.getLocalAddress()+"P:"+socket.getLocalPort());
        System.out.println("服务器信息:"+socket.getInetAddress()+"P:"+socket.getPort());

        try{
            //发送接收数据
            todo(socket);
        }catch(Exception e){
            System.out.println("异常关闭");
        }
        //释放资源
        socket.close();
        System.out.println("客户端已退出");

    }
    //发送数据
    private static void todo(Socket client) throws IOException{
            //构建键盘输入流
            InputStream in = System.in;
            BufferedReader input = new BufferedReader(new InputStreamReader(in));

            //客户端输出流(得到Socket输出流,并转换为打印流)
          OutputStream outputStream = client.getOutputStream();
          PrintStream  socketPrintStream = new PrintStream(outputStream);

          //得到Socket输入流,并转换为BufferedReader
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        boolean flag = true;
        do{
            //从键盘读取一行
            String str= input.readLine();
            //然后把读取的这一行,发送出去,到服务器
            socketPrintStream.println(str);

            //从服务器读取一行
            String echo = socketBufferedReader.readLine();
            if("bye".equalsIgnoreCase(echo)){
                flag = false;
            }else{
                System.out.println(echo);
            }
        }while (flag);

        //资源释放
        socketPrintStream.close();
        socketBufferedReader.close();
    }

}


server

package com.zcw.demo;

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

/**
 * @ClassName : Server
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-07-07 10:08
 */
public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        System.out.println("服务器准备就绪");
        System.out.println("服务器信息:"+server.getInetAddress()+"p:"+server.getLocalPort());

        //等待客户端连接
        for(;;){
            //得到客户端
            Socket client = server.accept();
            //客户端构建异步线程
            ClientHandler clientHandler = new ClientHandler(client);
            //启动线程
            clientHandler.start();
        }

    }
    //多个客户端时,需要进行异步操作处理
    private static class ClientHandler extends Thread{
        private Socket socket;
        private boolean flag =true;

        ClientHandler(Socket socket){
            this.socket = socket;
        }
      @Override
        public void run(){
            super.run();
          System.out.println("新客户端连接:"+socket.getInetAddress()+"p:"+socket.getPort());
          try{
              //得到打印流,用户数据输出,服务器会送数据使用
              PrintStream socketOutput = new PrintStream(socket.getOutputStream());
              //得到输入流,用于接收数据
              BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              do{
                  //客户端,拿到一条数据
                  String str = socketInput.readLine();
                  if("bye".equalsIgnoreCase(str)){
                      flag = false;
                      //回送
                      socketOutput.println("bye");
                  }else{
                      //打印到屏幕,并回送数据长度
                      System.out.println(str);
                      socketOutput.println("回送:"+str.length());
                  }
              }while(flag);
              socketInput.close();
              socketOutput.close();
          }catch(Exception e){
              System.out.println("连接异常断开");
          }finally {
              try {
                  socket.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          System.out.println("客户端已关闭:"+socket.getInetAddress()+"P:"+socket.getPort());
      }
    }
}


  • 测试
    在这里插入图片描述
    在这里插入图片描述
  • 输入数据
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、报文、协议、Mac地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、IP、端口及远程服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章