java-网络

本文介绍了使用Java实现的TCP服务端与客户端的连接,以及UDP服务端如何接收和响应数据。展示了ServerSocket,Socket,Handler类在TCP中的应用,以及DatagramSocket在UDP通信中的使用。
摘要由CSDN通过智能技术生成

TCP

服务端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {
    public static void main(String[] args) throws IOException {
        //监听指定端口(没有指定IP,表示在所有网卡上监听)
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("server is running...");

        while (true) {
            //阻塞,等待连接建立
            Socket sock = ss.accept();
            //启动新线程处理
            new Handler(sock).start();
        }
    }
}

/*服务端处理*/
class Handler extends Thread {
    private Socket sock;
    private String name;

    public Handler(Socket sock) {
        this.sock = sock;
        this.name = sock.getRemoteSocketAddress().toString();
        show("connect new client");
    }

    @Override
    public void run() {
        //获取 InputStream 和 OutputStream,并处理
        try (InputStream input = sock.getInputStream();
             OutputStream output = sock.getOutputStream()) {
            this.handle(input, output);//处理
        } catch (IOException e) {
            show("client disconnected");
        }
        //关闭 socket
        try {
            sock.close();
        } catch (IOException e) {
            show("client close IOException");
        }
    }

    private void show(String msg) {
        System.out.printf("[%s] %s\n", name, msg);
    }

    private void handle(InputStream input, OutputStream output) throws IOException {
        show("进入handle");
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
        while (true) {
            String s = reader.readLine();
            //退出
            if (s.equals("bye")) {
                writer.write("bye\n");
                writer.flush();
                break;
            }
            //返回原值
            writer.write("Echo:" + s + "\n");
            writer.flush();
        }
        show("退出handle");
    }
}

客户端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("准备连接Server");
        Socket sock = new Socket("localhost", 8888); // 连接指定服务器和端口

        try (InputStream input = sock.getInputStream();
             OutputStream output = sock.getOutputStream()) {
            handle(input, output);//处理
        }

        sock.close();
        System.out.println("disconnected.");
    }

    private static void handle(InputStream input, OutputStream output) throws IOException {
        System.out.println("进入handle");
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print(">>> "); // 打印提示
            String s = scanner.nextLine(); // 读取一行输入
            writer.write(s);
            writer.newLine();
            writer.flush();

            String resp = reader.readLine();
            System.out.println("<<< " + resp);
            if (resp.equals("bye")) {
                break;
            }
        }

        System.out.println("退出handle");
    }
}

运行结果

$ java Server
server is running...
[/127.0.0.1:61176] connect new client
[/127.0.0.1:61176] 进入handle
[/127.0.0.1:61176] 退出handle
$ java Client
准备连接Server
进入handle
>>> 消息1
<<< Echo:消息1
>>> 消息2
<<< Echo:消息2
>>> bye
<<< bye
退出handle
disconnected.

UDP

服务端

DatagramSocket ds = new DatagramSocket(6666); // 监听指定端口
for (;;) { // 无限循环
    // 数据缓冲区:
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    ds.receive(packet); // 收取一个UDP数据包
    // 收取到的数据存储在buffer中,由packet.getOffset(), packet.getLength()指定起始位置和长度
    // 将其按UTF-8编码转换为String:
    String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);
    // 发送数据:
    byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);
    packet.setData(data);
    ds.send(packet);
}

客户端

DatagramSocket ds = new DatagramSocket(); // 由操作系统自动指定一个当前未使用的端口
ds.setSoTimeout(1000); // 后续接收UDP包时,等待时间最多不会超过1秒
ds.connect(InetAddress.getByName("localhost"), 6666); // 连接指定服务器和端口
// 发送:
byte[] data = "Hello".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length);
ds.send(packet);
// 接收:
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
// 解析成字符串:
String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
ds.disconnect();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值