我正在尝试使用JSF创建一个带有Web UI的套接字客户端。在此应用程序中,客户端连接到服务器,将消息发送到服务器,从服务器接收消息并将其显示在JSF页面上。
我设法连接到套接字服务器发送消息并接收消息。我无法在浏览器屏幕中显示来自服务器的消息。当我在控制台中打印时,它显示正确。
我的jsf代码是:
<f:view>
<h:form binding="#{jsfSocketClient.form}">
<a4j:keepAlive beanName="jsfSocketClient"/>
<h:outputText binding="#{jsfSocketClient.outputMessageBinding}"/>
<br/>
<h:inputText value="#{jsfSocketClient.inputFromUser}"/>
<br/>
<h:commandButton action="#{jsfSocketClient.sendMessage}" value="Send"/>
</h:form>
</f:view>
我的java代码是:
public HtmlForm getForm() {
try {
socket = new Socket("192.168.1.115", 4444);
response = "Connection Success";
outputMessageBinding.setValue("Connection Success");
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception e) {
e.printStackTrace();
response = "You must first start the server application (YourServer.java) at the command prompt.";
outputMessageBinding.setValue(response);
}
return form;
}
public String sendMessage() {
outputMessageBinding.setValue("");
try {
//String str = "Hello!\n";
out.println(getInputFromUser());
try {
String line = in.readLine();
outputMessageBinding.setValue(line);
System.out.println("Text received :" + line);
} catch (IOException e) {
outputMessageBinding.setValue(e.getMessage());
System.out.println("Read failed");
System.exit(1);
}
//response = result.toString();
if (getInputFromUser().equalsIgnoreCase("bye")) {
socket.close();
}
} catch(Exception e) {
outputMessageBinding.setValue(e.getMessage());
e.printStackTrace();
}
return "";
}
当我加载jsf页面时,如果服务器已连接并且连接成功&#39;显示正确,如果未连接,则错误消息正确显示。当我尝试在屏幕上显示服务器消息时,它不会显示。我该如何解决这个问题?
更新 如果我创建新的outputtext组件并将来自服务器的消息设置为其值,则服务器消息将正确显示。我想知道为什么绑定在我的情况下不起作用?
答案 0 :(得分:2)
从JSF /网页打开新套接字是一个主要的反模式。你为什么要这样做?
您是否了解所有影响/限制/风险/问题?
<强>更新强>
从网页创建套接字在性能和安全性方面有几个含义。
如果您只想练习Java套接字,最简单的方法是使用命令行客户端。 http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html
无需使用JSF或任何其他Web技术添加额外的复杂性。您可以拥有没有Web服务器的套接字。 (实际上套接字在http之前很久就存在了。)