论坛首页 Java版 企业应用

如何在一个web app中初始化一个多线程的socket server

浏览 4638 次
精华帖 (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>
则系统会停止在那,不知道为什么?
   
时间:2007-07-27
ReceiveServer server =new ReceiveServer(); 有死循环呀.....

将死循环放到另外一个线程,在init仅仅是启动了该线程,马上返回,控制权返回给servlet容器。
   
0 请登录后投票
时间:2007-07-27
初始化socketchennel, 并监听一个端口,就可以了.
不过多线程不是很简单的.
多用用1.5的并发包
   
0 请登录后投票
时间:2007-07-30
galaxystar 写道
初始化socketchennel, 并监听一个端口,就可以了.
不过多线程不是很简单的.
多用用1.5的并发包
唔。。环境是1.4的....85
   
0 请登录后投票
时间:2007-07-30
shallon 写道
ReceiveServer server =new ReceiveServer(); 有死循环呀.....

将死循环放到另外一个线程,在init仅仅是启动了该线程,马上返回,控制权返回给servlet容器。


这样啊..我试试,不过能将一下原理么,为什么会产生死循环呢?
   
0 请登录后投票
时间: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)
这个有办法解决么?
   
0 请登录后投票
时间:2007-07-31
这种需求?不知道怎么说楼主才好
   
0 请登录后投票
时间:2007-08-02
liquidthinker 写道
这种需求?不知道怎么说楼主才好

唉,需求应该是这样的,我们有个终端设备,他刷卡了以后,发送一个socket请求到我们的web服务器,然后我们的web服务器得到请求后,到数据库作一些业务操作后,通过socket给这个终端设备返回成功或者失败的信息,并打印结果.

因为要操作数据库,如果单独将socket作为一个进程启动,这样在web服务器上不太好管理数据库链接,所以采用web方式.

不知道你有没有什么号的办法??
   
0 请登录后投票
时间:2007-08-02
guoping007 写道
liquidthinker 写道
这种需求?不知道怎么说楼主才好

唉,需求应该是这样的,我们有个终端设备,他刷卡了以后,发送一个socket请求到我们的web服务器,然后我们的web服务器得到请求后,到数据库作一些业务操作后,通过socket给这个终端设备返回成功或者失败的信息,并打印结果.

因为要操作数据库,如果单独将socket作为一个进程启动,这样在web服务器上不太好管理数据库链接,所以采用web方式.

不知道你有没有什么号的办法??


为什么不太好管理数据库连接????

另外,如果只是客户端到服务器的请求,没必要开个socket,直接发送一个http的请求就可以了。
   
0 请登录后投票
时间:2007-08-02
不必依赖web服务器,
单独起一个socket server,用spring管理一切
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐