-
TCP程序阻塞在读取另一方信息的代码上10
问题在客户端代码中( instr=reader.readLine(); //阻塞在这一行代码上!!)
请教各位有经验的熟手们,最好能带修改后的代码和解释!不甚感激,新手致~
/***************
服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class SeverSocketTest {
public static void main(String[] args){
ServerSocket ss;
try {
ss = new ServerSocket(64440);
System.out.println("服务器已在监听");
Socket s = ss.accept();
InputStream in=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
OutputStream out=s.getOutputStream();
PrintWriter writer=new PrintWriter(out);
BufferedReader selfReader=new BufferedReader(new InputStreamReader(System.in));
String instr;
String outstr;
do{
System.out.printf("server:");
outstr=selfReader.readLine();
writer.write(outstr);
writer.flush();//强制输出,即发送消息
System.out.println("clint:");
instr= reader.readLine();
System.out.println(instr);
}
while(!outstr.contentEquals("bye"));
reader.close();
selfReader.close();
writer.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/****************************
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class SocketTest {
public static void main(String[] args){
try { InetAddress addr = null;
addr = InetAddress.getByAddress(new byte[]{127,0,0,1});
Socket s=new Socket(addr,64440);
InputStream in=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
OutputStream out=s.getOutputStream();
PrintWriter writer=new PrintWriter(out);
BufferedReader selfReader=new BufferedReader(new InputStreamReader(System.in));
String outstr;
String instr;
do{
System.out.println("server:");
instr=reader.readLine(); //阻塞在这一行代码上!!
System.out.println(instr);
System.out.printf("clint:");
outstr=selfReader.readLine();
writer.write(outstr);
writer.flush();//强制输出,即发送消息
} while(!outstr.contentEquals("bye"));
reader.close();
selfReader.close();
writer.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}2012年8月13日 01:38
相关推荐
4. **结束通信**:当客户端或服务器想要关闭连接时,它们会发送一个特殊信号(如“再见”或特定编码),另一方检测到这个信号后,关闭对应的线程和TCP连接。 在提供的压缩包文件`file_transfer`中,可能包含了实现...
4. 半关闭状态:当一方结束数据传输后,连接不会立即关闭,而是进入半关闭状态,直到另一方也确认结束。 总的来说,TCP协议在实现简易聊天应用中扮演着至关重要的角色,确保了信息的可靠传输。通过对TCP协议的理解...
通过分析这些示例程序,你还可以学习如何在WPF中创建窗体、添加控件,以及如何将TCP通信的结果展示在UI上,例如使用TextBlock显示接收到的信息,或者使用ListView展示数据列表。 在学习过程中,标签中的"网络协议...
- **半关闭状态**:TCP连接允许一方关闭写通道(即半关闭状态),但另一方仍能发送数据。需要正确处理这种情况,避免数据丢失。 - **超时和重传**:TCP提供重传机制,但在某些网络环境下可能需要设置超时和重传策略...
### 基于TCP协议的网络通信详解 #### 一、TCP协议简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的主要功能包括但不限于: - **可靠传输**...
Socket是网络编程中的一个重要概念,它提供了进程间通信(IPC,Inter-Process Communication)的能力,允许两个运行在网络上的程序通过TCP/IP协议交换数据。在主机程序和客户端程序的通信中,通常主机作为服务器端,...
TCP连接需要经过SYN、SYN+ACK、ACK三个阶段,如果在这期间任何一方没有收到确认,TCP会进行重传,直到达到重传次数上限或者超时。Java中的Socket提供了`connect(SocketAddress endpoint, int timeout)`方法,允许...
- 此类异常多发生在非阻塞式或半双工通信模式下,其中一方关闭连接而另一方未知。 ### 解决方案与预防措施 1. **增强连接状态监测**:在进行数据接收前,应先检查`InputStream`的`available()`方法返回值。如果...
`EPROTO`错误通常发生在读取非阻塞套接字时,且套接字上没有可用数据。这可能是由于套接字尚未准备好进行读取操作。 #### 2.11 如何强制套接字发送缓冲区中的数据? 可以通过调用`send()`或`write()`函数来发送...
在这个程序中,描述中提到的“阻塞通讯方式”是指当一方发送数据后,必须等待对方确认收到数据才会继续执行下一行代码。这种方式在低延迟、高可靠性要求的场景下很常见,因为它确保了数据的正确传输。然而,这也意味...
在程序中,注释对每个函数的作用进行了详细解释,这对于初学者理解Socket的工作原理非常有帮助。例如,`send()`函数用于发送数据到对方,而`recv()`函数则用于接收数据。 3. **数据传输**: - 在双方建立连接后,...
在图片传输过程中,一方作为服务器监听特定端口,另一方作为客户端发起连接请求,建立连接后,数据(这里是图片)就可以通过Socket通道进行双向传输。 在Android中,由于安全性和权限限制,我们通常需要在服务...
Socket提供了InputStream和OutputStream,用于读写数据,但它们都是阻塞式的,即当一方没有准备好数据时,另一方会等待,直到数据准备好为止。 NIO(Non-blocking I/O)在Java 1.4版本引入,与传统的 Blocking I/O ...
在client1与client2的通信中,一方会作为发送者,将消息发送到另一方的IP和端口。 5. **接收数据**:通过`readyRead()`信号来检测是否有新的数据报到达。当有数据报时,可以使用`readDatagram()`方法读取并处理。 ...
当一方发送数据时,另一方可以通过监听`IoSession`上的事件来接收数据,并进行相应的处理。 **项目结构与运行环境** 该项目使用MyEclipse作为集成开发环境,Tomcat7.0作为应用服务器。MyEclipse提供了便捷的Java...
- **高效利用硬件资源**: 在多核处理器上能够充分利用硬件资源。 - **简化并发编程**: 开发者无需关心具体的并行细节。 #### 14. Erlang分布式核心技术浅析 - **关键技术**: - **节点间通信**: 通过分布协议实现...