关于Servlet与Socket的问题

zebi 2002-04-25 03:43:10
我做了一个即时聊天程序,服务器是用Vc写的。用Vc写了一个客户端,在这种C/S的结构下一切Ok。

我想做一个B/S的,同样的服务器,用Servlet做客户端,并且让两个客户端(C/S B/S)能通信,望大家给点思路!

我刚开始就发现几个问题:

1.Servlet能否与VC的服务器持续连接,如能具体怎么做?
2.服务器怎么给Servlet客户端发信息,并能标识是发给谁的?
3.怎么将服务器发来的信息写到客户端?
....

谢谢!
...全文
311 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdsc 2002-05-06
  • 打赏
  • 举报
回复
你所想象的即时聊天程序用你所希望用的方法无法实现:

1。servlet基于http协议的,http协议是无连接的。
2。一个servlet的方法一次服务一个用户。

zebi 2002-04-29
  • 打赏
  • 举报
回复
什么?
hongbo_liu 2002-04-28
  • 打赏
  • 举报
回复
gz
hymmyh 2002-04-27
  • 打赏
  • 举报
回复
while(true)
{
try{
strTmp = ms.ReadData();
if(strTmp==null) break;
strData = strData + strTmp + "<br>";
//加上如下2句
out.println(strData);
out.flush();
}catch(Exception e){
break;
}
}
为什么While循环不会结束呢?

是不会断的,除非你的sock 断了。
hymmyh 2002-04-27
  • 打赏
  • 举报
回复
while(true)
{
try{
strTmp = ms.ReadData();
if(strTmp==null) break;
strData = strData + strTmp + "<br>";
//加上如下2句
out.println(strData);
out.flush();
}catch(Exception e){
break;
}
}
dylanwolf 2002-04-27
  • 打赏
  • 举报
回复
你的 ms 是在 Init() 里建立的吗?

如果和 Server 的连接没有断的话, ReadData()返回的值可能不会为null(猜测? 有待各位验证)。

如果是这样的话, 你可以每次读取一定数目行数(比如:10行), 就结束。
zebi 2002-04-27
  • 打赏
  • 举报
回复
public class MsgSocket extends Socket {

public InputStream in;
public OutputStream out;
public BufferedReader br;
public PrintWriter pw;

public MsgSocket(String hostName,int PORT) throws UnknownHostException, IOException
{
super(hostName,PORT);
try{
in = this.getInputStream();
out = this.getOutputStream();
br = new BufferedReader(new InputStreamReader(in));
pw = new PrintWriter(out,true);
}catch(Exception e){
System.out.println(e);
}
}

public MsgSocket()
{
super();
}

public void Start()
{
}


public String ReadData()
{
String strData = "";
try{
strData = br.readLine();
return strData;
}catch(Exception e){
return null;
}
}

public void SendData(String strSend){
pw.println(strSend);
}
}

以上是我继承的Sock类,用ReadData()从服务器中读取数据。

我在Servlet中是这样写的,

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType(CONTENT_TYPE);
out = response.getWriter();
out.println("<html>");
out.println("<head><title>chatServlet</title></head>");
out.println("<meta http-equiv=\"refresh\" content=\"10\">");
out.println("<body>");
String strTmp;
String strData = "";

while(true)
{
try{
strTmp = ms.ReadData();
if(strTmp==null) break;
strData = strData + strTmp + "<br>";
}catch(Exception e){
break;
}
}
out.println("</body></html>");
}

为什么While循环不会结束呢?服务器只发送了"Hello World"一句话。
请大侠们帮帮我,给看看到底是哪的问题,谢谢!
zebi 2002-04-27
  • 打赏
  • 举报
回复
找不到 method : flush()!
hccpro 2002-04-25
  • 打赏
  • 举报
回复
写到servlet上,客户端就能看到了。
ifrank 2002-04-25
  • 打赏
  • 举报
回复
给客户端生成一个无限长的html(不断的输出),并且隔一段时间自动刷新。
zebi 2002-04-25
  • 打赏
  • 举报
回复
那我具体怎么写到客户端的浏览器里呢?
客户端的浏览器得刷新吗?
dylanwolf 2002-04-25
  • 打赏
  • 举报
回复
Servlet可以通过Session 识别 Browse 客户端,

你可以在 doGet()中 通过 session.getAttribute("user") 读取或设置 session.setAttribute("user", idUser);来标识.



dylanwolf 2002-04-25
  • 打赏
  • 举报
回复
在 Web Server 中, Server 启动后,只会实例化一个 Servlet Instance, 所以标识应该没有问题.

比如说, 你建了一个 InterSocketServlet, 那么 Server 中就只会有一个 InterSocketSrevlet 的实例, 并不是一个 B 一个 InterSocketServlet.

你可以在InterSocketServlet 设立一个socket成员变量 , 在ServletInit方法中就建立和 VC Socket Server 的连接, 这样, 该连接就和 该 Servlet的生命周期一样了.

zebi 2002-04-25
  • 打赏
  • 举报
回复
是的,我是想将Servlet做为与Socket通讯的客户端!望指点!谢谢
dylanwolf 2002-04-25
  • 打赏
  • 举报
回复
Servlet作为客户端?

Servlet也是运行在服务器上的, 你是说 Servlet作为Socket通讯的客户端吗?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧