网络编程

一,socket编程

 

1,udp通信

 

 udp客户端发送数据:

package udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.SocketException;

public class UdpSend {
    public static void main(String[] args) throws Exception {
        DatagramSocket client = new DatagramSocket();

        byte[] bytes = "this is a data".getBytes();

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, Inet4Address.getByName("10.74.131.7"), 10000);

        client.send(datagramPacket);

        client.close();

    }
}

 

udp服务端代码,一个支持udp协议的服务器

package udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;

public class UdpRece {
    public static void main(String[] args) throws Exception {
        DatagramSocket sever = new DatagramSocket(10000);


        byte[] bytes = new byte[1024];

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);

        sever.receive(datagramPacket);

        System.out.println(datagramPacket.getAddress().getCanonicalHostName() + ":" + datagramPacket.getPort() + new String(datagramPacket.getData(), 0, datagramPacket.getLength()));

        sever.close();

    }
}

 

2,tcp协议:并发上传

 

客户端代码

package tcp;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class SocketClient {
    public static void main(String[] args) throws IOException {

        SendFile sendFile = new SendFile();

        new Thread(sendFile).start();
        new Thread(sendFile).start();
        new Thread(sendFile).start();
        new Thread(sendFile).start();
        new Thread(sendFile).start();
        new Thread(sendFile).start();
        new Thread(sendFile).start();


    }

    private static class SendFile implements Runnable {

        @Override
        public void run() {
            try {
                Socket socket = new Socket("10.74.131.7", 11000);
                FileInputStream inputStream = new FileInputStream("/Users/lucy6/Desktop/trash.mp4");
                OutputStream outputStream = socket.getOutputStream();

                byte[] buf = new byte[1024];
                int len = -1;
                while ((len = inputStream.read(buf)) != -1) {
                    outputStream.write(buf, 0, len);
                }

                System.out.println("上传成功啊");
            }catch (IOException e) {

            }
        }
    }
}

 

服务端代码,一个支持tcp协议的服务器

package tcp;

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

public class SocketSever {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(11000);


        while (true) {
            Socket accept = serverSocket.accept();
            SaveFile saveFile = new SaveFile(accept);
            new Thread(saveFile).start();
        }



    }

    private static class SaveFile implements Runnable {
        private Socket accept;
        public SaveFile(Socket socket) {
            this.accept = socket;
        }

        @Override
        public void run() {
            try {
                int i = 0;
                InputStream inputStream = accept.getInputStream();

                File file = new File("test" + i++ + ".mp4");
                while (file.exists()) {
                    file = new File("test" + i++ + ".mp4");
                }

                FileOutputStream fileOutputStream = new FileOutputStream(file);

                byte[] buf = new byte[1024];
                int len = -1;
                while ((len = inputStream.read(buf)) != -1) {
                    fileOutputStream.write(buf, 0, len);
                }

                fileOutputStream.flush();
                fileOutputStream.close();

                inputStream.close();
                accept.close();
            }catch (IOException e) {

            }
        }
    }
}

 

 

3,http协议编程

 

 

 

 

二,总结

 

1,服务器原理

 

浏览器就是一个客户端,底层就是实现了socket编程。

 

服务器底层也是实现socket编程,只不过进行高度的封装。

 

服务器可以并发接收多个请求,即是这个原理:

 

 while (true) {
            Socket accept = serverSocket.accept();
            SaveFile saveFile = new SaveFile(accept);
            new Thread(saveFile).start();
        }

 

每接收到一个客户端的请求,开启一个线程,处理来自多个客户端的请求。

 

2,什么是连接

 

连接的本质是确认双方状态,不存在物流的连接,甚至不同数据包走的路由都不同。

 

tcp连接是不会断的,除非设置超时时间,或者客户端关闭连接、服务端关闭连接。

 

所谓的阻塞,就是服务器因为考虑到资源的限制,设置了最大的并发数,超出并发数,不予建立连接。 或者不响应,请求被搁置,直到有空闲资源即空闲线程。

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值