【实现单地址单端口监听】

该博客展示了如何使用Java实现一个简单的UDP服务器和客户端。服务器通过`DatagramSocket`监听8888端口,接收到客户端发送的数据后打印,并在接收到特定结束指令('q'或'quit')时停止。客户端则通过`DatagramSocket`发送用户输入的内容到服务器,同样在输入结束指令后终止。示例代码详细说明了网络通信的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端

import com.sun.security.ntlm.Client;

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class Server {

    public static void main(String[] args) {
        try {
            //创建一个服务器对象,端口8888
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("启动服务器....");
//            Socket s = ss.accept();
//            System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
//
//            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//            //读取客户端发送来的消息
//            String mess = br.readLine();
//            System.out.println("客户端:"+mess);
//            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//            bw.write(mess+"\n");
//            bw.flush();
//            Socket client=null;
//            boolean flag=true;
//            while (flag){
//                System.out.println("服务器已启动等待客服端请求。。。。。");
//                client = serverSocket.accept();
//                new Thread(new EchoThread(client)).start();
//            }
//            client.close();;
//            serverSocket.close();;
//            System.out.println("服务以关闭。");
            DatagramSocket server = new DatagramSocket(8888);
            byte[] recvBuf = new byte[100];
            DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length);
            while (true) {
                server.receive(recvPacket);
                String recvStr = new String(recvPacket.getData(), 0,
                        recvPacket.getLength());
                System.out.println("收到:" + recvStr);
                if(recvStr.endsWith("q")|| recvStr.endsWith("quit")){
                    break;
                }
            }
            server.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
class EchoThread implements Runnable {
    private Socket client;

    public EchoThread(Socket client) {
        this.client = client;

    }

    public void run() {
        //run不需要自己去执行,好像是线程器去执行了来着,可以去看api
        try {
            BufferedReader in = null;
            String br = null;
            boolean flag = true;
            while (flag == true) {
                //Java流的操作没意见吧
                in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                br = in.readLine();
                System.out.println("++:" + br);
                recordMsg(br);//写入到文件
            }

        } catch (IOException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("error");
        }


    }

    public void recordMsg(String br) throws IOException {
        File file = new File("test.data");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileWriter writer = new FileWriter(file, true);
        writer.write(br + "\r\n");
        writer.close();

    }
}



客户端


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.*;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Scanner;


public class Client {
//protected static Logger log=Logger.getLogger(Client.class);

    public static void main(String[] args) {

        try {

            DatagramSocket client = new DatagramSocket();
            InetAddress addr = InetAddress.getByName("127.0.0.1");
            int port = 8888;
            byte[] sendBuf;
            while(true){
                Scanner sc = new Scanner(System.in);
                System.out.println("请输要发送的内容:");
                String str  = sc.nextLine();
                sendBuf = str.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendBuf , sendBuf.length , addr , port );
                client.send(sendPacket);
                if(str.endsWith("q")|| str.endsWith("quit")){
                    break;
                }
            }
            client.close();
                } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

结果
在这里插入图片描述
参考:https://www.cnblogs.com/zhaohz/p/4946365.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值