Socket笔记

Socket(了解)

1. 计算机网络

连接分散计算机设备以实现信息传递的系统
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
用户购买笔记本:
  1. 操作系统  windows
  2. 应用软件 
  3. 网络通信协议: IP 互联网协议

  实现数据共享(数据包 IO)

2. 组成部分

2.1 协议

规则。

河南
 开封话
 南阳话
   河南话
   
河南省  广东省
河南话   粤语
  普通话
  
中国人 普通话
美国人 英语
  英语 
tcp/ip: 传输控制协议/ 互联网协议 (与互联网相关 tcp/ip是基础)
    http: 超文本传输协议
    https:(数字安全证书)
    ftp: 文件传输 
    sftp
    pop3:邮箱协议
    
udp: 用户数据报协议

1.安全性
  tcp/ip: 安全级别比较高   (http)四次握手/三次握手 (请求头和响应头)   等同于打电话
  udp: 安全级别比较低  packet 等同于生活中发短信    直播
 
2.数据传递方式
  tcp/ip:  io 读写流程
  udp: 数据包
  
3.传输内容大小
    tcp/ip: 内容大小无限的
    udp: 64kb

4. 效率
    tcp/ip: 低
    udp: 高

5. 常见软件
     tcp/ip: mysql 淘宝  京东
     udp: QQ/微信  飞秋      
     qq:
       李四离线了  张三也可以给李四发过去
       李四再次登录  可以看到张三给李四发的数据   (离线信息 存储到服务器) 

2.2 Ip

标识计算机。 每台计算机都有唯一的ip地址、

ipv4: 32位内容 地址  已经使用完毕  255.255.255.255     A B C D 
       192.168.*.*
    
ipv6:128位 
      本地链接 IPv6 地址. . . . . . . . : fe80::c8f0:df56:5112:2339%6
      
ipconfig: 查看本机ip

2.3 端口

客户端  服务端
2个应用程序:
  0-65535   0-1023 系统所保留使用的
  tomcat: 8080 
  mysql: 3306
  localhost:80

3. Socket

不同应用程序(可以在不同的计算机上面的)之间的数据交互。ip 端口

java.net.* URL

3.1 获得本机ip InetAddress

InetAddress getLocalHost()  获得本机ip
InetAddress getByName(String host)  
String getHostName()  
String getHostAddress()  
byte[] getAddress()  
private static void demo1() {

        try {
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println(localHost);//JAVA-20200716AK/192.168.14.37
            System.out.println(localHost.getHostAddress());
            System.out.println(localHost.getHostName());
            System.out.println(Arrays.toString(localHost.getAddress()));

            //随意获得指定计算机的ip地址
            InetAddress inetAddress = InetAddress.getByName("JAVA-20200825JO");
            System.out.println(inetAddress);//ipconfig
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

3.2 URL

代表的就是万维网资源的指针。

URL(String spec) 
    

3.3 TCP/IP Socket编程

套接字
两个进程(应用程序)间可以通过一个双向的网络通信连接实现数据交换,这种通信链路的端点被称为“套接字”(Socket)
JAVA: 服务器端的王者  服务器端的开发  后端开发  web端开发
web前端:
   大前端:
      app  ios  pc(浏览器) 
   web项目:
     传统的web项目:  jsp+servlet+mysql 
     半分离得状态的web项目:  html+css+js+后端 
     完全分离: 前后端     接口文档--->接口

B/S: browser/server  基于浏览器应用  https
C/S: client/server  pc桌面端的工具
我们在百度平台上搜索资源?(请求--->响应)

1. 创建服务端程序(在特定的计算机上 监听某个端口)  ServerSocket

2.等待客户端连接

public static void main(String[] args) {

        try {
            //1.创建服务端程序  在本机创建服务端程序 并监听某个端口
            ServerSocket serverSocket = new ServerSocket(6666);
            System.out.println("-----------------服务端开启-------------------");
            while (true) {
                //2.等待客户端的链接
                Socket successClient = serverSocket.accept();//阻塞
                System.out.println(successClient.getInetAddress() + "链接服务器成功。。。。");

                //3.服务端给客户端进行发送数据 write  输出流
                DataOutputStream dataOutputStream = new DataOutputStream(successClient.getOutputStream());
                dataOutputStream.writeUTF("你好,客户端");

                DataInput dataInput = new DataInputStream(successClient.getInputStream());
                System.out.println(dataInput.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
1.客户端主动发起连接  连接特定主机的服务端程序  Socket

Socket(InetAddress address, int port) 
Socket(String host, int port) 
    
 public static void main(String[] args) {

        //localhost/127.0.0.0/192.168.14.37
        try {
            //1.客户端主动发起连接  连接特定主机的服务端程序
            Socket socket = new Socket("192.168.14.37", 6666);
            System.out.println("socket:" + socket);//服务端

            //2.客户端读取服务端写的数据   read 输入流
            DataInput dataInput = new DataInputStream(socket.getInputStream());
            System.out.println(dataInput.readUTF());

            //3.客户端将内容写给服务端
            DataOutput dataOutput = new DataOutputStream(socket.getOutputStream());
            dataOutput.writeUTF("你好,服务端");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
1. 动态交互

只能现定于某一端先写或者先读 另外一端先读或者先写 其实对于2端而言 不管是哪一端先写 另外一端都能够读取到他发送的数据。也就是一个进程里面坐多件事情 使用线程来实现。

 public static void main(String[] args) {

        final String serverName = "server:";
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            Scanner input = new Scanner(System.in);
            System.out.println("--------------服务端开启----------------");
            while (true) {
                Socket accept = serverSocket.accept();
                //服务端读写数据
                while (true) {
                    DataInput dataInput = new DataInputStream(accept.getInputStream());
                    System.out.println(dataInput.readUTF());

                    DataOutput dataOutput = new DataOutputStream(accept.getOutputStream());
                    System.out.print(serverName);
                    String line = input.nextLine();
                    dataOutput.writeUTF(serverName + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
public static void main(String[] args) {

        final String clientName = "client:";
        Scanner scanner = new Scanner(System.in);
        try {
            Socket socket = new Socket("localhost", 7777);
            while (true) {
                //客户端循环读写数据
                DataOutput dataOutput = new DataOutputStream(socket.getOutputStream());
                System.out.print(clientName);
                String line = scanner.nextLine();
                dataOutput.writeUTF(clientName+line);

                DataInput dataInput = new DataInputStream(socket.getInputStream());
                System.out.println(dataInput.readUTF());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2. 线程实现
客户端:
public class Client {

    public static void main(String[] args) {

        final String clientName = "client:";
        try {
            Socket socket = new Socket("localhost", 7777);
            //客户端循环读写数据
            new ReadMsgThread(socket).start();
            new WriteMsgThread(clientName, socket).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
服务端:
public class Server {

    public static void main(String[] args) {

        final String serverName = "server:";
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            System.out.println("--------------服务端开启----------------");
            while (true) {
                Socket accept = serverSocket.accept();
                //服务端读写数据
                new ReadMsgThread(accept).start();
                new WriteMsgThread(serverName, accept).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
public class ReadMsgThread extends Thread {

    private Socket socket;//null

    @Override
    public void run() {
        while (true) {
            try {
                DataInput dataInput = new DataInputStream(socket.getInputStream());
                System.out.println(dataInput.readUTF());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public ReadMsgThread(Socket socket) {
        this.socket = socket;
    }
}

public class ReadMsgThread extends Thread {

    private Socket socket;//null

    @Override
    public void run() {
        while (true) {
            try {
                DataInput dataInput = new DataInputStream(socket.getInputStream());
                System.out.println(dataInput.readUTF());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public ReadMsgThread(Socket socket) {
        this.socket = socket;
    }
}

3.4 UDP Socket编程

  • DatagramSocket 此类表示用于发送和接收数据包的套接字。
  • DatagramPacket 该类表示数据报包 数据都是packet
udp 服务端:DatagramSocket 
    DatagramSocket(int port)
udp 客户端:DatagramSocket 
    DatagramSocket(int port, InetAddress laddr) 
    
    DatagramPacket(byte[] buf, int length)  
    DatagramPacket(byte[] buf, int offset, int length) 
    用于接收长度的数据包 length 。
    
    
    DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
    构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值