SocketConnection 参数详细介绍

本文探讨了解决SocketConnection在Java ME环境下读取数据时出现的阻塞问题。通过设置Socket选项和引入定时器机制来实现超时处理,确保在网络连接不稳定时能够及时响应并继续执行后续操作。

请大家看下面的代码: 
len = is.read(gData); 
这句代码会阻塞在这里,用了上面红色标出的代码后,能不能实现,超过5秒没反应后,read就不阻塞,而向下执行代码!  
try 

int len = 0; 
    sc = (SocketConnection) Connector.open("socket://100.42.25.3:885"); 
    is = sc.openInputStream(); 
    os = sc.openOutputStream(); 
    sc.setSocketOption(SocketConnection.LINGER, 5); 
    pmm.gDataBuf = null; 
    sender = new Sender(os); 
    sender.send(pmm.gStringReq); 
    // Loop forever, receiving data 
    gData = new byte[pmm.BUF_LENGTH]; 
    currentIndex = 0; 
    gBuf = new byte[50*1024]; 
    while (!pmm.bStopConnect) 
    { 
len = is.read(gData); 
    System.arraycopy(gData,0,gBuf,currentIndex,len); 
    currentIndex += len; 
    if(currentIndex > 300){ 
    if(newVerifyXml()){ 
    if((currentIndex%8) != 0){ 
    int left = 8 - currentIndex%8; 
    byte[] byteTmp = new byte[left]; 
    is.read(byteTmp); 

    opHandle();currentIndex=0; 
    } 
    } 
    } 
    stop(); 
} catch (ConnectionNotFoundException cnfe) { 
    Alert a = new Alert("错误", "无法连接服务器", null, AlertType.ERROR); 
    a.setTimeout(Alert.FOREVER); 
    display.setCurrent(a) ; 
} catch (IOException ioe) { 
    if (!stop) { 
ioe.printStackTrace(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
实现不了吧, 你弄个timer吧。 超时就把所有object 设置为null
 
SocketConnection.DELAY:开启Nagle算法?(0/1) 
SocketConnection.LINGER:服务器悬挂等待时间 
SocketConnection.KEEPALIVE:长连接时间 
SocketConnection.RCVBUF:接收缓冲 
SocketConnection.SNDBUF:发送缓冲 

不过虚拟机上可能支持的不好,或者不保证每次都准确 
建议使用定时器 
超时就把该关流,连接的全关了 
再置null
<think>嗯,用户要求用中文回答,最后还要提3-5个相关问题,格式必须严格遵循要求。用户想了解socket详细介绍,这是个网络编程的基础概念。 用户可能是开发者或学生,想系统理解socket原理。ta特意强调格式,说明需要结构化输出,可能用于学习笔记或教学场景。深层需求或许是掌握实际应用而非纯理论。 关于socket,需要覆盖这些要点:定义(进程通信端点)、核心功能(跨网络数据传输)、分层位置(应用层与传输层接口)、关键要素(IP+端口+协议)。还要区分TCP/UDP的特性差异,因为这是实际编程的关键考量。 示例代码选Python的TCP服务端/客户端,因为Python更通用。UDP示例也重要,但篇幅有限先展示基础交互。必须强调socket是操作系统提供的API抽象,这点常被初学者忽略。 最后的问题要围绕知识延伸:阻塞机制是性能关键,多路复用解决并发瓶颈,协议选择影响应用设计,异常处理决定系统健壮性,这些都能帮用户深化理解。特别注意第一个问题必须用"§§相关问题§§"开头且不换行。</think>Socket(套接字)是网络通信的核心编程接口,允许不同主机上的进程进行数据交换。它本质上是操作系统提供的**通信端点**,通过IP地址、端口号和传输协议(TCP/UDP)的组合唯一标识一个网络连接。 ### 核心概念与工作原理 1. **通信端点**: * 进程通过创建 Socket 来获得一个网络通信的入口/出口。 * 每个 Socket 绑定到一个特定的**传输协议**(TCP 或 UDP)和一个**端口号**。 2. **寻址**: * **IP地址**:标识网络中的主机。 * **端口号**:标识主机上的特定进程或服务(范围 0-65535)。 * Socket 地址 = IP地址 + 端口号。 3. **协议**: * **TCP (Transmission Control Protocol)**: * 面向连接:通信前需建立可靠连接(三次握手)。 * 可靠传输:保证数据顺序、无差错、不丢失、不重复。 * 流式传输:数据被视为无结构的字节流。 * 适用场景:文件传输、网页浏览、邮件等需要高可靠性的应用。 * **UDP (User Datagram Protocol)**: * 无连接:直接发送数据,无需预先建立连接。 * 不可靠传输:不保证顺序、可能丢失或重复。 * 数据报传输:数据以独立报文(Datagram)形式发送。 * 高效、低延迟:开销小,速度快。 * 适用场景:实时音视频、在线游戏、DNS查询等容忍少量丢失但对延迟敏感的应用。 4. **通信模型**: * **面向连接 (TCP)**: 1. **服务端**:创建 Socket -> 绑定 IP 和端口 (`bind`) -> 监听连接 (`listen`) -> 接受连接 (`accept`) -> 读写数据 (`send`/`recv`) -> 关闭连接。 2. **客户端**:创建 Socket -> 连接服务端 (`connect`) -> 读写数据 (`send`/`recv`) -> 关闭连接。 * **无连接 (UDP)**: 1. **服务端**:创建 Socket -> 绑定 IP 和端口 (`bind`) -> 接收数据 (`recvfrom`) -> 发送数据 (`sendto`)。 2. **客户端**:创建 Socket -> 发送数据 (`sendto`) -> 接收数据 (`recvfrom`)。无需显式连接。 ### 关键 Socket API 函数 (通用概念) * `socket()`:创建新的 Socket 对象。 * `bind()` (服务端常用):将 Socket 绑定到特定的本地 IP 地址和端口。 * `listen()` (TCP 服务端):开始监听传入的连接请求。 * `accept()` (TCP 服务端):接受一个传入的连接,返回一个用于通信的新 Socket。 * `connect()` (TCP 客户端):发起连接到远程服务端。 * `send()` / `write()`:发送数据 (TCP 或 已连接的 UDP)。 * `recv()` / `read()`:接收数据 (TCP 或 已连接的 UDP)。 * `sendto()`:发送数据到指定地址 (UDP 主要使用)。 * `recvfrom()`:接收数据并获取发送方地址 (UDP 主要使用)。 * `close()` / `shutdown()`:关闭 Socket。 ### Python TCP Socket 示例 **服务端 (server.py)**: ```python import socket # 1. 创建 TCP Socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定地址和端口 server_socket.bind(('0.0.0.0', 12345)) # 3. 开始监听 (设置最大等待连接数) server_socket.listen(5) print("Server listening on port 12345...") while True: # 4. 接受客户端连接 client_socket, client_addr = server_socket.accept() print(f"Accepted connection from {client_addr}") # 5. 接收数据 data = client_socket.recv(1024) print(f"Received: {data.decode('utf-8')}") # 6. 发送响应 client_socket.sendall(b"Hello from server!") # 7. 关闭客户端连接 client_socket.close() ``` **客户端 (client.py)**: ```python import socket # 1. 创建 TCP Socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 连接到服务器 client_socket.connect(('127.0.0.1', 12345)) # 3. 发送数据 client_socket.sendall(b"Hello from client!") # 4. 接收响应 data = client_socket.recv(1024) print(f"Received: {data.decode('utf-8')}") # 5. 关闭连接 client_socket.close() ``` ### 重要特性 * **阻塞 vs 非阻塞 I/O**:默认 Socket 操作是阻塞的(调用函数会等待操作完成)。可设置为非阻塞模式,函数立即返回,需配合轮询或事件通知机制(如 `select`, `poll`, `epoll`, `kqueue`)。 * **多路复用**:使用 `select`, `poll`, `epoll` 等机制,单个线程可同时监控多个 Socket 的状态(可读、可写、异常),提高并发效率。 * **Socket 选项**:可通过 `setsockopt()` 设置各种参数(如超时、地址重用、缓冲区大小)。 * **域名解析**:`gethostbyname()`, `getaddrinfo()` 等函数用于将主机名解析为 IP 地址。 **总结**:Socket 是网络编程的基石,它抽象了底层网络协议的复杂性,为开发者提供了在不同主机进程间建立通信通道的标准方法。理解 TCP 和 UDP 的区别以及 Socket API 的工作流程是构建网络应用的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值