给一个陌生人做的作业,
要求如下:
编写一个TCP Socket程序,采用图形化的界面实现,在服务器可输入客户端的IP地址和端口号,程序根据该IP地址和端口号与客户端建立连接,在服务器端输入要发送的内容点击发送按钮,就可以发送到客户端,客户端只接收服务器端发送的消息。
正好在学SWT, 就一边学一边写了,可以到这里去下载源代码http://www.eclipseworld.org/bbs/read.php?tid=10290
凭记忆总结一下期间碰到的问题,一个是如果button要处理一个可能会阻塞或耗时的事件,那个事件处理的需要放在一个新的Thread里边。不然的话。界面没法响应其它的操作。
另外如果要在新的线程里操作SWT中的元素比如文本框。必须像下面这样处理。
display.asyncExec(new Runnable() {
public void run() {
listenButton.setEnabled(false);
}
});
否则会抛出好像是什么invalid access的异常。
最后在进行Socket编程的时候要把防火墙关掉。否则会抛出JVM_bind之类等莫名其妙的错误
哈哈,今天又发现了一个问题。。就是改成keyReleased() 以后。。还是要按照那个回贴的人来做。String text = sendText.getText().trim() + lineS;
因为如果发送的消息末尾没有line.separator的话。。在客户端
BufferedReader in = new BufferedReader(
new InputStreamReader(socket
.getInputStream()));
while (true) {
String str;
while ((str = in.readLine()) != null) {
append(lineS + str);
}
Thread.sleep(500);
}
就收不到?。消息的末端必须要有断行符!呵呵。这样in.readLine()才算读到行尾才会打出来 。可以做一个试验。输入a,点按钮,client没反应,再输入b,点按钮,client没反应,再输入c, 这次用Ctrl + Enter发送。这样client一次打印出abc来。。呵呵 。!!明白了 !!!!!