supersocke接收不到数据_Socket编程,为什么客户端无法接收来自服务器的数据?...

本文描述了一个Java Socket编程的问题,即服务器能够接收到客户端数据,但客户端无法接收到服务器的回应。问题出现在客户端的readLine()方法上,该方法导致阻塞。解决方案包括:在关闭读取之前确保所有数据已传输,并在数据传输完成后发送结束标记,或者调整读写操作的顺序,避免两者互相等待导致的阻塞。
摘要由CSDN通过智能技术生成

如题,我写了段Socket服务器\客户端通讯的程序,服务端能接收到客户端的数据,但是客户端就无法接收到服务端传回的数据,代码如下

Server端

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

/**

* @author Think

*

*/

public class SocketServer {

/**

* @param args

*/

public static void main(String[] args) {

new SocketServer().start();

}

public void start(){

try {

ServerSocket server = new ServerSocket(10086);

while(true){

System.out.println("Waiting for a client...");

Socket client = server.accept();

new SocketServerThread(client).start();

}

} catch (IOException e) {

e.printStackTrace();

}

}

class SocketServerThread extends Thread{

Socket client = null;

public SocketServerThread(Socket client){

this.client = client;

}

@Override

public void run(){

try {

// 得到CLIENT的输入流,从输入流出取出传输的数据

BufferedReader reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream()));

String line = null;

System.out.print("from client message:");

while((line = reader_from_client.readLine()) != null){

System.out.println(line);

}

// 得到CLIENT端的输入流,通过向CLIENT传输数据

PrintWriter writer_to_client = new PrintWriter(client.getOutputStream());

writer_to_client.println("Ok");

writer_to_client.flush();

reader_from_client.close();

writer_to_client.close();

client.close();

} catch (IOException e) {

}

}

}

}

Client

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;

/**

* @author Think

*

*/

public class SocketClient {

/**

* @param args

*/

public static void main(String[] args) {

try {

Socket remoteServer = new Socket(InetAddress.getLocalHost(), 10086);

// 得到SERVER端SOCKET的输出流,通过向输出流写入数据,与SERVER进行通信

PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true);

write_to_server.write("Hello, what's you name?");

write_to_server.flush();

// 把下面这几行放开,SERVER端就收不到数据了,一直处于阻塞状态

// 得到SERVER端的输出流,从输出流中读取从SERVER传递来的数据

//BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream()));

//String line = null;

//while((line = reader_from_server.readLine()) != null){

//System.out.println(line);

//}

//reader_from_server.close();

write_to_server.close();

remoteServer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

如果Client中的说明,只要是Client中放开了

BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream()));

String line = null;

while((line = reader_from_server.readLine()) != null){

System.out.println(line);

}

reader_from_server.close();

这段代码,SERVER就阻塞在

while((line = reader_from_client.readLine()) != null){

这行,不知道是哪个环节理解或处理错了,还望大家指点指点!

问题补充:

jkxydp 写道

你客户端发送了消息之后就把连接关闭了还怎么接收服务端的消息?

谢谢你的关注!

即使不关闭连接,也是取不到数据,看了下其它类似的提问,问题在于readLine()会导致阻塞,还在摸索解决的办法!

问题补充:

wgy_superpower 写道

第一:Socket编程时,永远不要在关闭写(writer)之前关闭读(reader)

第二:不管是客户端还是服务端在通过Socket读取数据的时候,在你的数据传输完成后,发送一个结束标记(比如:end),这样在你的 while循环里面判断一下数据是否已经传输完毕,完毕后跳出循环,否则由于你的程序就会一直阻塞在 readLine()这里,因为你的 socket还没有断开,会一直等待你写数据。

你说的有道理,经过后来的试验,确实是因为readLine()一直等待着客户端的输入,但此时客户端也在等待服务端的返回,所以导致两边都在那等待,就阻塞了。

一句话就是,一直【等待写数据】,但又没有数据写入,所以就卡住了。

问题补充:

anranran 写道

SocketServer :  while((line = reader_from_client.readLine()) != null)

这个在socket没有关闭的时候是无法输出来的。

所以Server do not send any data to client

嗯,也有道理,但主要不是socket没有关闭,而是没有向流中写数据,而readLine()又一直在那读取,所以就阻塞了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值