网络编程(2)

目录

网络编程(多线程)

利用多线程实现多个客户端访问一个服务器。

在这里插入图片描述

示例:

SocketThread:

public class SocketThread implements Runnable {
    private Socket socket;

    public SocketThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        boolean flag = true;
        try {
            //将数据进行存储,返回给客户端
            PrintStream printStream = new PrintStream(this.socket.getOutputStream());
            //获取客户端发送的数据
            Scanner scanner = new Scanner(socket.getInputStream());
            scanner.useDelimiter("\n");
            while (flag) {
                //判断是否存在数据
                if (scanner.hasNext()) {
                    String value = scanner.next().trim();
                    printStream.println("【服务器获取数据。。。】" + value);
                    if ("bye".equalsIgnoreCase(value)) {
                       flag = false;
                    }
                }
            }
            scanner.close();
            printStream.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ServerSocket:

public class ServerTest {
    public static void main(String[] args) throws IOException {
        boolean  flag = true; //控制循环
        ServerSocket server = new ServerSocket(6666);
        //获取客户端连接实例
        System.out.println("服务器已部署,等待客户端连接。。。");
        while (flag) {
            Socket socket = server.accept();
            new Thread(new SocketThread(socket)).start();
        }
        server.close();
    }
}

Socket:

public class SocketTest {
    public static void main(String[] args) throws IOException {
          final StringUtil stringUtil = new StringUtil();
        Socket socket = new Socket("localhost", 6666);
        //将数据进行存储,返回给客户端
        PrintStream printStream = new PrintStream(socket.getOutputStream());
        //获取客户端发送的数据
        Scanner scanner = new Scanner(socket.getInputStream());
        scanner.useDelimiter("\n");
        while (true) {
            String value = stringUtil.getString("请输入数据:");
            //先进行一次发送,否则数据不能进行传输
            printStream.println(value);
            if (scanner.hasNext()) {
                System.err.println(scanner.next().trim());
            }
            if("bye".equalsIgnoreCase(value)){
                break;
            }
        }
    }
}
public class StringUtil {
    public String getString(String str) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        if (str != null && !"".equals(str)) {
            System.out.println(str);
            str = bufferedReader.readLine();
        }
        if (str == null || "".equals(str)) {
            System.out.println("不可以输入空数据!");
            System.out.println("请重新输入:");
            str = bufferedReader.readLine();
        }
        return str;
    }
}

UDP

占用资源比TCP少,但稳定性比TCP差,使用广播的形式,客户端没开启就获取不到数据。
DatagramSocket(端口号):设置监听的端口号。
服务器:DatagramPacket(data(内容),start(开始的位置),end(结束的位置),address(IP地址),port(接受的端口号)):设置广播的内容,地址和端口号。

客户端:DatagramPacket(data(byte数组),start(接受的数据开始的位置),end(接受的数据结束的位置)):获取接受的数据存入data数组内

实例:

服务器:

public class UdpServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        String data = "Hello World!!!";
        //传输数据的大小,采用转换成字节形式的大小可以保证传输的中文不会少
        DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),0,data.getByte().length(), InetAddress.getLocalHost(),9999);
        //广播
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
}

客户端:

public class UdpSocket {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        //获取的数据进行存储
        byte[] data = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(data,0,data.length);
        //等待有数据获取
        datagramSocket.receive(datagramPacket);
        System.out.println("【UDP】获取的数据为:"+new String(data,0,datagramPacket.getLength()));
        datagramSocket.close();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值