(二)Socket实战——安装开发工具IDEA

开始以为直接安装gradle就可以了,折腾半天安装好gradle后发现需要安装idea,后者包含前者,且拥有更多的功能
接下来记录下两个的区别:

  • gradle:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译、打包等过程。我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建app。
    参考:十分钟理解Gradle - Bonker - 博客园 https://www.cnblogs.com/Bonker/p/5619458.html
  • IDEA:idea(java语言开发的集成环境)一般指IntelliJ IDEA
    参考:IntelliJ IDEA_百度百科 https://baike.baidu.com/item/IntelliJ IDEA/9548353?fr=aladdin&fromtitle=idea&fromid=1671803
    IDE:集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。IDE多被用于开发HTML应用软
  • JDK:(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。

安装教程Eclipse

参考:Eclipse最新最简最详细安装教程 - rothschild666的博客 - CSDN博客 https://blog.csdn.net/rothschild666/article/details/82914600

Windows下安装和设置gradle

参考:windows下安装和设置gradle - WingYao - 博客园 https://www.cnblogs.com/yaozhixiang/articles/10210812.html

安装前提

检查JDK是否安装:

  • 快捷键Win+R弹出的输入框中输入cmd,然后打开命令窗口,在命令窗口中输入java -version可以查看到java的版本信息
  • 若没有安装JDK,配置好gradle,在命令窗口会看到如下提示,显示没有java的路径
    在这里插入图片描述
若没有安装JDK

参考:如何下载并安装JDK-百度经验 https://jingyan.baidu.com/article/1876c85250d726890a137673.html

我的安装完毕后是这样的:说明安装成功
在这里插入图片描述

下载安装gradle

参考:windows下安装和设置gradle - WingYao - 博客园 https://www.cnblogs.com/yaozhixiang/articles/10210812.html
安装成功后为下图所示:
在这里插入图片描述

这里使用IDEA作为socket编程的开发工具

安装IDEA

参考:(1条消息)IntelliJ IDEA 完美破解(2099年到期) - we are family - CSDN博客 https://blog.csdn.net/dc2222333/article/details/78582131
打开IDEA创建项目:选择Gradle,选择对应的JDK,勾选Java
在这里插入图片描述
填写相应的项目名称和分组
在这里插入图片描述

指定工程创建位置:
在这里插入图片描述
完成创建,需等待一段时间,项目完成初始化,红框里都是需要等待一段时间才会出现的
在这里插入图片描述

接下来创建客户端和服务端的java类,在红框的java文件右击,选择new中的java class
在这里插入图片描述
创建客户端和服务器端两个文件
在这里插入图片描述在这里插入图片描述
创建的结果如下图:在这里插入图片描述
在两个java文件中编写:

客户端基本过程及例子:

(1) 创建 Socket 对象 (指定服务器的 IP 地址和端
口号) 并连接到服务器。
(2) 获得输出流进行数据发送。
(3) 获得输入流进行数据读取。
(4) 关闭socket资源,关闭连接。

import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket
public class Client {
    //java基础类方法的入口
    public static void main(String[] args)throws IOException {
        Socket socket=new Socket();
        //读取流超时的时间设置为3000
        socket.setSoTimeout(3000);
        //连接本地,端口2000;超时时间3000ms
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000);
        System.out.println("发起服务器连接咯,继续进入后续流程啦啦~");
        System.out.println("客户端信息就是~:"+socket.getLocalAddress()+" P:"+socket.getLocalPort());//打印本地服务器地址和本地端口号
        System.out.println("服务端信息就是~:"+socket.getInetAddress()+" P:"+socket.getPort());
        try{
            //发送接收数据
            todo(socket);
        }catch (Exception e){
            System.out.println("竟然出现异常关闭啦");
        }
        //释放资源
        socket.close();
        System.out.println("拜拜,客户端已退出~");
    }
    //发送数据的方法
    private  static void todo(Socket client) throws IOException{
        //构建键盘输入流
        InputStream in=System.in;
        //把键盘输入流转换为BufferedReader
        BufferedReader input=new BufferedReader(new InputStreamReader(in,"UTF-8"));
        //得到Socket输出流(Client要发送出去给服务器的信息),并转换为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream=new PrintStream(outputStream);
        //得到Socket输入流(Server回复传入Client的信息),并转换为BufferedReader
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
        //判断Server是否想要退出,回复“bye”时是他想要结束对话
        boolean flag=true;
        do {
            //键盘读取一行
            String str = input.readLine();
            //发送到服务器,(通俗就是显示在输入处,在键盘上输入什么,屏幕显示什么)
            socketPrintStream.println(str);
            //从服务器读取一行,即Server传入回复给Client的信息
            String echo = socketBufferedReader.readLine();
            if("bye".equalsIgnoreCase(echo)){
                flag=false;
            } else{
                //打印到屏幕上,Server回复什么就显示什么
                System.out.println("Client回复:"+echo);
            }
        }while(flag);
        //资源释放,关闭对于socket资源
        socketPrintStream.close();
        socketBufferedReader.close();
    }
}
服务端创建过程及代码:

服务端通常会和多个客户端建立连接, 所以通常会
采用多线程和多个客户端进行通信。
(1) 服务器端创建 ServerSocket, 循环调用 accep 等待客户端连接。
(2) 客户端创建一个 Socket 并和服务器端连接。
(3) 服务器端接受到客户端连接请求后, 分配本地通信 Socket 并建立一个新线程, 后续通过该线程和客户端进行通信。
(4) 在服务线程内部, 通过服务端本地 Socket 和客户端进行通信。
(5) 通信完成后, 服务端关闭连接, 释放线程。
(6) 服务端侦听 Socket 继续监听新的请求。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args)throws IOException {
        ServerSocket server=new ServerSocket(2000);
        System.out.println("服务器准备就绪啦啦啦~");
        System.out.println("服务器信息:"+server.getInetAddress()+" P:"+server.getLocalPort());
        //等待多个客户端连接,循环异步线程
        for(;;) {
            //得到客户端
            Socket client = server.accept();
            //客户端构建异步线程
            ClientHandler clientHandler = new ClientHandler(client);
            //启动线程
            clientHandler.start();
        }
    }
    /**
     * 客户端消息处理
     */
    //多个客户端需要做异步操作,建立异步处理类
    private static class ClientHandler extends Thread{//线程
        private  Socket socket;//代表当前的一个连接
        private boolean flag=true;
        ClientHandler(Socket socket){
            this.socket=socket;
        }//构造方法
        //一旦Thead启动起来,就会运行run方法,代表线程启动的部分
        @Override
        public void run(){
            super.run();
            //打印客户端的信息
            System.out.println("这个新客户端发起连接啦:"+socket.getInetAddress()+" P:"+socket.getPort());
            //在发送过程中会触发一个IO过程,所以需要捕获异常
            try {
                //得到打印流,用于数据输出,服务器回送数据使用,即在屏幕上显示Server要回复Client的信息
                PrintStream socketOutput=new PrintStream(socket.getOutputStream());
                //得到输入流,用于接收数据,得到Client回复服务器的信息
                BufferedReader sockeInput=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
                do {
                    //客户端回复一条数据
                    String str = sockeInput.readLine();
                    if("bye".equalsIgnoreCase(str)){
                        flag=false;
                        //回送
                        socketOutput.println("bye");
                    }else{
                        //打印到屏幕,并回送数据长度
                        System.out.println(str);
                        socketOutput.println("Server回答说:" +str.length());
                    }
                }while(flag);
                sockeInput.close();
                socketOutput.close();
            }catch (Exception e){
                //触发异常时打印一个异常信息
                System.out.println("哦欧,连接异常断开了呀!!!");
            }finally {
                //连接关闭
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("拜拜,客户端退出咯~~:"+socket.getInetAddress()+" P:"+socket.getPort());
        }
    }
}
运行服务端和客户端结果,客户端可向服务器发起对话,服务器自动回复

在这里插入图片描述
在这里插入图片描述

注意:
  • 刚开始使用IDEA时不太熟悉,导致中文乱码,在网上找了很多方法,参考:idea各种中文显示乱码解决大全 - liqimo1799的专栏 - CSDN博客 https://blog.csdn.net/liqimo1799/article/details/81811153
    修改了
    ①settings --> editor --> code style --> file encodings 中IED Encoding 和project Encoding defult encoding for properties files 三个设置为utf-8
    在这里插入图片描述
    ②打开idea安装地址\bin中idea.exe.vmoptions 和idea64.exe.vmoptions 打开文件在最后加上-Dfile.encoding=UTF-8
    在这里插入图片描述
  • 但保存后一直都还是乱码,然后从新打开IDEA还是乱码,最后再在每个BufferedReader后面都加上了"UTF-8",例如:BufferedReader input=new BufferedReader(new InputStreamReader(in,“UTF-8”))
  • 最重要的是要把这个项目重新rebuild一下,重新生成后就不会乱码了。在这里插入图片描述
  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值