[Computer Network Experiment] Experiment 2: Network Basic Programming Experiment (JAVA)

Purpose

Through this experiment, learn to use Socket (socket) to design a simple network data receiving and sending program, and understand how application data packets are transmitted through the transport layer.

experiment procedure

1. A simple program to send data using TCP

The stream socket uses TCP as its end-to-end protocol (the bottom layer uses the IP protocol), providing a reliable byte stream service.

Program overview: The client and the server can exchange information before each other. When they reply "bye", they close themselves, and when the client replies "ok", they close the server.

Reference tutorial: TCP network programming based on JAVA Socket class

Client code:

package com.mwx.tcp;

import java.io.*;
import java.net.*;

public class TCPClient {
    
    
    public static void main(String[] args) throws UnknownHostException, IOException {
    
    
        try {
    
    
            //创建soket
            Socket socket = new Socket("10.69.51.117",9999);//参数:IP地址,端口号(这里填的IP地址是本机的,端口号是自定义的)

            //建立连接:

            //从键盘读取的
            InputStreamReader sysin = new InputStreamReader(System.in); //输入字节流(从键盘键入)
            BufferedReader sysbuf = new BufferedReader(sysin); //将输入放到缓冲区中

            //从socket中读取的
            InputStreamReader socin = new InputStreamReader(socket.getInputStream());
            BufferedReader socbuf = new BufferedReader(socin);

            //向socket中写
            PrintWriter socout = new PrintWriter(socket.getOutputStream());

            //进行通信:

            //首先是客户端向服务器发送数据,所以先等键盘键入,即获取客户端要发送的内容
            String readline = sysbuf.readLine();
            while(!readline.equals("bye")) {
    
     //如果我们键入的是 bye ,则停止连接 (在while循环中进行,即可一次连接,多次通信)
                socout.println(readline); //将从键盘键入的内容写入socket
                socout.flush();//flush():刷新此输出流并强制写出所有缓冲的输出字节。
                //写入的时候数据是先写入内存,然后再从内从写入到文件中,之后才能从文件中读取。所以可能写入内存写完了,但是写入文件没写完,因此为了能够即时通信,需要flush()

                System.out.println("Client:"+readline);

                //客户端接收服务器的回复,将此回复打印出来
                System.out.println("Server:"+socbuf.readLine());//readLine()方法若还没接收到任何数据,则会停在此处等待

                //收到服务器的回复后,客户端继续键盘键入要发送给服务器的数据
                readline = sysbuf.readLine();
            }
            //完成通信后关闭io和socket
            socout.close();
            socin.close();
            socket.close();
            System.out.println("客户端已关闭");

        }catch(Exception e) {
    
     //打印异常
            System.out.println("Error:"+e);
        }

    }

}

Server code:

package com.mwx.tcp;


import java.io.*;
import java.net.*;

public class TCPServer {
    
    
    public static void main(String[] args) throws UnknownHostException, IOException {
    
    
        try {
    
    
            //建立套接字
            ServerSocket server = new ServerSocket(9999);//参数:端口号(要与客户端相同)

            //监听
            Socket socket = server.accept();

            //建立连接:

            //从键盘读取的
            InputStreamReader sysin = new InputStreamReader(System.in); //输入字节流(从键盘键入)
            BufferedReader sysbuf = new BufferedReader(sysin); //将输入放到缓冲区中

            //从socket中读取的
            InputStreamReader socin = new InputStreamReader(socket.getInputStream());
            BufferedReader socbuf = new BufferedReader(socin);

            //向socket中写
            PrintWriter socout = new PrintWriter(socket.getOutputStream());

            //进行通信:
            //首先打印出客户端发来的信息,从socket缓冲区读取  (如果客户端一开始就回复ok的话不会停止通信)
            System.out.println("Client:"+socbuf.readLine());
            //从键盘键入服务器要回复的内容
            String readline = sysbuf.readLine();
            while(!readline.equals("bye")) {
    
     //只要服务器键入的不是 bye,就继续通信
                //将readline发送给客户端
                socout.println(readline);
                socout.flush(); //刷新缓冲区
                //打印出服务器回复了啥
                System.out.println("Server:"+readline);

                String flag = socbuf.readLine();
                if(!flag.equals("ok")) //如果从客户端接收的字符不是 ok,则打印出来,若果不是则结束循环
                    System.out.println("Client:"+flag);
                else //如果客户端发来的信息是ok,则关闭与客户端的通信
                    break;

                readline = sysbuf.readLine();
            }

            socout.close();
            socin.close();
            server.close();
            System.out.println("服务器已关闭");
        }catch(Exception e) {
    
    
            System.out.println("Error:"+e);
        }

    }
}

Operation mode: start the server first, then start the client; the client sends data first, and the server replies.

Run screenshot:
Insert picture description here Insert picture description here

2. A simple program that uses UDP to send data

To be done...

Guess you like

Origin blog.csdn.net/qq_43424037/article/details/115284051