【计网实验】实验二 :网络基础编程实验(JAVA)

实验目的

通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。

实验过程

1、用TCP进行数据发送的简单程序

流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。

程序概述:客户端与服务器之前能进行轮流信息交换,当各自回复"bye"则关闭自身,当客户端回复"ok"则关闭服务器。

客户端代码:

package com.mwx.tcp;

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

public class TCPClient {
   
    public static void main(String[] args) throws Exception {
   
        PrintWriter socout = null;
        InputStreamReader socin = null;
        Socket socket = null;
        try {
   
            //1.要知道服务器的地址,端口号
            InetAddress serverIP = InetAddress.getByName("10.69.51.117");
            int port = 9999;
            //2.创建soket
            socket = new Socket(serverIP, port);

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

            //3.2客户端接收来自于服务器的消息
            socin = new InputStreamReader(socket.getInputStream());
            BufferedReader socbuf = new BufferedReader(socin);

            //3.3客户端向服务器发送消息
            socout = new PrintWriter(socket.getOutputStream());

            //4.进行通信:

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

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

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

                //收到服务器的回复后,客户端继续键盘键入要发送给服务器的数据
                readline = sysbuf.readLine();
            }

        } catch (Exception e) {
    //打印异常
            System.out.println("Error:" + e);
        } finally {
   //close方法也可能会有异常,这里没有捕获处理,而是先抛出去了
            //完成通信后关闭io和socket
            socout.close();
            socin.close();
            socket.close();
            System.out.println("客户端已关闭");
        }

    }

}

服务器代码:

package com.mwx.tcp;


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

public class TCPServer {
   
    public static void main(String[] args) throws IOException {
   
        PrintWriter socout = null;
        InputStreamReader socin = null;
        ServerSocket server = null;
        try {
   
            //1.建立服务器
            server = new ServerSocket(9999);

            //2.监听,等待客户端连接过来
            Socket socket = server.accept();

            //3.通信

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

            //接收客户端消息
            socin = new InputStreamReader(socket.getInputStream());
            BufferedReader socbuf = new BufferedReader(socin);

            //发送给客户端
            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();
            }
        } catch (Exception e) {
   
            System.out.println("Error:" + e);
        } finally {
   
            socout.close();
            socin.close();
            server.close();
            System.out.println("服务器已关闭");
        }

    }
}

运行方式:先启动服务器,再启动客户端;客户端先发送数据,服务器再回复。

运行截图:
在这里插入图片描述 在这里插入图片描述

2、采用UDP进行数据发送的简单程序

数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。

程序概述:可以从键盘键入,通过客户端给服务器发送消息,服务器收到之后向客户端回复“ok”。

客户端代码:

package com.mwx.udp;

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

public class UDPClient {
   
    public static void main(String[] args) throws IOException{
   
        //建立socket
        DatagramSocket socket = new DatagramSocket();

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

        try {
   
            //准备向服务器发送数据:
            String readline = sysbuf.readLine();
            //创建数据包,参数:数据、数据长度、目的IP、端口号
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值