Java_10 快速入门 Java网络编程

本文介绍了Java网络编程的基础,通过范例讲解了如何开发第一个网络程序,包括ServerSocket服务器和Socket客户端的实现,以及经典的Echo程序。重点展示了如何使用多线程处理并发连接,适合初学者理解网络通信原理。
摘要由CSDN通过智能技术生成

目录

第一章:Java网络编程

1.2  开发第一个网络程序

范例1-1:定义服务器端——主要使用ServerSocket。

范例1-2:编写客户端——Socket。

1.3  网络开发的经典模型——Echo程序

范例1-3:实现服务器端。

范例1-4:定义客户端。

范例1-5:修改服务器端。


第一章:Java网络编程

1.2  开发第一个网络程序

范例1-1:定义服务器端主要使用ServerSocket。

package com.yootk.demo;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class HelloServer { 

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(9999) ; // 所有的服务器必须有端口

        System.out.println("等待客户端连接....."); // 提示信息

        Socket client = server.accept() ; // 等待客户端连接

        // OutputStream并不方便进行内容的输出所以利用打印流完成输出

        PrintStream out = new PrintStream(client.getOutputStream()) ;

        out.println("Hello World !"); // 输出数据

        out.close();

        client.close();

        server.close();

    }

}

范例1-2:编写客户端Socket。

·  构造方法:public Socket(String host, int port) throws UnknownHostException, IOException;

|- host表示主机的IP地址,如果是本机直接访问,则使用localhost(127.0.0.1)代替IP;

·  得到输入数据:public InputStream getInputStream() throws IOException。

package com.yootk.demo;

import java.net.Socket;

import java.util.Scanner;

public class HelloClient {

    public static void main(String[] args) throws Exception {

        Socket client = new Socket("localhost",9999) ; // 连接服务器端

        // 取得客户端的输入数据流对象表示接收服务器端的输出信息

        Scanner scan = new Scanner(client.getInputStream()) ; // 接收服务器端回应数据

        scan.useDelimiter("\n") ; // 设置分隔符

        if (scan.hasNext()) { // 是否有数据

           System.out.println("【回应数据】" + scan.next()); // 取出数据

        }

        scan.close();

        client.close();

    }

}

1.3  网络开发的经典模型—Echo程序

范例1-3:实现服务器端。

package com.yootk.demo;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

public class EchoServer {

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(9999) ; // 定义连接端口

        Socket client = server.accept() ; // 等待客户端连接

        // 得到客户端输入数据以及向客户端输出数据的对象利用扫描流接收打印流输出

        Scanner scan = new Scanner(client.getInputStream()) ;

        PrintStream out = new PrintStream(client.getOutputStream()) ;

        boolean flag = true ; // 设置循环标记

        while(flag) {

            if (scan.hasNext()) { // 是否有内容输入

               String str = scan.next().trim() ; // 得到客户端发送的内容并删除空格

               if (str.equalsIgnoreCase("byebye")) { // 程序结束标记

                  out.println("拜拜下次再会!"); // 输出结束信息

                  flag = false ; // 退出循环

               } else { // 回应输入信息

                  out.println("ECHO : " + str); // ECHO :前缀返回

               }

            }

        }

        scan.close();

        out.close();

        client.close();

        server.close();

    }

}

范例1-4:定义客户端。

package com.yootk.demo;

import java.io.PrintStream;

import java.net.Socket;

import java.util.Scanner;

public class EchoClient {

    public static void main(String[] args) throws Exception {

        Socket client = new Socket("localhost", 9999); // 服务器地址与端口

        Scanner input = new Scanner(System.in); // 键盘输入数据

        // 利用Scanner包装客户端输入数据服务器端输出),PrintStream包装客户端输出数据

        Scanner scan = new Scanner(client.getInputStream());

        PrintStream out = new PrintStream(client.getOutputStream());

        input.useDelimiter("\n"); // 设置键盘输入分隔符

        scan.useDelimiter("\n"); // 设置回应数据分隔符

        boolean flag = true; // 循环标志

        while (flag) {

            System.out.print("请输入要发送数据:");

            if (input.hasNext()) { // 键盘是否输入数据

               String str = input.next().trim(); // 取得键盘输入数据

               out.println(str); // 发送数据到服务器端

               if (str.equalsIgnoreCase("byebye")) { // 结束标记

                  flag = false; // 结束循环

               }

               if (scan.hasNext()) { // 服务器端有回应

                  System.out.println(scan.next()); // 输出回应数据

               }

            }

        }

        input.close();

        scan.close();

        out.close();

        client.close();

    }

}

范例1-5:修改服务器端。

package com.yootk.demo;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

class EchoThread implements Runnable { // 建立线程类

    private Socket client; // 每个线程处理一个客户端

    public EchoThread(Socket client) { // 创建线程对象时传递Socket

        this.client = client;

    }

    @Override

    public void run() {

        try { // 每个线程对象取得各自Socket的输入流与输出流

            Scanner scan = new Scanner(client.getInputStream());

            PrintStream out = new PrintStream(client.getOutputStream());

            boolean flag = true; // 控制多次接收操作

            while (flag) {

                if (scan.hasNext()) { // 是否有内容

                   String str = scan.next().trim(); // 得到客户端发送的内容

                   if (str.equalsIgnoreCase("byebye")) { // 程序结束

                      out.println("拜拜,下次再会!");

                      flag = false; // 退出循环

                   } else { // 应该回应输入信息

                      out.println("ECHO : " + str); // 回应信息

                   }

                }

            }

            scan.close();

            out.close();

            client.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

public class EchoServer {

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(9999); // 9999端口上监听

        boolean flag = true; // 循环标记

        while (flag) { // 接收多个客户端请求

            Socket client = server.accept(); // 客户端连接

            new Thread(new EchoThread(client)).start(); // 创建并启动新线程

        }

        server.close();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值