- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经编写了一段代码来实现 SSL 套接字(服务器/客户端),并且证书身份验证等正在正确完成。当代码尝试读取客户端传递给服务器的字符串时,代码将停止。请帮忙。
这是我用来创建 SSLServerSocket 的文件:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.Random;
import javax.net.ssl.*;
public class Server {
private String ksname;
private char kspass[], ctpass[];
private int port;
private InetAddress ip;
public Server(){
ksname = null;
kspass = new char[200];
ctpass = new char[200];
kspass = null;ctpass = null;
port = 10000 + (new Random()).nextInt(10000);
try {
ip = InetAddress.getByName("127.0.0.1");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Server(String cname, String cpass, String pass, int p, String host){
ksname = cname;
kspass = new char[200];
kspass = cpass.toCharArray();
ctpass = new char[200];
ctpass = pass.toCharArray();
port = p;
try {
ip = InetAddress.getByName(host);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public SSLServerSocket getServer(){
SSLServerSocket s = null;
try {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(ksname), kspass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, ctpass);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
s = (SSLServerSocket) ssf.createServerSocket(port,0,ip);
System.out.println("Server created on port " + port +"\n");
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
}
这是服务器的代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Map;
import java.util.Random;
import javax.net.ssl.*;
public class MServer {
private SSLSocket c = null;
private BufferedReader r = null;
private BufferedWriter w = null;
private int port = 10579;
private void execute(){
Server server = new Server("ppp.jks", "user", "pass", port, "127.0.0.1");
SSLServerSocket s = server.getServer();
printServerSocketInfo(s);
try {
c = (SSLSocket) s.accept();
printSocketInfo(c);
r = new BufferedReader(new InputStreamReader(c.getInputStream()));
w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
System.out.println("in m");
System.out.flush();
String str = null;
str = r.readLine();
System.out.println(str);
if(str.equals("hi")){
w.write("Connection OK");
System.out.println("Connection OK2");
}
while((str = r.readLine()) != null){
if(str.equals("done")){
break;
}
resolve(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void resolve(String str){
//does something
}
private void printMessage(int returnValue, int correctReturnValue, String printFor){
//something
}
private static void printSocketInfo(SSLSocket s) {
System.out.println("Socket class: "+s.getClass());
System.out.println(" Remote address = "
+s.getInetAddress().toString());
System.out.println(" Remote port = "+s.getPort());
System.out.println(" Local socket address = "
+s.getLocalSocketAddress().toString());
System.out.println(" Local address = "
+s.getLocalAddress().toString());
System.out.println(" Local port = "+s.getLocalPort());
System.out.println(" Need client authentication = "
+s.getNeedClientAuth());
SSLSession ss = s.getSession();
System.out.println(" Cipher suite = "+ss.getCipherSuite());
System.out.println(" Protocol = "+ss.getProtocol());
}
private static void printServerSocketInfo(SSLServerSocket s) {
System.out.println("Server socket class: "+s.getClass());
System.out.println(" Socket address = "
+s.getInetAddress().toString());
System.out.println(" Socket port = "
+s.getLocalPort());
System.out.println(" Need client authentication = "
+s.getNeedClientAuth());
System.out.println(" Want client authentication = "
+s.getWantClientAuth());
System.out.println(" Use client mode = "
+s.getUseClientMode());
}
public static void main(String args[]){
MServer m = new MServer();
m.execute();
}
}
和客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class ReqResServer {
private BufferedWriter w1 = null;
private BufferedWriter w2 = null;
private BufferedReader r1 = null;
private BufferedReader r2 = null;
private SSLSocket c1 = null;
private SSLSocket c2 = null;
private int port = 24910;
public void doClient(){
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
System.out.println("f created");
try {
c1 = (SSLSocket) f.createSocket("127.0.0.1", 10579);
System.out.println("c1 created");
printSocketInfo(c1);
c1.startHandshake();
w1 = new BufferedWriter(new OutputStreamWriter(c1.getOutputStream()));
r1 = new BufferedReader(new InputStreamReader(c1.getInputStream()));
w1.write("hi");
System.out.println("hi");
String str = r1.readLine();
System.out.println("before if " + str);
if(str.equals("Connection OK")){
//do something
System.out.println(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void printSocketInfo(SSLSocket s) {
System.out.println("Socket class: "+s.getClass());
System.out.println(" Remote address = "
+s.getInetAddress().toString());
System.out.println(" Remote port = "+s.getPort());
System.out.println(" Local socket address = "
+s.getLocalSocketAddress().toString());
System.out.println(" Local address = "
+s.getLocalAddress().toString());
System.out.println(" Local port = "+s.getLocalPort());
System.out.println(" Need client authentication = "
+s.getNeedClientAuth());
SSLSession ss = s.getSession();
System.out.println(" Cipher suite = "+ss.getCipherSuite());
System.out.println(" Protocol = "+ss.getProtocol());
}
public static void main(String args[]){
ReqResServer req1 = new ReqResServer();
req1.doClient();
}
}
这是输出:服务器控制台:
Server created on port 10579
Server socket class: class sun.security.ssl.SSLServerSocketImpl
Socket address = /127.0.0.1
Socket port = 10579
Need client authentication = false
Want client authentication = false
Use client mode = false
Socket class: class sun.security.ssl.SSLSocketImpl
Remote address = /127.0.0.1
Remote port = 51297
Local socket address = /127.0.0.1:10579
Local address = /127.0.0.1
Local port = 10579
Need client authentication = false
Cipher suite = TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
Protocol = TLSv1.2
in m
null
即。它不会打印 hi
并继续正常运行。和客户端控制台:
f created
c1 created
Socket class: class sun.security.ssl.SSLSocketImpl
Remote address = /127.0.0.1
Remote port = 10579
Local socket address = /127.0.0.1:51297
Local address = /127.0.0.1
Local port = 51297
Need client authentication = false
Cipher suite = TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
Protocol = TLSv1.2
hi
这显然意味着 w1.write("hi")
正在执行。
那么,为什么代码不继续执行呢?我在这上面花了 3 个多小时,但一无所获。它有点详尽,但任何帮助将不胜感激。
最佳答案
首先,您使用的是 BufferedWriter,这意味着您写入其中的任何内容可能不会立即刷新。那么你只写hi
,也就是说你写了这两个字符而不是行尾。但是在执行 readLine 时会等待行结束。该函数需要一个完整的行,其中包括行尾。仅当接收到线路结束或套接字关闭时才会返回。
关于java - readLine() 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336190/
这个问题在这里已经有了答案: What could be the reason that `require` doesn't work in some places? (3 个回答) 6 个月前关闭。
我正在使用读取行从维基百科获取一些文本。但读取行仅返回列表,而不是我想要的文本。有什么方法可以使用替代方案或解决我的问题吗? public class mediawiki { public s
我正在编写一小段代码,其中涉及使用子进程运行一个脚本来监听一些实时数据 这是我的代码: def subscriber(): try: sub = subprocess.Pope
我已包括: #include "stdio.h" #include #include 我的编译器包含标志 -lreadline 但我仍然收到错误消息: fatal error: 'readl
使用 Term::Readline::readline 停止无限循环的正确方法是什么? ? 这样我一个都看不懂 0 #!/usr/bin/env perl use warnings; use stri
标题比我的实际目标更具体: 我有一个使用 GNU Readline 的命令行程序,主要用于命令历史记录(即使用向上箭头检索以前的命令)和其他一些细节。现在,程序的输出似乎散布在用户的输入中,有时是可以
在 ipython 中,如果我按“esc”,然后按“enter”(可能还有其他字符?),读行会中断。我无法再使用“向上”键搜索命令历史记录,并且某些命令(例如 control-K)失败。 有没有办法在
我在使用 readlines() 和 readline() 返回值时遇到问题,但在使用 read() 时却没有。任何人都知道这是怎么发生的?欣赏一下 with open('seatninger.txt
标题比我的实际目标更具体: 我有一个使用 GNU Readline 的命令行程序,主要用于命令历史记录(即使用向上箭头检索以前的命令)和其他一些细节。现在,程序的输出似乎散布在用户的输入中,有时是可以
我正在编写一个聊天客户端,它必须在接收用户输入的同时输出接收到的消息。 到目前为止,我已经 fork 成两个独立的进程,其中一个继续监听套接字连接并用 printf 写出接收到的字符串。另一个使用 r
我在 NetworkStream 上使用 StreamReader,我只想读取一行或多行,而另一个数据是 byte array(如文件数据)我不想在 StreamReader 中读取该文件数据,例如我
我遇到了这两个 API,用于在 C# 的简单控制台应用程序中读取用户的输入: System.Console.ReadLine() System.Console.In.ReadLine() 这是一个我试
yum 我的系统显示已安装 readline rlwrap-0.41]$ sudo yum install readline Loaded plugins: fastestmirror, presto
我尝试做 this tutorial在 Rust 中,到目前为止,我在将 C 库连接到 Rust 时遇到了很多问题。 C 等效代码: #include #include #include #in
我正在寻找 web Python的标题中提到的命令及其区别;但是,我并不满足于对这些命令有完整的基本理解。 假设我的文件只有以下内容。 This is the first time I am posi
你如何在 F# 中使用 Console.Readline?与 Console.Writeline 不同,当我调用它时,它并没有受到尊重。 最佳答案 如果你使用 let s = Console.Read
在一次面试中,面试官问我为什么 readline() 比 Python 中的 readlines() 慢很多? 我回答的是readlines()需要多次读取,需要更多的开销。 不知道我的回答对不对。
要在 OSX Lion 上完全运行 ipython 需要什么?我试图让 ipython 与 readline 一起工作,但没有成功。 我的做法: (在虚拟环境中) pip install ipytho
在 Nodejs 文档中,我看到: import EventEmitter from 'events'; import { readFile } from 'fs'; import fs, { rea
我写了一个简单的应用程序: #include #include #include #include int main() { char *user_input; while(u
我是一名优秀的程序员,十分优秀!