0 0

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

3个答案 按时间排序 按投票排序

0 0

采纳的答案

用字节流读取,不要用字符流读取

2012年8月13日 09:30
0 0

你的程序有点问题哈,看看百度出来的程序你就晓得了

2012年8月13日 11:15
0 0

1,修改为多线程

2,修改为nio

2012年8月13日 08:56

相关推荐

    基于tcp的简单聊天室代码

    4. **结束通信**:当客户端或服务器想要关闭连接时,它们会发送一个特殊信号(如“再见”或特定编码),另一方检测到这个信号后,关闭对应的线程和TCP连接。 在提供的压缩包文件`file_transfer`中,可能包含了实现...

    tcp协议,实现简易聊天

    4. 半关闭状态:当一方结束数据传输后,连接不会立即关闭,而是进入半关闭状态,直到另一方也确认结束。 总的来说,TCP协议在实现简易聊天应用中扮演着至关重要的角色,确保了信息的可靠传输。通过对TCP协议的理解...

    集合网上七款WPF使用TCP通讯操作程序,帮你从零基础到入门

    通过分析这些示例程序,你还可以学习如何在WPF中创建窗体、添加控件,以及如何将TCP通信的结果展示在UI上,例如使用TextBlock显示接收到的信息,或者使用ListView展示数据列表。 在学习过程中,标签中的"网络协议...

    基于tcp的socket编程

    - **半关闭状态**:TCP连接允许一方关闭写通道(即半关闭状态),但另一方仍能发送数据。需要正确处理这种情况,避免数据丢失。 - **超时和重传**:TCP提供重传机制,但在某些网络环境下可能需要设置超时和重传策略...

    最浓缩的基于TCP协议的网络通信详解

    ### 基于TCP协议的网络通信详解 #### 一、TCP协议简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的主要功能包括但不限于: - **可靠传输**...

    主机程序和客户端程序半双工通信.zip

    Socket是网络编程中的一个重要概念,它提供了进程间通信(IPC,Inter-Process Communication)的能力,允许两个运行在网络上的程序通过TCP/IP协议交换数据。在主机程序和客户端程序的通信中,通常主机作为服务器端,...

    JAVA Socket超时浅析.docx

    TCP连接需要经过SYN、SYN+ACK、ACK三个阶段,如果在这期间任何一方没有收到确认,TCP会进行重传,直到达到重传次数上限或者超时。Java中的Socket提供了`connect(SocketAddress endpoint, int timeout)`方法,允许...

    Software caused connection abort: recv failed

    - 此类异常多发生在非阻塞式或半双工通信模式下,其中一方关闭连接而另一方未知。 ### 解决方案与预防措施 1. **增强连接状态监测**:在进行数据接收前,应先检查`InputStream`的`available()`方法返回值。如果...

    FAQ-Socket.txt

    `EPROTO`错误通常发生在读取非阻塞套接字时,且套接字上没有可用数据。这可能是由于套接字尚未准备好进行读取操作。 #### 2.11 如何强制套接字发送缓冲区中的数据? 可以通过调用`send()`或`write()`函数来发送...

    基于Socket的点对点文件传输

    在这个程序中,描述中提到的“阻塞通讯方式”是指当一方发送数据后,必须等待对方确认收到数据才会继续执行下一行代码。这种方式在低延迟、高可靠性要求的场景下很常见,因为它确保了数据的正确传输。然而,这也意味...

    socket 最基础的客户端 服务器 适合初学者

    在程序中,注释对每个函数的作用进行了详细解释,这对于初学者理解Socket的工作原理非常有帮助。例如,`send()`函数用于发送数据到对方,而`recv()`函数则用于接收数据。 3. **数据传输**: - 在双方建立连接后,...

    android实时图片传输

    在图片传输过程中,一方作为服务器监听特定端口,另一方作为客户端发起连接请求,建立连接后,数据(这里是图片)就可以通过Socket通道进行双向传输。 在Android中,由于安全性和权限限制,我们通常需要在服务...

    java socket nio 研究

    Socket提供了InputStream和OutputStream,用于读写数据,但它们都是阻塞式的,即当一方没有准备好数据时,另一方会等待,直到数据准备好为止。 NIO(Non-blocking I/O)在Java 1.4版本引入,与传统的 Blocking I/O ...

    UDP_Model.rar

    在client1与client2的通信中,一方会作为发送者,将消息发送到另一方的IP和端口。 5. **接收数据**:通过`readyRead()`信号来检测是否有新的数据报到达。当有数据报时,可以使用`readDatagram()`方法读取并处理。 ...

    mina双向通信已测试

    当一方发送数据时,另一方可以通过监听`IoSession`上的事件来接收数据,并进行相应的处理。 **项目结构与运行环境** 该项目使用MyEclipse作为集成开发环境,Tomcat7.0作为应用服务器。MyEclipse提供了便捷的Java...

    erlang 深度分析

    - **高效利用硬件资源**: 在多核处理器上能够充分利用硬件资源。 - **简化并发编程**: 开发者无需关心具体的并行细节。 #### 14. Erlang分布式核心技术浅析 - **关键技术**: - **节点间通信**: 通过分布协议实现...

Global site tag (gtag.js) - Google Analytics