打算用java做一个聊天室的服务器,从网上找了下面的程序,改动了一下,但是页面不能显示。如果不采用线程,在得到socket连接后,直接write,然后关闭,页面可以显示。高人解释一下啊,急!!!
代码如下:// Server.java
import java.io.*;
import java.net.*;
import java.util.*;public class Server
{
private ServerSocket ss;
private Hashtable outputStreams = new Hashtable();
public Server(int port) throws IOException
{
listen(port);
} private void listen(int port) throws IOException
{
ss = new ServerSocket(port);
System.out.println("Listening on " + ss);
while (true)
{
Socket s = ss.accept();
System.out.println("Connection from " + s); DataOutputStream pw = new DataOutputStream(s.getOutputStream());
//PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())));
Date date = new Date();
//java.util.Calendar
String headers = "HTTP/1.1 200 OK\nDate: " + date.toString() + "\n"
+ "Content-type:text/html\n" + "\n<html>\n<head>\n"
+ "<META http-equiv=Content-Type content=\"text/html; charset=gb2312\">"
+ "\n<title>TEST</title>\n</head>\n<body>\n";
//dout.write(headers.getBytes());
System.out.println(headers);
String msg = "<p>世界你好!</p>"; //pw.println(headers);
//pw.write(headers);
pw.write(headers.getBytes());
//pw.flush();
//pw.close();
outputStreams.put(s, pw);
new ServerThread(this, s).start();
}
} Enumeration getOutputStreams()
{
return outputStreams.elements();
} void sendToAll(String message)
{
synchronized (outputStreams)
{
for (Enumeration e = getOutputStreams(); e.hasMoreElements(); )
{
DataOutputStream pw = (DataOutputStream) e.nextElement();
//PrintWriter pw = (PrintWriter) e.nextElement();
try
{
//pw.flush();
//pw.println(message);
pw.write(message.getBytes());
pw.flush();
//pw.close();
}
catch (Exception ie)
{
System.out.println(ie);
}
}
}
} void removeConnection(Socket s)
{
synchronized (outputStreams)
{
System.out.println("Removing connection to " + s);
outputStreams.remove(s);
try
{
s.close();
}
catch (IOException ie)
{
System.out.println("Error closing " + s);
}
}
} static public void main(String args[]) throws Exception
{
try
{
int port = 8080;
new Server(port);
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}// ServerThread.java
import java.io.*;
import java.net.*;public class ServerThread
extends Thread
{
private Server server; private Socket socket; public ServerThread(Server server, Socket socket)
{
this.server = server;
this.socket = socket;
} public void run()
{
try
{
String message = "<p>世界你好!</p>";
//for (int i = 0; i < 10; i++)
//{
System.out.println("Sending " + message);
server.sendToAll(message);
//}
}
catch (Exception ie)
{
}
}
}
代码如下:// Server.java
import java.io.*;
import java.net.*;
import java.util.*;public class Server
{
private ServerSocket ss;
private Hashtable outputStreams = new Hashtable();
public Server(int port) throws IOException
{
listen(port);
} private void listen(int port) throws IOException
{
ss = new ServerSocket(port);
System.out.println("Listening on " + ss);
while (true)
{
Socket s = ss.accept();
System.out.println("Connection from " + s); DataOutputStream pw = new DataOutputStream(s.getOutputStream());
//PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())));
Date date = new Date();
//java.util.Calendar
String headers = "HTTP/1.1 200 OK\nDate: " + date.toString() + "\n"
+ "Content-type:text/html\n" + "\n<html>\n<head>\n"
+ "<META http-equiv=Content-Type content=\"text/html; charset=gb2312\">"
+ "\n<title>TEST</title>\n</head>\n<body>\n";
//dout.write(headers.getBytes());
System.out.println(headers);
String msg = "<p>世界你好!</p>"; //pw.println(headers);
//pw.write(headers);
pw.write(headers.getBytes());
//pw.flush();
//pw.close();
outputStreams.put(s, pw);
new ServerThread(this, s).start();
}
} Enumeration getOutputStreams()
{
return outputStreams.elements();
} void sendToAll(String message)
{
synchronized (outputStreams)
{
for (Enumeration e = getOutputStreams(); e.hasMoreElements(); )
{
DataOutputStream pw = (DataOutputStream) e.nextElement();
//PrintWriter pw = (PrintWriter) e.nextElement();
try
{
//pw.flush();
//pw.println(message);
pw.write(message.getBytes());
pw.flush();
//pw.close();
}
catch (Exception ie)
{
System.out.println(ie);
}
}
}
} void removeConnection(Socket s)
{
synchronized (outputStreams)
{
System.out.println("Removing connection to " + s);
outputStreams.remove(s);
try
{
s.close();
}
catch (IOException ie)
{
System.out.println("Error closing " + s);
}
}
} static public void main(String args[]) throws Exception
{
try
{
int port = 8080;
new Server(port);
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}// ServerThread.java
import java.io.*;
import java.net.*;public class ServerThread
extends Thread
{
private Server server; private Socket socket; public ServerThread(Server server, Socket socket)
{
this.server = server;
this.socket = socket;
} public void run()
{
try
{
String message = "<p>世界你好!</p>";
//for (int i = 0; i < 10; i++)
//{
System.out.println("Sending " + message);
server.sendToAll(message);
//}
}
catch (Exception ie)
{
}
}
}
解决方案 »
- 大家说说使用StringBuilder和StringBuffer的经验
- JDBC-ODBC连接ACCESS
- help, 超大String和byte[]
- 关于字符串中取值的问题?
- JB的问题?~~~急(在线)
- JCreator和JBuilder相比较的优缺点是什么?请大家赐教!
- 很菜的问题,小弟刚开始学JAVA,所以请各位不要见笑。
- 谁有jcreator pro的注册码?
- 小弟 开始学JAVA 大家给推荐几本书呀
- JDK目录下有bin、lib、jre文件夹,而其中的jre文件夹下又有bin、lib--------有什么不同啊________________________
- 怎样使得ResultSet对象的结果集不关闭!
- 请问怎么设置整个jtree的背景色和图标
DataOutputStream pw = new DataOutputStream(s.getOutputStream());
改为:
PrintStream pw = new PrintStream (s.getOutputStream());
看看