嗯,说实话,它只适用于一个客户,不知道为什么。客户端也会收到两到三次。 [我使用telnet作为客户端。当我启动另一个telnet会话时,它会保留,但它不会提供任何输出]。 如果需要,我会添加gui代码。
public static void main(String args[]) throws IOException {
String s;
initGUI();
try {
hostServer = new ServerSocket(port);
socket = hostServer.accept();
area.append(" "+socket+" connection\n");
changeStatusTS(CONNECTED, true);
} catch (IOException e) {
cleanUp();
changeStatusTS(DISCONNECTED, false);
}
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println(e);
}
while(true) {
multi ml = new multi(socket);
ml.start();
}
}
}
static class multi extends Thread{
public multi(Socket c) throws IOException {
socket = c;
}
public void run(){
String s;
switch (connectionStatus) {
case CONNECTED:
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
if (toSend.length() != 0) {
out.print(toSend); out.flush();
toSend.setLength(0);
changeStatusTS(NULL, true);
}
if (in.ready()) {
s = in.readLine();
if ((s != null) && (s.length() != 0)) {
if(s.equals("test")==true){
out.print("bazinga");
out.flush();
}
if (s.equals(END_CHAT_SESSION)) {
changeStatusTS(DISCONNECTING, true);
}
else {
appendToChatBox("INCOMING: " + s + "\n");
changeStatusTS(NULL, true);
}
}
}
}
catch (IOException e) {
cleanUp();
changeStatusTS(DISCONNECTED, false);
}
break;
case DISCONNECTING:
out.print(END_CHAT_SESSION);
out.flush();
cleanUp();
changeStatusTS(DISCONNECTED, true);
break;
default: break;
}
}
}
}
答案 0 :(得分:1)
我没有查看整个代码,但一个直接的问题似乎是你的服务器没有在循环中调用accept()
。我会将您的main
更改为以下内容:
public static void main(String args[]) throws IOException {
String s;
initGUI();
hostServer = new ServerSocket(port);
while (true) {
try {
// wait for the next client to connect
socket = hostServer.accept();
} catch (IOException e) {
cleanUp();
changeStatusTS(DISCONNECTED, false);
break;
}
area.append(" " + socket + " connection\n");
// you probably don't want this or you want this to be per client?
changeStatusTS(CONNECTED, true);
// start a multi thread on the accepted socket
Multi ml = new Multi(socket);
ml.start();
}
}
当客户端调用连接时,服务器的accept()
调用将返回,您的代码应创建一个新的Multi
线程来处理该连接。然后服务器应该循环并再次调用accept()
,等待下一个客户端连接。
希望这有帮助。
答案 1 :(得分:0)
带有sleep()的两个循环完全没有意义......
while (true) {
try {
Thread.sleep(10);
}
catch (InterruptedException e) {
System.out.println(e);
}
while(true){
multi ml = new multi(socket);
ml.start();
}
}
}
您应该学习一些简单开源服务器 - 客户端代码。这可能是一个好的开始: http://www.cn-java.com/download/data/book/socket_chat.pdf
另一个提示:不要开始使用处理线程进行混合表示(Swing GUI)。你会搞砸一切。首先尝试在没有任何GUI的情况下实现您的服务器。
答案 2 :(得分:0)
在没有评论您的代码(似乎有一些问题)的情况下,您应该在以下的Executor服务的javadocs中查看非常简单的套接字服务器示例:
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html