java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...

使用Java从客户端套接字读取数据(Read data from a client socket in Java)

我编写了从客户端套接字发送/接收数据的代码。 发送数据步骤已成功完成,但是当我想从套接字读取数据时, readLine()方法阻止程序,而没有要读取的数据。

这是我的代码:

StringBuffer document = new StringBuffer();

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;

while ((line = reader.readLine()) != null)

document.append(line + "\n");

reader.close()

感谢所有我可以读取所有收到的数据,但readLine或read(byte [],int,int)方法在没有数据要读取时阻塞程序,而此方法必须在此时返回null / -1。

I have written the code for sending/receiving data from a client socket. The sending data step has been done successfully, but when I want to read the data from a socket, the readLine() method block program while there isn't data to be read.

This is my code:

StringBuffer document = new StringBuffer();

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;

while ((line = reader.readLine()) != null)

document.append(line + "\n");

reader.close()

thanks all I can read all received data, but readLine or read(byte[], int, int) methods block program when there is no data to read, while this method must return null/-1 in this time.

原文:https://stackoverflow.com/questions/11390847

2020-07-15 21:07

满意答案

那是因为readLine()函数是一个阻塞调用,所以当然它会阻塞。

为了更具建设性,对readLine()类的方法的调用应该在一个单独的线程中,这样阻塞调用不会影响代码的其余部分。 从正在阅读的类中,我建议创建一个纯粹用于控制从套接字读取的线程。

我将传递对创建类的引用,以便如果线程接收信息,父类可以使用它。

That's because the readLine() function is a blocking call, so of course it's going to block.

To be more constructive, calls to methods like readLine() should be in a separate thread so that the blocking call does not affect the rest of your code. From the class which is reading, I would recommend creating a thread purely to control reading from the socket.

I would pass a reference to the creating class so that if the thread receives information, the parent class can use it.

2012-07-11

相关问答

in.readLine()在看到行终止符之前不会返回。 除非PHP中的socket_write隐式添加行终止符,否则您需要自己执行此操作,以便Java端看到您编写了完整的文本行。 in.readLine() won't return until it sees a line terminator. Unless socket_write in PHP implicitly adds a line terminator, you'll need to do so yourself, so that ...

您关闭了套接字然后继续使用它。 try-with-resource语句关闭了套接字; 你开始的两个线程继续使用它。 You closed the socket and then continued to use it. The try-with-resource statement closed the socket; the two threads you started continued to use it.

你正在读行,但你不是在写行。 您需要为每个已发送的消息添加行终止符。 You're reading lines but you aren't writing lines. You need to add a line terminator to each sent message.

您应该使用OutputStream来编写二进制数据,而不是PrintWriter 。 You should be using an OutputStream to write binary data, not a PrintWriter.

尝试在邮件末尾添加\n 。 也不要将'NoDelay`设置为false。 你正在进行异步发送。 Try adding a \n to the end of the message. Also do not set 'NoDelay` to false. You are doing an asynchronous send.

你的脚本运行正常,并且对你正在寻找的东西没有很大的缺陷。 由于从命令行而不是Web浏览器运行脚本时获得了所需的结果,因此我们可以查明问题的原因:HTTP协议 HTTP不是用于持续连接(就像你习惯使用Java套接字一样),但它的简化工作流程基于Request / Elaborate / Response / Forget。 因此,您无法与纯HTML / PHP over HTTP解决方案进行“实时聊天”。 唉,并非所有的希望都失去了! 要实现“实时”通信,您可以使用Ajax,这不是很难习惯。 我说“...

我对客户端和服务器通信方式之间的差异非常好奇。 例如,客户端使用Scanner读取输入,而服务器使用BufferedReader (这是我个人的偏好)。 只是一个建议:保持一致。 现在 - 首先,客户端只发送一条消息,但随后开始在无限循环中无限期地读取。 看到你确切地知道服务器在向它发送“HELO”之后应该如何响应(它应该用一行响应,“DERP”),没有理由在任何类型的循环中从服务器读取。 服务器上存在同样的问题。 由于客户端现在是,它总是只向服务器发送一行(“HELO”)。 因此,服务器应该只期...

我们需要在这里绑定吗? 或者仅仅是因为我们想要引用本地端口? 您不需要绑定客户端SocketChannel。 s.connect(someAddr)

如果返回true,则javadocs表示已建立连接。 这是否意味着我不需要调用finishConnect()? 正确。 从我读到的,这是本地连接,但它没有指定远程连接是否可能立即返回true。 它可以随时返回true,你必须检查。 这是客户端向服务器发送SYN的位置吗? 是。 服务器通过一些serverSocketChannel.accept()获...

那是因为readLine()函数是一个阻塞调用,所以当然它会阻塞。 为了更具建设性,对readLine()类的方法的调用应该在一个单独的线程中,这样阻塞调用不会影响代码的其余部分。 从正在阅读的类中,我建议创建一个纯粹用于控制从套接字读取的线程。 我将传递对创建类的引用,以便如果线程接收信息,父类可以使用它。 That's because the readLine() function is a blocking call, so of course it's going to block. To...

相关文章

用java编写的一个socket服务端,通过一个tcp测试工具测试这个服务端,发现发送数据给服务端,服

...

Spring Data: a new perspective of data operations

...

是从网上找到的聊天程序 有服务器和客户端, 在注册完之后出现 java.io.StreamCorrup

...

Data Week: Becoming a data scientist Data Pointed,

...

java keytool生成的证书是CRT等格式的,这种格式是2进制编码的,而C++用的证书格式是pe

...

清明假期翻以前的笔记发现有一些NoSQL相关的内容,比较零散,是之前读《Big Data Glossa

...

Datanode中包含DataXceiverServer。DataXceiverServer是一个so

...

简介 SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAV

...

solr 的 data import 导入 mysql数据 (1)、编辑 example/solr/c

...

As you know, I've been playing with Solr lately, tr

...

最新问答

如果启用了复制处理程序,请确保将其置于其中一个安全角色之后。 我见过人们做的另一件事是在不同的端口上运行admin。 最好在需要auth的页面上使用SSL,这样你就不会发送明确的密码,因此管理和复制将发生在8443上,而常规查询将在8080上发生。 如果您要签署自己的证书,请查看此有用的SO页面: 如何在特定连接上使用不同的证书? I didn't know that /admin was the context for SOLR admin because /admin does not re

第一:在您的样本中,您有: 但是你在询问 //td[@class=‘CarMiniProfile-TableHeader’] (注意TableHeader中的大写'T')。 xpath区分大小写。 第二:通过查询// td [@ class ='CarMiniProfile-TableHeader'] / td,你暗示你在外部td中有一个'td'元素,而它们是兄弟姐妹。 有很多方法可以在这里获得制作和模型

这是你的答案: http://jsfiddle.net/gPsdk/40/ .preloader-container { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: #FFFFFF; z-index: 5; opacity: 1; -webkit-transition: all 500ms ease-out;

问题是,在启用Outlook库引用的情况下, olMailItem是一个保留常量,我认为当您将Dim olMailItem as Outlook.MailItem ,这不是问题,但是尝试设置变量会导致问题。 以下是完整的解释: 您已将olMailItem声明为对象变量。 在赋值语句的右侧,在将其值设置为对象的实例之前,您将引用此Object 。 这基本上是一个递归错误,因为你有对象试图自己分配自己。 还有另一个潜在的错误,如果之前已经分配了olMailItem ,这个语句会引发另一个错误(可能是

我建议使用wireshark http://www.wireshark.org/通过记录(“捕获”)设备可以看到的网络流量副本来“监听”网络上发生的对话。 当您开始捕获时,数据量似乎过大,但如果您能够发现任何看起来像您的SOAP消息的片段(应该很容易发现),那么您可以通过右键单击并选择来快速过滤到该对话'关注TCP Stream'。 然后,您可以在弹出窗口中查看您编写的SOAP服务与Silverlight客户端之间的整个对话。 如果一切正常,请关闭弹出窗口。 作为一个额外的好处,wireshar

Android默认情况下不提供TextView的合理结果。 您可以使用以下库并实现适当的aligntment。 https://github.com/navabi/JustifiedTextView Android Does not provide Justified aligntment of TextView By default. You can use following library and achieve proper aligntment. https://github.com/

你的代码适合我: class apples { public static void main(String args[]) { System.out.println("Hello World!"); } } 我将它下载到c:\ temp \ apples.java。 以下是我编译和运行的方式: C:\temp>javac -cp . apples.java C:\temp>dir apples Volume in drive C is HP_PAV

12个十六进制数字(带前导0x)表示48位。 那是256 TB的虚拟地址空间。 在AMD64上阅读wiki(我假设你在上面,对吗?)架构http://en.wikipedia.org/wiki/X86-64 12 hex digits (with leading 0x) mean 48 bits. That is 256 TB of virtual address space. Read wiki on AMD64 (I assume that you are on it, right?) ar

这将取决于你想要的。 对象有两种属性:类属性和实例属性。 类属性 类属性对于类的每个实例都是相同的对象。 class MyClass: class_attribute = [] 这里已经为类定义了MyClass.class_attribute ,您可以使用它。 如果您创建MyClass实例,则每个实例都可以访问相同的class_attribute 。 实例属性 instance属性仅在创建实例时可用,并且对于类的每个实例都是唯一的。 您只能在实例上使用它们。 在方法__init__中定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python的套接字自动传输图片文件,你可以按照以下步骤进行操作: 1. 在发送端(客户端)将图片文件打开并取为二进制数据。 2. 创建一个套接字并连接到接收端(服务器)的地址和端口。 3. 在发送端将图片数据通过套接字发送给接收端。 4. 在接收端接收数据并保存为图片文件。 以下是一个简单的示例代码,演示了如何使用socket套接字自动传输图片文件: **发送端(客户端)代码:** ```python import socket def send_image(image_path, host, port): # 打开并取图片文件 with open(image_path, 'rb') as file: image_data = file.read() # 创建套接字并连接到服务器 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((host, port)) # 发送图片数据 client_socket.sendall(image_data) # 关闭套接字 client_socket.close() # 示例使用 image_path = 'image.jpg' # 图片文件路径 host = '服务器地址' port = 12345 # 服务器端口 send_image(image_path, host, port) ``` **接收端(服务器)代码:** ```python import socket def receive_image(save_path, host, port): # 创建套接字并绑定到指定地址和端口 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) # 监听连接 server_socket.listen(1) print(f"等待来自客户端的连接...") # 接受连接并接收图片数据 client_socket, address = server_socket.accept() print(f"连接来自:{address}") # 接收图片数据 image_data = client_socket.recv(1024) # 保存图片文件 with open(save_path, 'wb') as file: file.write(image_data) # 关闭套接字 client_socket.close() server_socket.close() print("图片接收完成!") # 示例使用 save_path = 'received_image.jpg' # 接收到的图片保存路径 host = '0.0.0.0' # 服务器地址(监听所有可用的网络接口) port = 12345 # 服务器端口 receive_image(save_path, host, port) ``` 在上述代码中,你需要将`image.jpg`替换为要发送的图片文件路径。在接收端,你需要指定一个保存接收到的图片的路径`received_image.jpg`。此外,你还需要指定发送端和接收端所在的服务器地址和端口。 请注意,这只是一个简单的示例,仅用于演示基本的图片文件传输。在实际应用中,你可能需要添加错误处理、文件大小处理等逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值