`

一个Socket通讯工具类

阅读更多
我在开发过程中自己写的程序代码,放这里供初学者大家参考,希望大家提出宝贵的意见:
package com.cc.pub;

import java.net.*;
import java.io.*;

/**
* Agent 、Client 的连接请求
*/
public class TcpConnector{

    private static final int DEF_TIME_OUT=30000;//缺省的超时时间
    private static final int DEF_WAT=32; //每次 sleep 时间(ms)

    private int    iMaxTime=0; //超时时间(ms);

    private Socket socket; //连接

    private java.io.DataInputStream in=null;   //从 Socket 中取得的数据输入流
    private java.io.DataOutputStream out=null; //从 Socket 中取得的数据输出流
    private String ip="";     //IP 地址
    private int iLocalPort=0;
    private int iRemotePort=0;

    public TcpConnector(Socket s){
        setTimeOut(DEF_TIME_OUT); //30 s
        socket=s;
        init();
    }

    public Socket getSocket(){
        return socket;
    }

    public String toString(){
        if(socket==null){
            return "Closed-Connect!";
        }
        return socket.toString();
    }

    public void setTimeOut(int i){
        iMaxTime=i;
    }

    public int getTimeOut(){
        return iMaxTime;
    }

    public int getLocalPort(){
        return iLocalPort;
    }

    public int getRemotePort(){
        return iRemotePort;
    }

    public boolean init(){
        if(in!=null) return true;
        boolean b=false;
        try{
            in  = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            InetAddress ia=socket.getInetAddress();
            ip = ia.getHostAddress();
            iLocalPort=socket.getLocalPort();
            iRemotePort=socket.getPort();
            b=true;
        }catch(Exception e){
            e.printStackTrace();
        }

        return b;
    }

    public String getIP(){
        return ip;
    }

    /**
     * 取得可以从输入流读取的字节数
     * 如果 -1 表示连接流出现问题
     */
    synchronized public int available(){
        if(socket==null){
            return -1;
        }
        int iLen=-1;
        try{
            iLen=in.available();
        }catch(Exception e){
            //e.printStackTrace();
        }
        return iLen;
    }

    /**
     * 从输入流读取指定字节长度的数据
     * @param iLen  数据长度
     * @return  读取的字节, 如为 null 表示读取过程可能发生异常
     */
    public byte[] read(int iLen){

        if(iLen<1) return null;
        byte []b=new byte[iLen];
        int iRead=read(b,0,iLen);

        if(iRead<1) return null;

        if(iRead<iLen){
            byte []br=new byte[iRead];
            System.arraycopy(b,0,br,0,iRead);
            return br;
        }
        return b;
    }

    /**
     * 从输入流读取指定字节长度的数据
     * @param b 数据 buffer
     * @param iFrom 存放数据起点
     * @param iLen  读取数据长度
     * @return  >=0 取得的数据字节数, -1 错误
     */
    synchronized public int read(byte []b,int iFrom,int iLen)
    {
        if(socket==null){
            return -1;
        }

        if(b==null || iLen<1 || iFrom<0 || b.length<iFrom+iLen){
            return 0;
        }

        int iGot=0;
        int iRead=0;
        int iTry=0;

        try{
            while( iRead<iLen && iGot>=0 && ( getTimeOut()>0 && iTry<getTimeOut() ) ){
                if(available()<0){
                    break;
                }
                iGot=0;
                if(available()>0){
                    iGot=in.read(b,iFrom+iRead,iLen-iRead);
                    if(iGot>0){
                       iRead+=iGot;
                    }
                }
                if(iGot==0){
                    try{
                        Thread.sleep(DEF_WAT);
                        iTry+=DEF_WAT;
                    }catch(Exception ee){}
                }else{
                    iTry+=1;
                }
            }
            return iRead;
        }catch(Exception e){
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 写数据到输出流
     * @param b 数据
     * @param iFrom 起始位置
     * @param iLen  数据长度
     * @return 0 写成功, -1 失败, 1 参数错误
     */
    synchronized public int write(byte[] b,int iFrom,int iLen){

        if(socket==null){
            System.out.print("---------null scoket--------");
            return -1;
        }
        try{
            if(b!=null && iFrom>=0 && iFrom+iLen<=b.length){
                out.write(b,iFrom,iLen);
                out.flush();
                return 0;
            }else{
                return 1;
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 写数据到输出流
     */
    public int write(byte[] b){
        return write(b,0,b.length);
    }

    public void close(){
        try{
            in.close();
        }catch(Exception e){
            //e.printStackTrace();
        }
        try{
            out.close();
        }catch(Exception e){
            //e.printStackTrace();
        }
        try{
            socket.close();
        }catch(Exception e){
            //e.printStackTrace();
        }
        socket=null;
    } 
}


有了上面的类,那么通讯会变得简单些,如:

Socket s=new Scoket(ip,port);
TcpConnector t=new TcpConnector();
byte []b="hello".getBytes();
t.write(b,0,b.length);
int len=t.read(b,0,1);//读取1个字节
//在读的方法中如果读不到数据,程序会 sleep 后再读,尽量的读到延时的数据,如果有更好的办法,请留言,谢谢!
分享到:
评论

相关推荐

    C#简易Socket通讯工具

    创建这样一个简易的Socket通讯工具,可以帮助开发者更好地理解网络通信过程,同时也可以作为实际项目开发中的基础模块。在实践中,还需要考虑更多的因素,比如多线程处理、错误恢复机制、数据编码解码等,以提升通信...

    一封装过的C#Socket通讯类

    这个封装过的C# Socket通讯类对于开发者来说,是一个宝贵的工具,它能够简化网络编程,提高开发效率,同时保持代码的可读性和可维护性。通过理解这些关键知识点,开发者可以更好地利用此类库,快速构建出可靠的网络...

    C#串口通讯和socket通讯demo

    在`CSharpPort`文件中,可能会有一个名为`SerialPortDemo`的项目或类,展示了如何配置串口参数(如波特率、数据位、停止位和校验位)并实现数据的发送与接收。 接下来,我们讨论Socket通讯。Socket是网络编程的基本...

    C# winform Socket 即时通讯

    一个Socket实例可以作为服务器端,监听来自客户端的连接请求,或者作为客户端,向服务器发起连接。 在"Chat_Demo_Server"项目中,你会看到服务器端的实现。服务器通常需要执行以下步骤: 1. 创建一个Socket实例,并...

    C# Socket通讯/TCP通讯,完整代码demo

    本示例提供了一个完整的C# Socket通讯/TCP通讯的代码demo,旨在帮助开发者理解和应用网络通信技术。 首先,我们要理解Socket的基本概念。Socket在计算机网络中扮演着桥梁的角色,它允许两台计算机通过网络进行数据...

    C# Socket通讯框架,封装了Client和Server端类库,带实例

    总之,这个C# Socket通讯框架为开发者提供了一个便利的工具,通过封装的类库和实例演示,降低了网络编程的门槛。无论是初学者还是有经验的开发者,都能从中获益,快速构建起可靠的网络通信系统。记得仔细研究提供的...

    C# SOCKET 通讯例子

    本篇文章将深入探讨C#中的Socket通信,并基于提供的标题和描述,解析一个简单的C# Socket通信实例。 首先,让我们了解Socket的基本概念。Socket是操作系统提供的接口,允许应用程序通过网络进行数据传输。在网络层...

    牛逼抓包工具 Socket通讯抓包

    1. **实时捕获**:实时监控网络中的Socket通信,记录每一个进出的数据包。 2. **协议解析**:支持多种网络协议,如TCP、UDP等,能详细解析数据包的头部信息和负载内容。 3. **过滤和筛选**:通过设定规则,只显示...

    bcb socket通讯实例

    **BCB Socket通讯实例详解** BCB,全称Borland C++ Builder,是一款由Borland公司开发的集成开发环境(IDE),它基于C++语言,并提供了丰富的VCL(Visual Component Library)组件库,使得开发者能够快速构建图形...

    Socket通讯调式工具(TCP&UDP;)

    Socket通讯调试工具是一种重要的开发和测试工具,尤其在进行网络编程时,无论是TCP还是UDP协议,都有着不可或缺的作用。本文将详细介绍此类工具的功能、用途以及如何使用它们来优化和调试网络应用。 首先,Socket是...

    简易Socket聊天工具

    在这个名为“简易Socket聊天工具”的项目中,我们可以通过Socket来构建一个简单的聊天环境,让客户端和服务器之间,以及客户端与客户端之间能够进行实时的信息交换。下面将详细介绍Socket通信的基础知识以及在聊天...

    Socket通讯包

    Socket通讯包是一个重要的编程工具,主要用于在客户端和服务器之间建立网络通信。Socket是TCP/IP协议族的一部分,提供了进程间通信(IPC)的能力,允许不同计算机上的应用程序通过网络进行数据交换。在本文中,我们...

    socket通讯框架例子

    Socket通讯框架是网络编程中的重要组成部分,特别是在C#开发中,它为开发者提供了低级别的网络通信接口,可以实现客户端与服务器之间的数据交换。本示例着重于如何利用Socket进行大文件传输、分页分包处理以及在高...

    C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)万能超好测试工具

    本教程将深入讲解如何利用C#开发一个通用的Socket测试工具,涵盖TCP和UDP协议,同时也提供了源代码供学习和参考。 首先,我们要理解TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)的基本...

    卫通星GPS定位器GT06协议socket通讯JAVA Spring Boot对接.zip

    在IT行业中,GPS定位器与后台系统的通讯是一个重要的应用场景,特别是在物联网(IoT)领域。本文将详细讨论“卫通星GPS定位器GT06”如何通过Socket通讯协议与Java Spring Boot应用程序进行对接,以及涉及的技术点。 ...

    delphi使用socket通讯例子-文件传输

    通过以上步骤,你可以在Delphi中实现一个基本的文件传输系统,而文件名称列表(socket)可能代表了实际项目中多个文件的传输需求。在实际应用中,你可能需要对这个基础进行扩展,例如支持多文件传输、进度显示、断点...

    C#的TCP异步SOCKET通讯类

    总结来说,C#的TCP异步SOCKET通讯类是开发网络应用程序的重要工具,通过利用异步编程和事件驱动,可以在不牺牲用户体验的情况下处理大量的网络请求。`TCPIPDemo`项目提供了一个实践平台,可以帮助开发者更好地理解和...

    flex C# 基于socket 通讯 应用程序源码

    在本示例中,"flex C# 基于socket 通讯 应用程序源码"描述了一个项目,该项目结合了这两种技术,通过Socket通信实现客户端和服务器端的数据交互。 Socket通信是网络编程的基础,它允许两个网络应用程序之间建立连接...

    Android用socket实现TCP通讯

    在实际应用中,我们通常会封装一个Socket通信的工具类,包含发送和接收数据的方法。例如,可以定义一个`send()`方法用于发送字符串数据,一个`recv()`方法用于接收服务器返回的字符串数据。为了保证数据的完整性和...

    socket-fram-work_C#_socket_实时通讯框架_

    总的来说,这个"C#_socket_实时通讯框架"是一个为开发者提供便捷、稳定的TCP长连接通讯能力的工具,它简化了底层网络编程的复杂性,使开发者能够更加专注于业务逻辑的实现。通过学习和使用这个框架,可以提升开发...

Global site tag (gtag.js) - Google Analytics