Java写QQ一样的通讯程序,和小伙伴一起玩起来吧

一:先小试牛刀,来一个基本框架吧

1.创建一个Java工程,名称可以自己定义哦

我这里写的是通讯。

代码如下,详细简答写在代码注释中

这是第一个工程。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class 通讯 {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(9000);//链接的是9000端口
            System.out.println("服务器等待建立链接");
            Socket socket = serverSocket.accept();
            System.out.println("链接已建立,读取数据");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(bufferedReader.readLine());
            socket.close();//开启这个端口要记得关闭

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

有了第一个工程当然要第二个工程了,才能实现通讯。

我创建的是ClientCode的工程

具体代码如下:

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

public class ClientCode {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("xxxxx",9000);//端口是自己的本机ip,用的是9000端口进行连接
            String strValue = "hello,haha";
            PrintStream p = new PrintStream(socket.getOutputStream());
            p.println(strValue);
            p.println("大数据2班");
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

简易的通讯程序就写好了,当然这是最简单的,只是一个框架,想必大家想知道一个更全,更高级的程序,接下来我们就根据这个代码进行改进。

二:通讯程序的进阶版

接下来我们来理解一些数据传输的原理。

    //动态数据采集接口
    //高级(封装的:Spring Boot,Spring MVC)
    //Socket(原生、原始:字节数据)
    //tcp  (面向连接的传输协议)   优点:传输可靠、稳定     缺点:效率不如udp
    //udp  (无连接的传输协议)     优点:传输速度快         缺点:传输没有tcp可靠(丢包)
    //tcp的七层协议(七部分程序):传输字符串”hello、张三“   给张三同学
    //                                     甲公司     (甲董事长给乙董事长发公函)   乙公司
    //应用层   允许接入网络资料              甲董事长写了公函                        乙董事长读取公函
    //表示层   对数据进行转换、加密和压缩      公函装公文袋                           拆封公文袋
    //会话层   管理、终止会话              甲秘书通知乙秘书                          乙秘书收到公文袋
    //传输层   可靠的端到端的链接             公文袋给顺丰                             顺丰投递公文袋
    //网络层   从源端传到目的端             顺丰规划快递路线                          顺丰规划快递路线
    //数据链接路 节点到节点的传输             顺丰的中间节点传输快递                  顺丰的中间节点传输快递
    //物理层    传输比特                     公路上跑的快递车                     公路上跑的快递车

    //tcp怎么建立链接      怎么断开链接

这里我用了一个送快递公文函来形象描述传输的工程,相信大家因该理解了。

接下来就进入代码环节:

我这里创建的是ServerCode

详细简答写在代码的注释中:代码如下

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerCode {
    //动态数据采集接口
    //高级(封装的:Spring Boot,Spring MVC)
    //Socket(原生、原始:字节数据)
    //tcp  (面向连接的传输协议)   优点:传输可靠、稳定     缺点:效率不如udp
    //udp  (无连接的传输协议)     优点:传输速度快         缺点:传输没有tcp可靠(丢包)
    //tcp的七层协议(七部分程序):传输字符串”hello、张三“   给张三同学
    //                                     甲公司     (甲董事长给乙董事长发公函)   乙公司
    //应用层   允许接入网络资料              甲董事长写了公函                        乙董事长读取公函
    //表示层   对数据进行转换、加密和压缩      公函装公文袋                           拆封公文袋
    //会话层   管理、终止会话              甲秘书通知乙秘书                          乙秘书收到公文袋
    //传输层   可靠的端到端的链接             公文袋给顺丰                             顺丰投递公文袋
    //网络层   从源端传到目的端             顺丰规划快递路线                          顺丰规划快递路线
    //数据链接路 节点到节点的传输             顺丰的中间节点传输快递                  顺丰的中间节点传输快递
    //物理层    传输比特                     公路上跑的快递车                     公路上跑的快递车

    //tcp怎么建立链接      怎么断开链接

    /**
     * 建立链接:tcp协议的三次握手
     * 第一步:客户端发送一个SYN包,进去SYN_SEND的状态                       相当于张三同学打电话的拨号
     * 第二步:服务器端收到SYN,确认SYN,再发送SYN+ACK,进入SYN_RECV状态        父母收到响铃,按下接听,说一句“喂”
     * 第三步:客户端收到SYN+ACK,向服务器发送ack的响应。服务器和客户端都进入链接   张三同学回答一句“喂”,开始正常通话
     */

    /**
     * 断开链接:tcp协议的四次挥手
     *
     */
    static Socket socket = null;
    //发送消息的线程
    //发送消息的线程
    private static class SendThread extends Thread {
        @Override
        public void run() {
            PrintStream p = null;//6
            try {
                p = new PrintStream(socket.getOutputStream());
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
                while (true) {
                    String strLine = bufferedReader.readLine();
                    p.println(strLine);//10
                    if ("byebye".equals(strLine)) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();//13
                System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //接收消息并显示的线程
    private static class RecvThread extends Thread {
        @Override
        public void run() {
            BufferedReader bufferedReader = null;//7
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while (true) {
                    String strLine = bufferedReader.readLine();
                    System.out.println(strLine);//9
                    if ("byebye".equals(strLine)) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
                System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(9000);//1
            System.out.println("服务器端等待建立链接");//2
            socket = serverSocket.accept();//block   //3
            System.out.println("链接已建立,读取数据");

            RecvThread recvThread = new RecvThread();
            recvThread.start();

            SendThread sendThread = new SendThread();
            sendThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面写了一个发送消息的线程,还有一个接收消息并显示的线程。

这是ServerCode,接下来要创建ClientCode,代码如下:

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 ClientCode {
    static Socket socket = null;
    //发送消息的线程
    private static class SendThread extends Thread {
        @Override
        public void run() {
            PrintStream p = null;//6
            try {
                p = new PrintStream(socket.getOutputStream());
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
                while (true) {
                    String strLine = bufferedReader.readLine();
                    p.println(strLine);//10
                    if ("byebye".equals(strLine)) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();//13
                System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //接收消息并显示的线程
    private static class RecvThread extends Thread {
        @Override
        public void run() {
            BufferedReader bufferedReader = null;//7
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while (true) {
                    String strLine = bufferedReader.readLine();
                    System.out.println(strLine);//9
                    if ("byebye".equals(strLine)) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
                System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            socket = new Socket("127.0.0.1", 9000);//4
            //BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            RecvThread recvThread = new RecvThread();
            recvThread.start();

            SendThread sendThread = new SendThread();
            sendThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是第二个程序,详细简答写在了代码注释中,这样就实现了一个简单的通讯程序了,当然,可以在区域网内连接对方的ip地址,快和小伙伴们一起玩起来吧。

#接下来有一篇用相关代码连接数据库,并进行相关增删改查的操作,敬请期待吧,希望本文对各位有所帮助,共同进步!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值