• 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)


    要进行网络编程,首先要搞清楚目的是什么。

    网络编程说简单点就是在网络上的计算机进行数据的交互。

    wKiom1nDU8jBR29DAADRe0E88II285.png

    既然要进行数据交互,那就需要有一个发送方和一个接受方。

    按网络上的说法,就是一个攻一个受·j_0025.gif

    当然,现阶段网上的电脑一般来说都是既接受数据,也能发送数据的,所以说这些电脑都是“插座型”的,进可攻,退可受!!!

    好吧,还是使用专业点的名字吧:客户端/服务器

    那么具体到两台电脑,它们是如何来交互数据的呢?请看下图:

    wKioL1nDVIrikiO8AACwoz0sGOs008.png


    从步骤来分析:

    一、服务器端程序

        1.1创建一个服务器套接字(ServerSocket),并绑定到指定端口。

        1.2侦听来自客户端的请求,如果接受到连接则返回套接字对象(socket)。

        1.3获得输入/输出流,也就是进行数据的接收或发送。

        1.4关闭套接字(socket)。

    二、客户端程序

        2.1创建一个套接字,向服务器指定商品发送请求。

        2.2与服务器正确连接后开始数据的接收或发送。

        2.3关闭套接字。

    步骤分析完了,接下来就是实施了。

    服务器端代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class MyServer {
        private static final int SERVER_PORT = 9527// 指定侦听端口
     
        public MyServer() {
            try {
                ServerSocket ss = new ServerSocket(SERVER_PORT); // 创建服务器套接字
                System.out.println("服务端已启动,正在等待客户端...");
                Socket s = ss.accept(); // 侦听来自客户端的请求
                InputStream in = s.getInputStream(); // 获得输入流,用来接收数据
                OutputStream out = s.getOutputStream(); // 获得输出流,用来发送数据
                byte[] buf = new byte[1024]; // 数据缓存
                int len = in.read(buf); // 从输入流中读取数据
                String strFromClient = new String(buf, 0, len);
                System.out.print("来自客户端的信息>>");
                System.out.println(strFromClient);
                String strToClient = "我也很好!";
                out.write(strToClient.getBytes()); // 往输出流中发送数据
                // 关闭输入流和输出流
                in.close();
                out.close();
                // 关闭通信套接字和服务器套接字
                s.close();
                ss.close();
                System.out.println("服务端已关闭。");
            catch (IOException e) {
                e.printStackTrace();
            }
        }
         
        public static void main(String[] args) {
            MyServer ms = new MyServer();
        }
    }

    客户端代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class MyClient {
        private static final int SERVER_PORT = 9527;  //服务器的侦听端口
        public MyClient() {
            try {  
                //由于服务端也是运行在本机,所以创建本机的InetAddress对象
                InetAddress address = InetAddress.getByName("localhost");
                Socket s = new Socket(address, SERVER_PORT);  //向服务器侦听端口发出请求
                System.out.println("客户端已启动。");
                InputStream in = s.getInputStream();     //获得输入流,用来接收数据
                OutputStream out = s.getOutputStream();  //获得输出流,用来发送数据
                String strToServer = "你好!";
                out.write(strToServer.getBytes());   //往输出流中发送数据
                byte[] buf = new byte[1024];
                int len = in.read(buf);              //从输入流中读取数据
                String strFromServer = new String(buf, 0, len);  
                System.out.print("来自服务端的回答>>");
                System.out.println(strFromServer);
                in.close();out.close();  //关闭输入流和输出流
                s.close();               //关闭通信套接字
                System.out.println("客户端已关闭。");
            catch (UnknownHostException nhe) {
                System.out.println("未找到指定主机...");
            catch (IOException ioe) { 
                ioe.printStackTrace();
            }
        }
         
        public static void main(String[] args) {
            MyClient mc = new MyClient();
        }
    }

    先运行服务器端

    wKioL1nDWzizH3DqAAAdegLMUa8760.png

    再运行客户端,可以发现服务器端的内容发生了变化

    wKiom1nDW9zQWpbWAAAjBpnMi-k530.png

    再切换到客户端的输出窗口

    wKiom1nDXAzAcF5hAABHB78MZ7I848.png

    客户端的输出内容如下:

    wKiom1nDXAzwzJCUAAAfg4FCVAI164.png

    有兴趣的看官可以修改代码,让它变成可以从控制台反复输入文字来交互。研究得更深些的朋友,可以尝试发送文件。

    网络编程最基本的内容到这儿就结束了,此处应有点赞!!!j_0028.gif

     “软件思维”博客地址:51CTO博客园,感兴趣的小伙伴可以去看相关的其它博文。  

  • 相关阅读:
    zoj 3279 线段树 OR 树状数组
    fzu 1962 树状数组 OR 线段树
    hdu 5057 块状链表
    hdu3487 Play with Chain
    bzoj 1588营业额统计(HNOI 2002)
    poj2823 Sliding Window
    poj2828 Buy Tickets
    poj2395 Out of Hay
    poj3667 Hotel
    poj1703 Lost Cows
  • 原文地址:https://www.cnblogs.com/yixueyuan/p/7568525.html
Copyright © 2020-2023  润新知