Tag: sockets

java.net.SocketException:通过对等方重置连接:套接字写入错误提供文件时

我正在尝试使用套接字实现HTTP服务器。 如果客户端(例如浏览器)请求目录,则服务器显示可用文件列表。 当客户端请求文件时出现问题。 我收到以下错误: java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) at java.net.SocketOutputStream.write(SocketOutputStream.java:159) at cf.charly1811.java.web.RequestHandler.writeFile(RequestHandler.java:152) at cf.charly1811.java.web.RequestHandler.processRequest(RequestHandler.java:139) at cf.charly1811.java.web.RequestHandler.handleRequest(RequestHandler.java:110) at cf.charly1811.java.web.RequestHandler.run(RequestHandler.java:86) at java.lang.Thread.run(Thread.java:745) stacktrace显示问题来自writeFile()方法: private void writeFile(File request) throws IOException { InputStream byteReader = new BufferedInputStream(new FileInputStream(request)); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = byteReader.read(buffer)) != […]

在一个SSL套接字连接中使用两个私钥(密钥库)和两个公钥(信任库)

我需要在一个套接字ssl连接中使用密钥对而不会在客户端中进行任何更改。 为什么? 因为一个客户端在信任存储中使用CN属性进行连接握手,而在同一属性中使用另一个值以同一方式处理相同任务的其他客户端。 所以我需要使用具有不同CN属性的 两个密钥存储 (私有)以及别名并共享 具有不同CN属性的 两个不同信任存储 (公钥)以及别名。 描述如下: keyStore1 密钥库类型:JKS 密钥库提供商:SUN 别名: identity1 所有者: CN = app1 … 发行人:CN = app1 …… trustStore1 别名: identity1 所有者: CN = app1 … 发行人:CN = app1 …… keyStore2 别名: identity2 所有者:CN = app2 … 发行人:CN = app2 …… trustStore2 别名: identity2 所有者: CN = app2 … […]

从ANDROID 2.2发送UDP包(HTC欲望)

我有一个局域网,我想从我的机器人(HTC欲望)发送一条更新消息到我的电脑。 他们之间有一个Wlan路由器。 问题是,UPD消息永远不会到达PC。 Android上的代码: package org.example.androidapp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPClientAnd { public void sendUDPMessage(int port) throws java.io.IOException { DatagramSocket socket = new DatagramSocket(); InetAddress serverIP = InetAddress.getByName(“192.168.1.110”); byte[] outData = (“Ping”).getBytes(); DatagramPacket out = new DatagramPacket(outData,outData.length, serverIP,50005); socket.send(out); socket.close(); } } 我在展位两侧选择一个高端口。 Android上的权限是: uses-permission android:name=”android.permission.INTERNET” uses-permission android:name=”android.permission.CHANGE_WIFI_MULTICAST_STATE” 服务器端是PC只是一个简单的接收程序: package org.example.androidapp; […]

缓冲读卡器没有从套接字接收数据

我正在编写一个客户端应用程序,它将通过tcp / ip接收连续的数据流。 我遇到的问题是缓冲的读取器对象没有接收到任何数据并且挂在readline方法上。 服务器的工作方式是连接到它,然后发送身份validation信息以接收数据。 我的代码的要点如下 socket = new Socket(strHost, port); authenticate(); inStream = new BufferedReader(new InputStreamReader(socket.getInputStream())); process(inStream); authenticate() { PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true); pwriter.println(authString); } process(BufferedReader bufferedReader) { while((line = bufferedReader.readLine()) != null) dostuff } 我创建了一个示例服务器应用程序,它以一种方式发送数据(我认为)服务器正在发送数据并且它连接,并接收和处理数据。 我可以在我的应用程序中正常连接到服务器。 我也可以telnet到服务器并写入身份validation字符串并使用telnet接收大量数据。 但是,我的应用程序只是挂在readLine与服务器,我不明白为什么。 进入的数据(通过telnet atleast)看起来像是以下的连续流: data;data;data;data;data data;data;data;data;data 为什么我的应用程序挂在readline上,我是不是正确输出了身份validation行? 我没有收到任何错误…… 编辑我的示例服务器代码(正常工作)…再次这只是模仿我认为真实服务器正在运行的方式,但我可以连接到我的应用程序中只是没有从真实服务器接收数据。 public static void main(String[] args) throws […]

UDP打孔Java示例

我希望在具有静态IP的服务器的帮助下,使用两个客户端进行UDP Hole Punching。 服务器在端口7070和7071上等待两个客户端。之后,它会相互发送IP地址和端口。 这部分工作正常。 但是我无法在两个客户之间建立通信。 我在不同的Wifi网络和3G移动网络中尝试了代码。 客户端程序抛出IO-Exception“无路由到主机”。 客户端代码用于两个客户端。 一旦用7070端口执行,一次用7071执行。 您认为我是否正确实施了UDP打孔概念? 有什么想法让它发挥作用? 这是服务器代码,然后是客户端代码。 谢谢你的帮助。 服务器代码: public class UDPHolePunchingServer { public static void main(String args[]) throws Exception { // Waiting for Connection of Client1 on Port 7070 // //////////////////////////////////////////////// // open serverSocket on Port 7070 DatagramSocket serverSocket1 = new DatagramSocket(7070); System.out.println(“Waiting for Client 1 on Port […]

S3 Java客户端因“Content-Length delimited message body的过早结束”或“java.net.SocketException Socket closed”而失败了很多

我有一个应用程序在S3上做了很多工作,主要是从它下载文件。 我看到很多这类错误,我想知道这是否是我的代码上的内容,或者这项服务是否真的不可靠。 我用来从S3对象流中读取的代码如下: public static final void write(InputStream stream, OutputStream output) { byte[] buffer = new byte[1024]; int read = -1; try { while ((read = stream.read(buffer)) != -1) { output.write(buffer, 0, read); } stream.close(); output.flush(); output.close(); } catch (IOException e) { throw new RuntimeException(e); } } 此OutputStream是一个新的BufferedOutputStream(新的FileOutputStream(文件)) 。 我使用的是最新版本的Amazon S3 Java客户端,在放弃之前会重试此调用四次 。 因此,在尝试了4次后,它仍然失败。 关于如何改进这一点的任何提示或提示都表示赞赏。

Java / Python中的快速IPC / Socket通信

两个进程(Java和Python)需要在我的应用程序中进行通信。 我注意到套接字通信占用了93%的运行时间。 为什么沟通这么慢? 我应该寻找套接字通信的替代方案,还是可以加快速度? 更新:我发现了一个简单的修复。 似乎缓冲输出流由于某种未知原因而没有真正缓冲。 所以,我现在将所有数据放入客户端/服务器进程的字符串缓冲区中。 我在flush方法中将它写入套接字。 我仍然对使用共享内存在进程之间快速交换数据的示例感兴趣。 一些其他信息: 应用程序中的消息大小大多数时间不到64kb。 服务器是Java,客户端是用Python编写的。 套接字IPC实现如下:它需要50个周期发送200个字节! 这必须太高了。 如果我在5000个周期内发送2个字节,则需要的时间要少得多。 这两个进程都在一台Linux机器上运行。 在实际应用程序中,每个周期都会对客户端的iFid.write()进行大约10次调用。 这是在Linux系统上完成的。 这是服务器端: public class FastIPC{ public PrintWriter out; BufferedReader in; Socket socket = null; ServerSocket serverSocket = null; public FastIPC(int port) throws Exception{ serverSocket = new ServerSocket(port); socket = serverSocket.accept(); out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in […]

为SSL套接字上的每个请求创建新进程会产生“TypeError:无法序列化套接字对象”,但对正常/非SSL套接字执行相同操作

我正在尝试使用python服务器和java客户端中使用java keytool生成的密钥和证书。 我创建了密钥和密钥库,导出证书,将证书添加到信任库,将密钥库转换为标准pkcs格式,然后从pkcs中提取密钥和证书以在python服务器中使用。 (从这里开始前三步,从这里开始最后三步)。 这个问题在某种程度上跟进了这个问题 ,并且可以在该问题中找到生成密钥和证书的详细步骤。 我的SSL服务器看起来像这样 server.py import socket import multiprocessing as mup import ssl def worker_ssl(data_socket, client_address): print(“Inside worker”) #some processing def start_server_ssl(): socketObj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = (“127.0.0.1″, 6000) socketObj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) socketObj.bind(server_address) socketObj.listen(10) ssl_socket = ssl.wrap_socket(socketObj, server_side = True, certfile=”cert.pem”, keyfile=”key.pem”) while True: print(“Waiting For Connections ………\n”) try: data_socket, client_address […]

常见的Java套接字中没有密码套件

我最近一直在为消息传递系统使用SSL套接字。 我终于开始使用CA颁发的证书了。 我将它导入我的密钥库,设置了密钥库属性,并启动了我的客户端,但是当我尝试发送数据时,我一直收到握手exception。 我启用了调试模式,我发现它是由于no cipher suites supported 。 有什么想法吗? 如果它有帮助,它还说它忽略了TLSV1和TLSV1.1的10个密码套件。 我还安装了无限强度加密策略。 客户代码 public static void Message(String args){ System.setProperty(“https.protocols”, “TLSv1”); System.setProperty(“javax.net.debug”, “all”); try { String host = “localhost”; int port = 3498; InetAddress address = InetAddress.getByName(host); socket = (SSLSocket)SSLSocketFactory.getDefault().createSocket(address, port); //Send the message to the server OutputStream os = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter […]

套接字,BufferedReader.readline() – 为什么流没有准备好?

我正在学习java,我遇到了套接字的一些问题。 我开发了一个简单的客户端 – 服务器应用程序 – 敲门,它执行4个步骤: 客户端向服务器发送一些消息 服务器收到它们并保存到文件 服务器向客户端发回一些其他消息 客户收到它们并保存到文件 问题出现在步骤#4:客户端不接收消息并且永远不会出现循环: while ((inStr = in.readLine()) != null) { writer.println(inStr); } 其中in是BufferedReader类型: try { socket = new Socket(ipAddress, 4444); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 在服务器端发送消息: try { socket […]