Socket编程,为啥客户端无法接收来自服务器的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket编程,为啥客户端无法接收来自服务器的数据?相关的知识,希望对你有一定的参考价值。

参考技术A 如题,我写了段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) Clientimport 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) 这行,不知道是哪个环节理解或处理错了,还望大家指点指点!即使不关闭连接,也是取不到数据,看了下其它类似的提问,问题在于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()又一直在那读取,所以就阻塞了!本回答被提问者采纳

如何在 Actionscript 3 中接收来自 Socket 的命令?

【中文标题】如何在 Actionscript 3 中接收来自 Socket 的命令?【英文标题】:How to receive commands from Socket in Actionscript 3? 【发布时间】:2013-06-22 20:03:23 【问题描述】:

我终于设法让服务器正常工作(在玩了 2 天 java lol 之后),所以我可以使用套接字连接它。 但困扰我的是,假设我使用这些套接字将两个客户端都连接到服务器 如何发送命令,例如从一个客户端向另一个客户端发起攻击?

我希望你明白我的意思,哈哈:/ PS:我用java做服务端,as3做客户端

无论如何提前谢谢...

【问题讨论】:

基本上我相信您需要研究 Java 中的线程之间的通信,以便将数据从一个线程传递到另一个线程。 ***.com/questions/2816005/… 当数据被发送到服务器时(除了正在广播的客户端),您需要更新所有客户端以进行一些多人操作。我相信通常使用 UDP 而不是 TCP 是因为它的速度,尽管对于快节奏的多人游戏缺乏可靠性。 好吧,我使用的是 Actionscript 3,而不是 java :/ 在您的问题中听起来您使用的是 AS3 客户端和 Java 服务器端。客户端 (AS3) 需要向服务器 (Java) 发送数据,然后服务器 (Java) 需要将该数据传递给另一个客户端 (AS3)。如果您正在做某种 P2P 客户端的事情,那么您的问题并不清楚。本质上,您需要让 Java 充当数据从一个客户端到另一个客户端的“桥梁”,否则它们无法进行通信。只是为了让您知道 Socket 类在我所知道的移动设备上不受支持,因此如果您想要移动设备,则必须推出自己的 ANE。 不,我正在尝试创建的游戏与移动设备无关 是的,所以我最初说的是在服务器端(Java)你将有两个线程运行(两个客户端),一个处理每个客户端套接字连接,那么你只需要能够在这些线程之间进行通信。如果您需要更多帮助,您必须展示您正在尝试使用的代码,以及将 AS3 套接字连接到 Java 的部分以及相同的 Java 端。 【参考方案1】:

您需要添加 BlazeDS(有点过时)或 GraniteDS(更新,我认为效果更好),我确实认为 BlazeDS 更容易上手。

它们都基于使用 java webservlet 和 actionscripts AMF 格式来允许与 flash/actionscript 客户端通信。

另一种选择是使用某种形式的 C/C++/C# 来实际谈论二进制。如果您想创建自己的协议,这是非常有效的。另一方面,这意味着更多的工作:)。

【讨论】:

以上是关于Socket编程,为啥客户端无法接收来自服务器的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Socket 编程——recv() 无法获取所有数据

socket tcp/ip 之简单ssh协议

如何在 Actionscript 3 中接收来自 Socket 的命令?

socket编程学

为啥我的socket接收大数据的时候接收不完全

为啥我无法在 Android 设备上接收来自 GCM 的消息