客户端/服务器JVM

编程入门 行业动态 更新时间:2024-10-14 18:17:46
客户端/服务器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

最满意答案

您不能让多个服务器进程侦听同一端口。 操作系统如何知道哪一个获得连接?

处理多个客户端的常用方法是在接受连接后生成一个线程。 您将连接传递给线程并且主线程循环,继续侦听并接受新连接。

这都是非常基本的TCP / IP,与SSL无关。

You cannot have multiple server processes listening to the same port. How would the OS know which one gets the connection?

The usual way to handle multiple clients is to spawn a thread AFTER you have accepted a connection. You pass the connection to the thread and the main thread loops, continuing to listen and accept new connections.

This is all very basic TCP/IP and has nothing to do with SSL.

更多推荐

本文发布于:2023-07-14 14:32:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1105114.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:客户端   服务器   JVM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!