计算机网络原理 实验1 《Windows Socket编程》

计算机网络原理 实验1 《Windows Socket编程》

一、实验目的

通过实验,熟悉并掌握计算机Windows 编程的基本知识,进一步加深对课堂所学基本内容的理解,掌握基本的Windows编程技巧,通过实验能够进行一些简单的网络程序设计。

二、实验内容

1、了解基本的Socket知识
2、基于Java完成Socket编程,设计并实现一个简单的聊天系统,包括客户端及服务器端。

  • 完成服务端使用telnet与服务器通信
  • 完成客户端与服务端通信
  • 完成基于多线程的实现服务端可以与多个客户端通信

3、可选,重构现有代码完成带界面的软件。实现各客户端之间聊天,以及多人聊天室。

三、实验方法

1、利用Java提供的java.net.Socket、java.net.ServerSocket等Socket相关工具,实现客户端与服务端的模拟通讯,即客户端、服务端各写一个Java类,并同时运行进行即时通讯测试;
2、上述测试完毕后即可开始构建图形化界面的多人聊天室以及私聊聊天室,即IP Messenger的原型。主要原理即单点对多点通讯、单点对单点通讯。由于Java图形化处理的Swing技术较老,这里选择C++的Qt平台进行图形化实现。Qt Creator中也提供了类似的Socket工具,整体使用方法与Java的Socket类似。

四、实验步骤

1、Socket通信测试

(1) 新建工程
创建一个简单的Java工程,这里使用IntelliJ IDEA完成。

计算机网络原理 实验1 《Windows Socket编程》_第1张图片
(2) 建立两个Java类模拟客户端与服务端,使用telnet并通过Socket进行通信。 创建服务端类Java文件sampleServer.java,启动函数start负责建立服务器并等待连接,而停止方法`stop`负责关闭连接和相关的IO流。`accept`方法在serverSocket对象创建后等待客户端连接。如果没有客户端连接,轮询将继续,直到客户端连接,下面的代码将继续执行。连接建立后,双方建立通信通道,IO流进行数据读写。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class sampleServer {
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void start(int port) throws Exception {
        serverSocket = new ServerSocket(port);
        clientSocket = serverSocket.accept();

        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            if (".".equals(inputLine)) {
                out.println("good bye");
                stop();
                break;
            }
            out.println("server got msg: " + inputLine);
        }
    }

    public void stop() throws Exception {
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }

    public static void main(String[] args) {
        try {
            sampleServer server = new sampleServer();
            server.start(6666);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

创建客户端类Java文件sampleClient.java,StartConnection方法指定IP与端口,若与服务器成功建立连接,则获取建立的通道的IO流,out与in输入输出流,来实现后续与服务端的消息接收与发送。sendMessage方法基于IO流发送消息;StopConnection关闭与服务端的连接;主方法获得用户在命令行的输入,发送给服务端。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class sampleClient {
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void startConnection(String ip, int port) throws Exception {
        clientSocket = new Socket(ip, port);
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }

    public String sendMessage(String msg) throws Exception {
        out.println(msg);
        return in.readLine();
    }

    public void stopConnection() {
        try {
            in.close();
            out.close();
            clientSocket.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            // build the connection
            sampleClient client = new sampleClient();
            client.startConnection("127.0.0.1", 6666);
            // receive the input string from terminal and send it to server
            Scanner sc = new Scanner(System.in);
            while (true) {
                String response = client.sendMessage(sc.nextLine());
                System.out.println(response);
                if (response.equals("good bye")) {
                    client.stopConnection();
                    break;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

2、图形化通信构建

构建相应的图形化客户端界面。这里使用Qt平台构建,具体的Socket通信方法与上述的Java方法的使用是类似的。下述是构建好的GUI及其通信效果。

计算机网络原理 实验1 《Windows Socket编程》_第2张图片
计算机网络原理 实验1 《Windows Socket编程》_第3张图片
计算机网络原理 实验1 《Windows Socket编程》_第4张图片
计算机网络原理 实验1 《Windows Socket编程》_第5张图片

五、实验结果

Socket通信测试结果:

计算机网络原理 实验1 《Windows Socket编程》_第6张图片
其余结果已在实验步骤中进行了展示。

六、实验结论

我们平时说的最多的Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

七、实验小结

本次实验主要是体验了计算机网络中的TCP/IP协议在通信中的具体使用。通过自己调用相关的API和方法实现了基本的通讯功能和文件传输功能(限于局域网内),因此还是比较有成就感的,对于网络的认识也更进了一步。

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
Socket不是某一层的协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组编程接口(即API),在设计模式中,socket就是门面模式(又称为外观模式,Facade),它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。总的来说Socket就是一组API,对TCP/IP协议进行封装的API接口。

你可能感兴趣的:(计算机网络原理,计算机网络,socket,java,网络通信)