0
点赞
收藏
分享

微信扫一扫

TCP、UDP及Socket代码示例

上一篇 <<<TCP的三次握手建立链接和四次挥手释放链接
下一篇 >>>Https的1.0、2.0协议及长短链接区别


1.TCP代码

1.1 服务器端

public class SocketTcpServer {
    public static void main(String[] args) throws IOException {
        // 创建Server Socket
        ServerSocket serverSocket = new ServerSocket();
        // 创建我们的 Socket 监听连接地址和端口号
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        // 绑定我们的监听地址
        serverSocket.bind(address);
        // 等待接受请求
        System.out.println("等待客户端发送消息..");
// 此代码监听是否完成三次握手,如果执行完则继续,否则一直阻塞等待
        Socket accept = serverSocket.accept();
        // 获取OutputStream流
        PrintWriter socketOut = new PrintWriter(accept.getOutputStream());
        byte buf[] = new byte[1024];
        if (accept.getInputStream().read(buf) > 0) {
            System.out.println("服务器端接受到客户端消息:" + new String(buf));
        }
        // 服务器端响应消息
        String sendStr = "我是jarye";
        socketOut.write(sendStr);
        socketOut.flush();

        // 关闭所有连接
        socketOut.close();
        accept.close();
        serverSocket.close();
    }
}

1.2 客户端

public class SocketTcpClient {
    public static void main(String[] args) throws IOException {
        // 创建socket
        final Socket socket = new Socket();
        // 创建socket地址
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        socket.connect(address);
        // 创建PrintWriter
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        BufferedReader socketIn = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));

        // 向服务器发送的内容
        String sendStr = "客户端问服务器端:你是jarye吗?";
        socketOut.write(sendStr);
        socketOut.flush();
        String receiveStr = socketIn.readLine();
        System.out.println("服务器端回复:: " + receiveStr);

        // 关闭连接
        socketOut.close();
        socketIn.close();
        socket.close();
    }
}

2.UDP代码

2.1 服务端代码

/*
 * 接收客户端发送的数据
 */
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];
//创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
//此方法在接收到数据报之前会一直阻塞
socket.receive(packet);
//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);

/*
 * 向客户端响应数据
 */
//1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "大家好啦~~".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();

2.2 客户端代码

/*
 * 向服务器端发送数据
 */
//1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "大家好吗?".getBytes();
//2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//4.向服务器端发送数据报
socket.send(packet);

/*
 * 接收服务器端响应的数据
 */
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
//4.关闭资源
socket.close();

3.使用Socket模拟Http服务器

public class HttpTest {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        //一直监听,直到受到停止的命令
        while (true) {
            Socket socket = null;
            try {
                //如果没有请求,会一直hold在这里等待,有客户端请求的时候才会继续往下执行
                socket = serverSocket.accept();
                //获取输入流(请求)
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                StringBuilder stringBuilder = new StringBuilder();
                String line = null;
                //得到请求的内容,注意这里作两个判断非空和""都要,只判断null会有问题
                while ((line = bufferedReader.readLine()) != null
                        && !line.equals("")) {
                    stringBuilder.append(line).append("<br>");
                }
                String result = stringBuilder.toString();
                System.out.println(result);
                //这里第二个参数表示自动刷新缓存
                PrintWriter printWriter = new PrintWriter(
                        socket.getOutputStream(), true);
                printWriter.println("HTTP/1.1 200 OK");
                printWriter.println("Content-Type:text/html;charset=utf-8");
                printWriter.println();

                printWriter.println("<h5>你刚才发送的请求数据是:<br>");
                //将日志输出到浏览器
                printWriter.write(result);
                printWriter.println("</h5>");
                // release
                printWriter.close();
                bufferedReader.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

推荐阅读:
<<<OSI七层模型与层上协议
<<<TCP的三次握手建立链接和四次挥手释放链接
<<<Https的1.0、2.0协议及长短链接区别
<<<Linux系统的五种IO模型
<<<BIO和NIO区别
<<<BIO模型的缺陷
<<<NIO模式的IO多路复用底层原理
<<<select、poll、epoll的区别
<<<Redis为什么单线程能够支持高并发
<<<Netty初识
<<<Netty的粘包和拆包问题分析
<<<粘包和拆包问题解决方案汇总
<<<序列化与反序列化知识点汇总
<<<MessagePack反序列化使用示例
<<<Marshalling在Netty中的使用

举报

相关推荐

0 条评论