Tag: 套接字

使用套接字时,“流结束”是什么意思

在Java中使用套接字时,如何在开始处理之前判断客户端是否已完成发送所有(二进制)数据。 考虑例如: istream = new BufferedInputStream (socket.getInputStream()); ostream = new BufferedOutputStream(socket.getOutputStream()); byte[] buffer = new byte[BUFFER_SIZE]; int count; while(istream.available() > 0 && (count = istream.read(buffer)) != -1) { // do something.. } // assuming all input has been read ostream.write(getResponse()); ostream.flush(); 我已经在SO上阅读了类似的post,但是找不到确定的答案。 虽然上面的解决方案有效,但我的理解是,您永远无法确定客户端是否已完成所有数据的发送。 例如,如果客户端套接字发送了一些数据块然后阻止等待来自另一个数据源的数据,然后它可以发送更多数据,那么上面的代码可能很好地假设客户端已经完成了所有数据的发送,因为istream.available()将为当前字节流返回0。

什么可能导致套接字ConnectException:连接超时?

我们有一个Webstart客户端,它通过使用java.net.HttpsURLConnection通过HTTPS发送序列化对象来与服务器通信。 在我的本地机器和办公室的测试服务器上,一切都运行得很好,但我遇到了一个非常非常奇怪的问题,这个问题只发生在我们的生产和登台服务器上(偶尔也会发生)。 我知道这些服务器和我们办公室的服务器之间的主要区别在于它们位于其他地方并且客户端 – 服务器与它们的通信速度相当慢,但在此之前它在生产中也能正常工作。 无论如何,这是发生了什么: 客户端在设置读取超时和HttpURLConnection上的Content-Type等属性之后调用其上的getOutputStream()以获取要写入的流。 此时,据我所知,客户端会挂起一段时间。 然后客户端抛出以下exception: java.net.ConnectException:连接超时:连接 at java.net.PlainSocketImpl.socketConnect(Native Method) 在java.net.PlainSocketImpl.doConnect(未知来源) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 在java.net.PlainSocketImpl.connect(未知来源) 在java.net.SocksSocketImpl.connect(未知来源) 在java.net.Socket.connect(未知来源) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) 在com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(未知来源) 在sun.net.NetworkClient.doConnect(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun.net.www.protocol.https.HttpsClient。(未知来源) 在sun.net.www.protocol.https.HttpsClient.New(未知来源) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) 在sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知来源) 在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知来源) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 请注意,这不是SocketTimeoutException , HttpURLConnection上的connect()方法表示如果在建立连接之前超时到期,它将抛出。 此外,当发生这种情况时,我能够调用conn.getResponseCode()并获得200的响应代码。 在服务器端,在ObjectInputStream的构造函数中抛出EOFException ,该构造函数尝试读取序列化头但由于客户端永远不会获取要写入的OutputStream而失败。 如果它有帮助,这里是在调用getOutputStream()之前在HttpsURLConnection进行的调用(编辑后只显示正在进行的调用而不是代码的整个结构这样做): HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setReadTimeout(30000); conn.setRequestProperty(“Cookie”, […]

Javamultithreading客户端/服务器 – java.net.SocketException:Socket已关闭

我必须使用Java的socket api编写multithreading客户端和服务器。 客户端和服务器都是multithreading的,因此服务器可以处理多个连接,客户端可以测试服务器处理连接的能力。 我的代码在这里: https : //github.com/sandyw/Simple-Java-Client-Server 我有一对,可能是相关的问题。 一个,偶尔会有一个客户端线程抛出 java.net.SocketException: Socket closed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at ClientThread.run(ClientThread.java:45) at java.lang.Thread.run(Thread.java:680) 从其位置开始意味着服务器在客户端完成读取之前关闭其套接字。 我怎么能阻止这个? 此外,即使计算抛出Socket closedexception的线程,似乎并非所有服务器线程都在发送它们的输出。 例如,30个服务器线程中的23个将发送其输出,但只有22个客户端线程将接收任何内容。 通讯显然在某处丢失了,我该如何防止这种情况发生?

Java Threadpool与高请求场景中的新线程

我有一些旧的Java代码用于REST服务,它为每个传入的请求使用一个单独的线程。 即主循环将在socket.accept()上循环并将套接字移交给Runnable,然后Runnable将启动其自己的后台线程并调用自身运行。 直到最近,我才注意到这种情况令人钦佩,我注意到在高负荷下接受处理请求的滞后将变得不可接受。 当我钦佩地说,我的意思是它在没有大量CPU使用的情况下每秒处理100-200个请求。 当其他守护进程添加负载时性能只会降低,然后只有一次负载超过5.当机器处于高负载(5-8)时,其他进程的组合,从接受到处理的时间会变得非常高( 500ms到3000ms)而实际处理时间不到10ms。 这一切都在双核centos 5系统上。 已经习惯了.NET上的Threadpools,我认为线程创建是罪魁祸首,我认为我在java中应用了相同的模式。 现在我的Runnable使用ThreadPool.Executor执行(并且池使用和ArrayBlockingQueue)。 同样,它在大多数情况下工作得很好,除非机器负载变高,然后从创建runnable到run()被调用的时间表现出大致相同的荒谬时间。 但更糟糕的是,随着线程池逻辑的到位,系统负载几乎翻了一番(10-16)。 所以现在我得到了相同的延迟问题,负载加倍。 我怀疑队列的锁争用比先前没有锁的新线程启动成本更差。 任何人都可以分享他们的新线程与线程池的经验。 如果我的怀疑是正确的,任何人都有另一种方法来处理没有锁争用的线程池? 我很想让整个系统单线程化,因为我不知道我的线程有多大帮助,IO似乎不是一个问题,但我确实得到了一些长期存在的请求阻止一切。 谢谢,阿恩 更新:我切换到Executors.newFixedThreadPool(100); 虽然它保持相同的处理能力,但是加载几乎立即加倍并且运行12小时显示负载始终保持2倍。 我想在我的情况下,每个请求的新线程更便宜。

Java:validation并将“host:port”转换为InetSocketAddress的常用方法?

Java中用于validation和转换forms为host:port的字符串为InetSocketAddress实例的InetSocketAddress什么? 如果满足以下条件,那就太好了: 没有地址查找; 适用于IPv4,IPv6和“字符串”主机名; (对于IPv4,它是ip:port ,对于IPv6,它是[ip]:port ,对吗?是否有一些RFC定义了所有这些方案?) 最好不要手工解析字符串。 (我正在考虑所有这些特殊情况,当有人认为他知道套接字地址的所有有效forms时,却会忘记导致意外结果的“特殊情况”。)

在java中,应用程序中CPU核心数与线程数之间的关系是什么?

我是java multithreading编程的新手。 我想到的问题是我可以根据CPU核心数运行多少个线程。 如果我运行线程超过CPU核心将是机器运行应用程序的开销。 例如,当我们的服务器机器有一个运行2个线程的服务器软件(主线程+开发人员线程)时,当更多的并发客户端与服务器建立套接字连接时,它是否会成为服务器的开销? 谢谢。

调整Java套接字的性能

我已经创建了一个远程桌面控制应用程序。 显然,它由客户端和服务器部分组成: 服务器: 从客户端接收鼠标/键盘操作; 将桌面截图发送给客户端。 客户: 从服务器接收屏幕截图; 发送鼠标/键盘动作; 考虑发送屏幕截图。 当我使用家用PC作为服务器时 – 我最终获得了1920×1080的屏幕截图尺寸。 通过使用JAI Image I / O Tools并将其编码为PNG,我能够为这样一个大图像获得以下统计数据: 写时间~0.2秒; (不是插入套接字,而是进入某些“常规”输出流, 即编码时间 ) 读取时间~0.05秒; (不是来自套接字,而是来自某些“常规”输入流, 即解码时间 ) 大小~250 KB; 完美的品质。 因此,根据#1 – 理想的可能FPS应为~5。 不幸的是,我甚至无法达到~5 FPS,甚至不能达到2 FPS。 我搜索了瓶颈,发现对套接字I / O流的写入/读取需要大约2秒( 参见附录1和2以进行说明 )。 当然这是不可接受的。 我对这个主题进行了一些研究 – 并在两侧增加了对套接字I / O流(使用BufferedInputStream和BufferedOutputStream )的BufferedOutputStream 。 我从64 KB大小开始。 这确实提高了性能。 但仍然不能拥有至少2个FPS! 另外,我已经尝试过Socket#setReceiveBufferSize和Socket#setSendBufferSize并且速度有一些变化,但我不知道它们的行为究竟如何,因此我不知道要使用哪些值。 看初始化代码: 服务器: […]

Java套接字编程不适用于10,000个客户端

我可以创建多个线程来支持套接字编程中的多客户端function; 这工作正常。 但是如果要连接10,000个客户端,我的服务器就无法创建这么multithreading。 如何管理线程以便我可以同时收听所有这些客户端? 此外,如果在这种情况下服务器想要向特定客户端发送内容,那么它怎么可能呢?

C ++和Java之间的低延迟IPC

在以下情况下,实现C ++ / Java IPC的最佳方法是什么? (有人最近问了一个类似的问题 ,但我的要求更具体) 我有两个程序 – 一个用C ++编写,另一个用Java编写 – 需要相互通信。 两者都在同一台机器上运行。 程序相互发送消息。 消息通常很短(少于几百字节),但可能大小为100KB或更多。 消息不需要被确认(即,不是像HTTP那样的请求/响应模型)。 例如,C ++程序向Java程序发送消息,Java程序可以通过稍后向C ++程序发送消息来进行回复 – 反之亦然。 一个理想的解决方案是:a)非常低的延迟,b)没有安全麻烦(用户不必授权打开端口等)和c)将是平台无关的。 我的第一个想法是使用套接字 – 每个程序都充当另一个程序的服务器。 套接字比其他forms的IPC有更多的开销,我不知道如果让系统自动分配端口号,服务器将如何通知客户端端口号。 我也考虑过命名管道 ,但它们在不同平台上不受支持(至少不一致)。 JNI看起来像一个选项,但它可以跨越流程边界吗? 有什么建议么? 谢谢! 后续问题 如果我使用套接字,我是否需要打开两个套接字以允许异步通信,如上所述?

为什么我的UDP客户端/服务器数据报没有运行双向通信?

我在两个应用程序之间设置了一个简单的UDP客户端/服务器数据报:Android-Java-Client和Windows-C#-Server。 这是我的第一个Java编程和Android应用程序,因此解决方案可能很明显。 所以我成功地从客户端向服务器发送了一个数据包。 但是,我无法从服务器发回客户端。 我正在尝试从服务器向客户端发送确认消息。 我尝试将C#客户端代码与现有的C#Server代码合并,但是一旦服务器收到第一条消息System.ObjectDisposedException它就会崩溃。 我删除了并重新开始“如果你想要看见编辑”。 现在,我成功发送到服务器但没有收到任何内容,Java客户端也没有显示任何内容。 我知道我可以(或者可能应该)使用相同的套接字发送回客户端。 我的错误在哪里? 拜托,谢谢。 我尝试将整个NetworkThread放在OnTouchListener 我尝试将SendUdpMessage()分解为两个,一个发送,一个接收 我尝试了下面的答案 而我仍然无法使它工作:( C#服务器端: // This class is responsible of running the server side on the PC. class UdpServer { static void Main(string[] args) { byte[] data = new byte[1024]; UdpClient serverSocket = new UdpClient(15000); int i = 0; while (true) { Console.WriteLine(“Waiting […]