Socket编程

一、Java网络编程基础知识

       1、两台计算机间进行通讯需要以下三个条件:

1)、 IP地址(例如 : 192.168.1.1)

2)、 协议(服务端与客户端之间双方自行协商定义协议,简称自定义协议)

3)、 端口号(例如 : 8888)

2、TCP/IP协议:

是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈

TCP:Transmission Control Protocol 传输控制协议

IP:Internet Protocol 互联网协议

3、TCP/IP五层模型

应用层:HTTP、FTP、SMTP、Telnet等

传输层:TCP/IP

网络层:

数据链路层:

物理层:网线、双绞线、网卡等

4、IP地址

为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识---IP地址。

32位二进制

5、端口

区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。

如:HTTP:80  FTP:21 Telnet:23

IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础

6、Socket套接字:

网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。

Socket原理机制:

通信的两端都有Socket

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

7、Java中的网络支持

针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:

InetAddress:用于标识网络上的硬件资源,主要是IP地址

URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据

Sockets:使用TCP协议实现的网络通信Socket相关的类

Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。

二、TCP编程

1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低

2、Java中基于TCP协议实现网络通信的类

客户端的Socket类

服务器端的ServerSocket类

3、通信步骤

                 ① 服务端创建ServerSocket和Socket   客户端创建Socket

服务端: ServerSocket ss = new ServerSocket(PORT);  //

Socket s = ss.accept();

客户端: Socket clientSocket = new Socket(IP,PORT);

                 ② 打开连接到Socket的输入/输出流

InputStream in = server.getInputStream(); 
                  OutputStream out = server.getOutputStream();

                 ③ 按照协议对Socket进行读/写操作

                 ④ 关闭输入输出流、关闭Socket

                  in.close();

out.close();

三、服务端

public class ServerSocketDemo {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9988);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String info = null;while ((info = br.readLine()) != null) {System.out.println("我是服务器,客户端说:" + info);}socket.shutdownInput();// 关闭输入流// 4、获取输出流,响应客户端的请求OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os);pw.write("欢迎您!");pw.flush();// 5、关闭资源pw.close();os.close();br.close();isr.close();is.close();socket.close();serverSocket.close();}

}

四、客户端

1、创建一个单例Socket管理类·

public class SocketManager {

private static final String TAG = "SocketManager";
    public static Socket clientSocket = null;
    private int PORT;     //端口号
    private String IP;

/**
     * 端口
     */

public static SocketManager instance = new SocketManager();

private SocketManager() {
        clientSocket = connect();
    }

public static SocketManager getInstance() {
        return instance;
    }

public static Socket getClientSocket() {
        return clientSocket;
    }

public static void setClientSocket(Socket socket){
        clientSocket = socket;
    }

/**
     * 获取当前socket实例
     */
    public Socket connect() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    clientSocket = new Socket(IP,PORT);
                    setClientSocket(clientSocket);
                    readSocketData(clientSocket);
                    //sendHeartBeat(clientSocket);
                    LogUtils.e("TAG","连接成功...");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return clientSocket;
    }

/**
     * 发送心跳包

* ThreadPoolManager.getSingleInstance().execute()   线程管理类
     * */
    public void sendHeartBeat(Socket socket){
        ThreadPoolManager.getSingleInstance().execute(new SendData(socket));
    }

/**
     * 接收服务端数据
     * */
    public void readSocketData(Socket socket){
        ThreadPoolManager.getSingleInstance().execute(new ReceiveData(socket));
    }

/**
     * 断开连接
     */
    public void disConnect() throws IOException {
        if (clientSocket != null) {
            clientSocket.close();
            clientSocket = null;
        }
    }

/**
     * 释放单例, 及其所引用的资源
     */
    public void release() throws IOException {
        if (instance != null) {
            if (clientSocket != null) {
                clientSocket.close();
                clientSocket = null;
            }
            instance = null;
        }
    }
}

2、创建一个SendData线程类来负责发送数据

public class SendData implements Runnable {
    private Socket sendsocket;
    private PrintWriter printWriter = null;

public SendData(Socket socket) {
        this.sendsocket = socket;
    }

public void run() {
        Socket socket = SocketManager.getClientSocket();
        try {
            LogUtils.e("TAG", "发送的数据包:" + JsonUtil.getData());
           sendHeartBeatPackage(socket, "要发送的数据");//数据包
        } catch (JSONException e) {
            e.printStackTrace();
        }

}

/**
     * 发送数据包到服务端
     */
    public int sendHeartBeatPackage(Socket socket1, String msg) {
        int returnCode = 0;
        if (socket1.isClosed() || socket1 == null) {
            returnCode = 0;
        }
        try {
            printWriter = new PrintWriter(socket1.getOutputStream());
            printWriter.println(msg);
            printWriter.flush();
            socket1.getOutputStream().flush();
            returnCode = 1;
        } catch (Exception e) {
            returnCode = 0;
        }
        return returnCode;
    }
}

3、创建一个ReceiveData接收线程类

public class ReceiveData implements Runnable {
    private Socket socket = null;
    private byte[] buffer = new byte[1024];
    private int bytes;
    InputStream mmInStream = null;

public ReceiveData(Socket mSocket) {
        this.socket = mSocket;
    }

@Override
    public void run() {
        try {
            mmInStream = socket.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            try {
                if ((bytes = mmInStream.read(buffer)) > 0) {
                    byte[] buf_data = new byte[bytes];
                    for (int i = 0; i < bytes; i++) {
                        buf_data[i] = buffer[i];
                    }
                    String msg = new String(buf_data);
                    LogUtils.e("TAG", "来自服务端的数据:" + msg);
                }
            } catch (IOException e) {
                try {
                    mmInStream.close();
                    LogUtils.e("TAG", "读取出现异常...");
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                break;
            }
        }
    }
}

五、未完待续。。。

有疑问可直接提问博主,文中可能存在讲解不到之处,望大家谅解,也可对博主指出不到之处,之后进行改正。

Android 客户端Socket 与 Java服务端ServerSocket相关推荐

  1. Socket实现java服务端与AndroidApp端数据交互

    在这里主要想实现服务端向App端推送消息,所以采用了Socket. java端: 第一步:创建ServerSocketManager.java类,这个类是针对客户端和App端的连接和断开进行监听,读取 ...

  2. android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)

    一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...

  3. bsdiff php,Apk差分升级Android客户端和Node.js服务端实现

    核心的内容是bsdiff和bspatch 源码根目录/bootable/recovery/applypatch下找到,bsdiff官网同样也是可以的,编出来的二进制文件可以在源码根目录out/host ...

  4. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  5. java服务端与Android客户端使用 websocket 通信

    最近因为项目需要所以得使用 websocket 来进行服务器与客户端的通信.使用java 来实现服务端,Android 实现客户端. 刚开始服务端使用 @ServerEndPoint 注解来实现 We ...

  6. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

  7. QtJava笔记-Qt与Java进行SSL双向认证(Qt客户端,Java服务端)

    这里使用Java作为服务端,使用Qt作为客户端. 程序运行截图如下: 这里的证书Qt使用的p12,Java使用的jks,看以前的博文生成. 源码打包下载地址: https://github.com/f ...

  8. java的io安卓能用吗_阳光沙滩-用java写了一个Socket.IO的服务端,可是用安卓一直连接不上怎么办;...

    在IDEA里面分别写了服务端(Server)和客户端(Client),用localhost可以互相连接成功,发送信息.但是,我在安卓里面写服务端,就一直连接不上,提示连接失败 IDEA java服务端 ...

  9. Android作为客户端,PC作为服务端:实现网络通信

    此项目实现网络通信,android手机客户端去请求PC服务端,将PC上mysql中的数据显示在手机上. PC服务端用JavaWeb写了个servlet,android手机客户端请求这个servlet, ...

最新文章

  1. java_web学习(8)会话与状态管
  2. MATLAB实战应用案例:欧拉法、改进欧拉法、ode45求解微分方程实例
  3. STM32 软件重启导致死机的情况分析
  4. CentOS关机大法之shutdown命令格式
  5. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
  6. 我的老板给我推送了这篇文章,之后我成为了顶级码农!
  7. java1.8移除apt,java 1.8上的maven-enunciate-plugin现在从最新的JDK中删除了(即java注释处理工具)...
  8. RxJS修炼之 用弹珠测试学习RxJS
  9. 拥塞控制,图文并茂(挺丰富,借鉴较多大佬的思想)
  10. 51单片机控制电机正反转
  11. 电脑连接的手机真机,利用Chrome调试WebView
  12. Dataset之LFW:LFW人脸数据库的简介、安装、使用方法之详细攻略
  13. idea配置阿里格式化模板+注释模板
  14. 公司研制的CPU卡燃气表正式投放北京市场
  15. pyspark LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java科研信息管理503pp
  17. openCV图片倾斜矫正(java版)
  18. 【2021知识蒸馏】Show, Attend and Distill:Knowledge Distillation via Attention-based Feature Matching
  19. java设置excel行间距_java用POI设置Excel的列宽
  20. 全球及中国ICP-OES光谱仪行业产销需求与投资前景预测报告2022~2027年

热门文章

  1. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
  2. 《自然-机器智能》:神经形态技术可使大型深度学习网络节能16倍
  3. 为什么你对时间的颗粒度越来越大。
  4. Key exchange was not finished,connection is closed近期遇到这个错误sshd更新导致的
  5. CyclicBarrier---JDK1.8源码分析
  6. 目标检测——RCNN与YOLO系列
  7. 计算机应用基础素材,计算机应用基础(Windows XP+Office 2003)、素材和习题答案-王向慧 计算机应用基础...
  8. vlookup多项匹配_VLOOKUP函数一对多查找,就是这么简单!
  9. Sketch基础学习
  10. unittest之TestSuite类详解