|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-07-27 关键字: socket server
如何在一个web app中初始化一个多线程的socket server,
public class ReceiveServer {
final int RECEIVE_PORT = 4444;
// 该服务器的端口号
// receiveServer的构造器
public ReceiveServer() {
ServerSocket rServer = null;
// ServerSocket的实例
Socket request = null; // 用户请求的套接字
Thread receiveThread = null;
try {
rServer = new ServerSocket(RECEIVE_PORT);
// 初始化ServerSocket
System.out.println("Welcome to the server!");
System.out.println(new Date());
System.out.println("The server is ready!");
System.out.println("Port: " + RECEIVE_PORT);
while (true) { // 等待用户请求
request = rServer.accept();
// 接收客户机连接请求
receiveThread = new serverThread(request);
// 生成serverThread的实例
receiveThread.start();
// 启动serverThread线程
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String args[]) {
new ReceiveServer();
} // end of main
} // end of class
// 类serverThread
class serverThread extends Thread {
Socket clientRequest;
// 用户连接的通信套接字
BufferedReader input; // 输入流
PrintWriter output; // 输出流
public serverThread(Socket s) { // serverThread的构造器
this.clientRequest = s;
// 接收receiveServer传来的套接字
InputStreamReader reader;
OutputStreamWriter writer;
try { // 初始化输入、输出流
reader = new InputStreamReader(clientRequest.getInputStream());
writer = new OutputStreamWriter(clientRequest.getOutputStream());
input = new BufferedReader(reader);
output = new PrintWriter(writer, false);
} catch (IOException e) {
e.getMessage();
System.exit(0);
}
// output.println("Welcome to the server!");
// // 客户机连接欢迎词
// output.println("Now is: " + new java.util.Date() + " " + "Port:"
// + clientRequest.getLocalPort());
// output.println("What can I do for you?");
}
public void run() { // 线程的执行方法
try {
PrintWriter out = new PrintWriter(clientRequest.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientRequest.getInputStream()));
String inputLine, outputLine;
outputLine = "fkfkfffjkfjkfjk";
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
out.println(outputLine);
if (outputLine.equals("Bye"))
break;
}
out.close();
in.close();
clientRequest.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MessageServlet public void init(ServletConfig cfg) throws ServletException {
super.init(cfg);
ReceiveServer server =new ReceiveServer();
}
<servlet> <servlet-name>mss</servlet-name> <servlet-class>web.servlet.MessageServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 则系统会停止在那,不知道为什么? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-07-27
ReceiveServer server =new ReceiveServer(); 有死循环呀.....
将死循环放到另外一个线程,在init仅仅是启动了该线程,马上返回,控制权返回给servlet容器。 |
|
| 返回顶楼 | |
|
时间:2007-07-27
初始化socketchennel, 并监听一个端口,就可以了.
不过多线程不是很简单的. 多用用1.5的并发包 |
|
| 返回顶楼 | |
|
时间:2007-07-30
galaxystar 写道 初始化socketchennel, 并监听一个端口,就可以了. 唔。。环境是1.4的....85
不过多线程不是很简单的. 多用用1.5的并发包 |
|
| 返回顶楼 | |
|
时间:2007-07-30
shallon 写道 ReceiveServer server =new ReceiveServer(); 有死循环呀.....
将死循环放到另外一个线程,在init仅仅是启动了该线程,马上返回,控制权返回给servlet容器。 这样啊..我试试,不过能将一下原理么,为什么会产生死循环呢? |
|
| 返回顶楼 | |
|
时间:2007-07-30
guoping007 写道 shallon 写道 ReceiveServer server =new ReceiveServer(); 有死循环呀.....
将死循环放到另外一个线程,在init仅仅是启动了该线程,马上返回,控制权返回给servlet容器。 这样啊..我试试,不过能将一下原理么,为什么会产生死循环呢? 原来问题是出在这: request = rServer.accept(); 这里是个while的死循环,把他移动到run里就好了。 另外,在请教个问题,如果客户端异常退出,服务器端就报: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411) at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at com.huaat.ticket.socket.serverThread.runThread(DMSocketServer.java:103) at com.huaat.ticket.socket.serverThread.run(DMSocketServer.java:75) 这个有办法解决么? |
|
| 返回顶楼 | |
|
时间:2007-07-31
这种需求?不知道怎么说楼主才好
|
|
| 返回顶楼 | |
|
时间:2007-08-02
liquidthinker 写道 这种需求?不知道怎么说楼主才好
唉,需求应该是这样的,我们有个终端设备,他刷卡了以后,发送一个socket请求到我们的web服务器,然后我们的web服务器得到请求后,到数据库作一些业务操作后,通过socket给这个终端设备返回成功或者失败的信息,并打印结果. 因为要操作数据库,如果单独将socket作为一个进程启动,这样在web服务器上不太好管理数据库链接,所以采用web方式. 不知道你有没有什么号的办法?? |
|
| 返回顶楼 | |
|
时间:2007-08-02
guoping007 写道 liquidthinker 写道 这种需求?不知道怎么说楼主才好
唉,需求应该是这样的,我们有个终端设备,他刷卡了以后,发送一个socket请求到我们的web服务器,然后我们的web服务器得到请求后,到数据库作一些业务操作后,通过socket给这个终端设备返回成功或者失败的信息,并打印结果. 因为要操作数据库,如果单独将socket作为一个进程启动,这样在web服务器上不太好管理数据库链接,所以采用web方式. 不知道你有没有什么号的办法?? 为什么不太好管理数据库连接???? 另外,如果只是客户端到服务器的请求,没必要开个socket,直接发送一个http的请求就可以了。 |
|
| 返回顶楼 | |
|
时间:2007-08-02
不必依赖web服务器,
单独起一个socket server,用spring管理一切 |
|
| 返回顶楼 | |








