java网络编程

Java网络编程

  • 网络编程也称套接字编程

  • 网络通信=套接字通信,即socket

  • socket 套接字,插座

  • ip 指地址 每台计算机地址要不同

  • 端口 指进程端口号 每个计算机的进程的端口号要不同

  • TCP 类似两者打电话,要先建立连接,建立连接要3次握手4次挥手,一般是客户端和服务端

  • UDP 类似发短信,不用连接,直接发,另一边可以自己去收,可能会出现丢包,一般是客户端之间

  • tcp麻烦但不宜丢包 udp简单但容易丢包

  • 回车和换行的区别
  • 回车enter 硬回车,段落直接换行,表示段落结束
  • 换行CTRL+enter或者shift+enter软回车,只是光标下移,表示段落未结束
  • TCP

  • 客户端

    1. socket 通过端口和ip建立连接
    2. os.write 发消息
  • 服务端

    1. serversocket 建立进程端口
    2. accept 监听等待用户连接,返回客户端socket
    3. 接受用户消息
      1. byte[1024] is.read(bytes)缓存区,存读取数据到bytes中
      2. byteArrayOutPutStream,baos.write(bytes,0,length),写数据到bos中,防止中文太长越界
      3. bos.toString(),读取客户端数据,输出
  • io流

  • 客户端 socket.getoutputstream os.write 往外写东西

  • 服务端 serversocket.getinputstream is.read(new byte[1024])读is到数组bytes中

  • 接收文件就用文件管道流,接收字符串就用字符串管道流

  • 接收格式对应输出内容的格式

    //接收文件,文件管道流接收
    FileOutputStream fos = new FileOutputStream(new File("receive2.jpg"));
    
    byte[] buffer = new byte[1024];
    int len;
    while ((len=is.read(buffer))!=-1){
        //写入fos
        fos.write(buffer,0,len);
    }
    
    //接收字符串,字符串管道流接收(字节数组)
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
    byte[] buffer2 = new byte[1024];
    int len2;
    while ((len2=is.read(buffer2))!=-1){
        //写入baos
        baos.write(buffer2,0,len2);
    }
    //转换成字符串并输出
    System.out.println(baos.toString());
    
  • 文件传输过程

    将file变为fis->fis.read(clbuffer)fis读出文件->文件数据存入clbuffer->os.write(clbuffer,0,len)->将clbuffer写入os
    
    is.read(sebuffer) is读出os写入的数据->数据存入sebuffer->fos.write(sebuffer,0,len)->将sebuffer写入fos->fos变为file
    

    is os对应,拥有相同数据

  • UDP

  • 分为发送端和接收端,没有客户服务器的区分,两者可以同时是发送和接收

  • 发送端

    1. 建立socket

      DatagramSocket socket = new DatagramSocket();
      
    2. 建立包
      port为目标端口

      DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
      
      
    3. 发送包

      socket.send(datagramPacket);
      
  • 接收方

    1. 建立对应socket,要定义接收方端口,和发送方对应

    2. 创建数组建立包

      DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
      
    3. 接收包

      socke.receive(packet);
      System.out.println(new String(packet.getData(),0,packet.getLength()));
      
  • 控制台输入

    //接收控制台输入
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    String msg = bufferedReader.readLine();
    
  • UDP多线程在线咨询

  • 多线程要实现Runnable接口

    public class TalkSend implements Runnable{
        DatagramSocket socket = null;
        BufferedReader bufferedReader = null;
    
        private int fromPort;
        private int toPort;
        private String toIp;
    
        public TalkSend(int fromPort, int toPort, String toIp) {
            //发送方端口;目的端口;目的人地址
            this.fromPort = fromPort;
            this.toPort = toPort;
            this.toIp = toIp;
            try {
                //需要接收的端口
                socket = new DatagramSocket(fromPort);
                bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    public class TalkReceive implements Runnable{
    
        // 接收端口(=toPort);发送人名称
        DatagramSocket socket = null;
        private int port;
        private String msgFromName;
    
        public TalkReceive(int port,String msgFromName) {
            this.port = port;
            this.msgFromName = msgFromName;
            try {
                socket = new DatagramSocket(port);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
  • 重写run方法,实现发送消息

    @Override
    public void run() {
        while (true){
            try {
                String msg = bufferedReader.readLine();
                byte[] bytes = msg.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, new InetSocketAddress(toIp,toPort));
                socket.send(packet);
                if (msg.equals("end")) break;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
    @Override
        public void run() {
            while (true){
                try {
                    byte[] bytes = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
                    socket.receive(packet);
                    byte[] data = packet.getData();
                    String s = new String(data, 0, packet.getLength());
                    System.out.println(msgFromName+":"+s);
                    if (s.equals("end")) break;
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            socket.close();
        }
    
  • 创建线程,调用start()方法,start调用run方法

    public static void main(String[] args) {
        new Thread(new TalkSend(5555,9999,"localhost")).start();
        new Thread(new TalkReceive(8888,"学生")).start();
    }
    
    public static void main(String[] args) {
        new Thread(new TalkSend(7777,8888,"localhost")).start();
        new Thread(new TalkReceive(9999,"老师")).start();
    }
    
  • URL

  • http://www.baidu.com

  • 统一资源定位符,定位互联网某一个资源

  • 域名www.baidu.com,ip 127.0.0.1

  • 域名解析是把域名解析为ip,域名为了好记

  • 五部分组成,可以少不能多

    协议://ip地址:端口/项目/资源

    public class URLDemo01 {
        public static void main(String[] args) throws MalformedURLException {
            URL url = new URL("https://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");
            System.out.println(url.getProtocol());//协议
            System.out.println(url.getHost());//ip
            System.out.println(url.getPort());//端口
            System.out.println(url.getPath());//文件(项目)
            System.out.println(url.getFile());//文件全路径
            System.out.println(url.getQuery());//参数
        }
    }
    
  •     /*子类引用指向父类对象,不对
        父类引用指向子类对象,对
        我的理解是,右边代表实际大小,先创建,左边为引用
        子类继承父类,所以子类占用空间更大
        父类创建大小不够,就不行*/
        Student student1 = new People();
    
  • public class URLDown {
        public static void main(String[] args) throws Exception {
            URL url = new URL("https://m10.music.126.net/20241104151656/39a2f4723d44fb7ba51813c995098ea8/yyaac/obj/wonDkMOGw6XDiTHCmMOi/2849745486/65c1/cb3b/e14e/67d13b0595b4313864e163c1db69cf7d.m4a?vuutv=vFr1k2kmyFwuOdGKS9tf9hhF0kjDp9zfMnuD6Ow7wMdsGgxGuI59WNe7IVST5jgIp1mxAIcrn6dTXb9fd/Txz5u1nhDGtKdpXKJEA5hhV0E=");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream is = httpURLConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("hell.m4a");
            byte[] buffer = new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            fos.close();
            is.close();
            httpURLConnection.disconnect();
        }
    }
    
posted @ 2025-04-22 22:07  学习java的白菜  阅读(15)  评论(0)    收藏  举报