客户端/服务器JVM_Bind异常(Client/Server JVM_Bind exception)
我正在尝试在java服务器和python客户端之间建立SSL连接。
这是代码:
服务器端:
public class s implements Runnable { List<SSLSocket> socketList= new ArrayList<SSLSocket>(); List<File> FileList= new ArrayList<File>(); List<Certificate> CertificateList = new ArrayList<Certificate>(); public static void main(String[] args) { s manager = new s(); new Thread(manager).start(); Scanner scanner = new Scanner(System.in); while(true){ System.out.printf("Send> "); String message = scanner.nextLine(); if(message.equals("") || message.equals("/n")){ continue; }else{ manager.send(message); } } } private static SSLServerSocket getServerSocket(int thePort) { SSLServerSocket s=null; try { String key="G:\\mySrvKeystore"; char keyStorePass[]="123456".toCharArray(); char keyPassword[]="123456".toCharArray(); KeyStore ks= KeyStore.getInstance("JKS"); ks.load(new FileInputStream(key),keyStorePass); KeyManagerFactory kmf= KeyManagerFactory.getInstance("SunX509"); kmf.init(ks,keyPassword); SSLContext sslContext= SSLContext.getInstance("SSLv3"); sslContext.init(kmf.getKeyManagers(),null,null); SSLServerSocketFactory factory=sslContext.getServerSocketFactory(); s=(SSLServerSocket)factory.createServerSocket(thePort); }catch(Exception e) { System.out.println(e); } return(s); } public void run() { try { while (true) { SSLServerSocket sslserversocket = getServerSocket(**9991**); SSLSocket client = (SSLSocket)sslserversocket.accept(); socketList.add(client); new Thread(new SSocket(client,socketList,FileList)).start(); } } catch (IOException e) { e.printStackTrace(); } }
客户端:
class timer(threading.Thread): def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.ssl_sock = ssl.wrap_socket(self.sock, ssl_version=ssl.PROTOCOL_SSLv3) self.ssl_sock.connect(('localhost',9990)) self.isrun = True threading.Thread.__init__(self); def run(self): while self.isrun: revice = self.ssl_sock.recv(1024); print ("recv> " + revice); self.sock.close(); self.ssl_sock.close(); def send(self,str): self.ssl_sock.send(str + "\n") def close(self): self.isrun=False if __name__=='__main__': main()
我有:
我没有使用保留端口,我的操作系统是windows-7。 我首先运行服务器然后运行客户端。
我不明白为什么我不能运行该程序的多个实例? 是因为我使用的是同一个端口吗? 但是之前我只使用socket而不是SSLsocket就可以了。
谢谢你的帮助
I am trying to establish a SSL connection between java server and python client.
Here is the code:
Server side:
public class s implements Runnable { List<SSLSocket> socketList= new ArrayList<SSLSocket>(); List<File> FileList= new ArrayList<File>(); List<Certificate> CertificateList = new ArrayList<Certificate>(); public static void main(String[] args) { s manager = new s(); new Thread(manager).start(); Scanner scanner = new Scanner(System.in); while(true){ System.out.printf("Send> "); String message = scanner.nextLine(); if(message.equals("") || message.equals("/n")){ continue; }else{ manager.send(message); } } } private static SSLServerSocket getServerSocket(int thePort) { SSLServerSocket s=null; try { String key="G:\\mySrvKeystore"; char keyStorePass[]="123456".toCharArray(); char keyPassword[]="123456".toCharArray(); KeyStore ks= KeyStore.getInstance("JKS"); ks.load(new FileInputStream(key),keyStorePass); KeyManagerFactory kmf= KeyManagerFactory.getInstance("SunX509"); kmf.init(ks,keyPassword); SSLContext sslContext= SSLContext.getInstance("SSLv3"); sslContext.init(kmf.getKeyManagers(),null,null); SSLServerSocketFactory factory=sslContext.getServerSocketFactory(); s=(SSLServerSocket)factory.createServerSocket(thePort); }catch(Exception e) { System.out.println(e); } return(s); } public void run() { try { while (true) { SSLServerSocket sslserversocket = getServerSocket(**9991**); SSLSocket client = (SSLSocket)sslserversocket.accept(); socketList.add(client); new Thread(new SSocket(client,socketList,FileList)).start(); } } catch (IOException e) { e.printStackTrace(); } }
Client side:
class timer(threading.Thread): def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.ssl_sock = ssl.wrap_socket(self.sock, ssl_version=ssl.PROTOCOL_SSLv3) self.ssl_sock.connect(('localhost',9990)) self.isrun = True threading.Thread.__init__(self); def run(self): while self.isrun: revice = self.ssl_sock.recv(1024); print ("recv> " + revice); self.sock.close(); self.ssl_sock.close(); def send(self,str): self.ssl_sock.send(str + "\n") def close(self): self.isrun=False if __name__=='__main__': main()
I got:
I did not use reserve port and my OS is windows-7. And I run the server first then the client.
I don't understand why I cannot run multiple instance of the program? Is it because I am using the same port? But it was ok before when I just used socket instead of SSLsocket.
THanks for any help
原文:https://stackoverflow.com/questions/37370348
最满意答案
问题来自于你不能将有符号和无符号的arithemetics与整数混合在一起。 反正不是直接的。 你必须具体告诉你想要什么。 你提到的那一行给出零,因为你将一个
uint16
表示与(-1)
相乘,默认情况下是从double
重新转换为uint16
,它截断为零(0
)。 请改用int16
。我使用一些更好的变量名称制作了更干净的代码版本(尽管有些人可能不同意)。 我发现使用数学上预期的“类型”作为变量名称(矩阵,向量等)的前缀很有用。 即使数据结构非常小,您也应该养成预分配数据的习惯。 我敢打赌,MATLAB编辑器可能会在右边缘发出恼人的警告,尖叫着你? :)
如果在
vec_d
的值中设置第16位,则final
向量(int16
向量)现在应该包含二进制补码(负)。 也不确定A2
是什么,所以我删除了它。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vec_d = [ 63820 63594 63382 63123 62921 62712 62536 62350 62129 61914 61668 ]; vec_d = uint16(vec_d); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % extract 16th bit: vec_a = bitget(vec_d, 16); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % preallocate other datastructures: vec_C1 = zeros(size(vec_a), 'uint16'); vec_A1 = zeros(size(vec_a), 'uint16'); vec_final = zeros(size(vec_a), 'int16'); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for num_k = 1:numel(vec_a) if (vec_a(num_k) == 1) vec_C1(num_k) = bitcmp(uint16(vec_d(num_k))); vec_A1(num_k) = vec_C1(num_k) + 1; vec_final(num_k) = (-1) * int16(vec_A1(num_k)); else vec_final(num_k) = vec_d(num_k); end end % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
希望能帮助到你。
The problem comes from the fact that you cannot mix signed and unsigned arithemetics with integers. Not directly anyway. You have to tell specifically what you want. The line you mention gives zero because you multiply a
uint16
representation with(-1)
which is by default recast fromdouble
touint16
, which truncates to zero (0
). Useint16
instead.I have made a more clean version of your code using some better variables names (though some might disagree). I find it useful to use the mathematically intended "type" as a prefix on variables names (matrix, vector, etc.). You should also get in the habit of preallocating your data, even if the datastructures are quite small. I bet the MATLAB editor is likely screaming at you with annoying warnings in the right margin? :)
The
final
vector (anint16
vector) should now contain the two's complement (negative) values if the 16th bit is set in the values ofvec_d
. Also not sure whatA2
was for, so I removed it.% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vec_d = [ 63820 63594 63382 63123 62921 62712 62536 62350 62129 61914 61668 ]; vec_d = uint16(vec_d); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % extract 16th bit: vec_a = bitget(vec_d, 16); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % preallocate other datastructures: vec_C1 = zeros(size(vec_a), 'uint16'); vec_A1 = zeros(size(vec_a), 'uint16'); vec_final = zeros(size(vec_a), 'int16'); % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for num_k = 1:numel(vec_a) if (vec_a(num_k) == 1) vec_C1(num_k) = bitcmp(uint16(vec_d(num_k))); vec_A1(num_k) = vec_C1(num_k) + 1; vec_final(num_k) = (-1) * int16(vec_A1(num_k)); else vec_final(num_k) = vec_d(num_k); end end % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hope it helps.
相关问答
更多-
这是注射 (也称为reduce )的教科书案例, [1, 2, 3, 4, 5].inject(:*) 如下所示,为了避免零, [1, 2, 3, 4, 5].reject(&:zero?).inject(:*) This is the textbook case for inject (also called reduce) [1, 2, 3, 4, 5].inject(:*) As suggested below, to avoid a zero, [1, 2, 3, 4, 5].reject(& ...
-
我猜你正在列出一个列表或像对象到列表的列表。 In [1]: str([1]) Out[1]: '[1]' 您可以使用type(data [i,j,k])来查看您正在投射的对象类型。 I guess you are casting a list or a list like object to string . In [1]: str([1]) Out[1]: '[1]' You can use type(data[i,j,k]) to see what kind of object you are c ...
-
在数组中乘以元素(Multiply elements in an array)[2022-12-30]
您可以向后通过阵列并一次完成,而不是重复操作。 for (int i = num.Length - 2; i >= 0; i--) { num[i] *= num[i + 1]; } 给8,8,4,2,2,2 You can go through the array backwards and do it in one pass and not repeat operations. for (int i = num.Length - 2; i >= 0; i--) { num ... -
用于乘以数组元素的函数(Function to multiply array elements)[2022-06-16]
非常简单...改变你的代码如下... static void letsMult(int [] myArray) { int output=1; for (int a = 0; a < myArray.Length; a++ ) { output=output*myArray[a]; Console.WriteLine(output); ... -
问题来自于你不能将有符号和无符号的arithemetics与整数混合在一起。 反正不是直接的。 你必须具体告诉你想要什么。 你提到的那一行给出零,因为你将一个uint16表示与(-1)相乘,默认情况下是从double重新转换为uint16 ,它截断为零( 0 )。 请改用int16 。 我使用一些更好的变量名称制作了更干净的代码版本(尽管有些人可能不同意)。 我发现使用数学上预期的“类型”作为变量名称(矩阵,向量等)的前缀很有用。 即使数据结构非常小,您也应该养成预分配数据的习惯。 我敢打赌,MATLAB编 ...
-
这是自我解释,但我需要写30个字符:D Well this is self explainig, but I need to write 30 characters :D
-
是的,你可以做到。 由于这绝对是一个学习练习,这里有一些提示如何做到这一点: 您的循环将值number[i] * 2分配给product ,每次迭代后都会丢弃它。 而不是这样做,使用number[i] *= 2; * ,并删除product变量的声明。 您也可以放弃answer ,因为它仅被分配,并且在此之后从未使用过。 *这是 number[i] = number[i] * 2;的快捷方式 number[i] = number[i] * 2; Yes, you can do it. Since this ...
-
您对副本的定义:在列表中重复完全相同的数组的元组。 import numpy as np # list with the 5th tuple being a duplicate of the 1st lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), (array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0 ...
-
UML组成1. *和0. *(UML composition 1.* and 0.*)[2024-01-19]
你不能。 合成是指整体/部分关系,它最多只能是0 * -1,1 * -1或0 * -0..1。 有关该主题的更多信息,请阅读: https : //www.uml-diagrams.org/composition.html 编辑:想想整个/部分关系是什么。 卧室是房子的一部分,但同一间卧室不属于多个房屋。 但是,房子可以有多间卧室。 这与房屋/卧室的情况相同。 You can't. A composition means a whole/part relationship and it can only b ... -
从0开始的任何整数文字都被视为八进制表示。 在您的代码中,您使用八进制数初始化一些数组成员,然后打印出它们的十进制表示(使用%d格式说明符)。 因此,您的期望和输出会有所不同。 基本上,您的初始化,十进制形式,看起来像 int a[8] = {0,1,8,9,100,101,110,111}; //first 4 initializers are converted to decimal. 另一方面,只是为了完成,如果你使用%o格式说明符(八进制表示),你可以看到前四个初始化器,如你所料,但最后四个也将 ...