我正在尝试在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:
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(); } }Server 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()Client side:
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.
更多推荐
发布评论