简易聊天程序中,C/S架构中C端通过能实现断开重连,为什么重连后不能接受服务端的对象。

问题描述

C/S描述:C端发送文本对象到S端,S端接受文本对象,并负责将文本对象发送到每个C端并显示。问题:现在通过try/catch捕获socket连接异常后,用调用原来的连接实现重连后,S端能接收到C端的对象且能将文本发送到C端。但是C端的接收消息的线程好像不能被重新打开,即C端不能接收S端的对象了。C/S架构中C端通过能实现断开重连,为什么重连后不能接受服务端的对象。importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.net.*;publicclassTestConnectextendsFrame{Sockets=null;DataOutputStreamdos=null;DataInputStreamdis=null;privatebooleanbConnected=false;TextFieldtfText=newTextField();TextAreataContent=newTextArea();ThreadtRecv=newThread(newRecvThread());publicvoidLFrame(){//画出窗口;setLocation(400,300);setSize(300,300);add(tfText,BorderLayout.SOUTH);add(taContent,BorderLayout.NORTH);pack();this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){disconnect();System.exit(0);}});tfText.addActionListener(newTFListener());setVisible(true);}publicvoidlaunchFrame(){connect();//调用connect方法,启Socket连接;tRecv.start();//启接收消息的线程;}publicvoidconnect(){try{s=newSocket("122.233.2.82",9990);dos=newDataOutputStream(s.getOutputStream());dis=newDataInputStream(s.getInputStream());bConnected=true;System.out.println("connect!");}catch(SocketExceptione){System.out.println("连接服务器异常");//disconnect();这句加上不加上都一样,关闭流;下同launchFrame();}catch(IOExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){TestConnectjjj=newTestConnect();jjj.LFrame();jjj.launchFrame();}publicvoiddisconnect(){//关闭输入输出流、线程;try{dos.close();dis.close();s.close();}catch(IOExceptione){e.printStackTrace();}}privateclassTFListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){Stringstr=tfText.getText().trim();tfText.setText("");try{dos.writeUTF(str);dos.flush();}catch(IOExceptione1){e1.printStackTrace();}}}privateclassRecvThreadimplementsRunnable{//消息接收线程publicvoidrun(){try{while(bConnected){Stringstr=dis.readUTF();taContent.setText(taContent.getText()+str+"n");}}catch(SocketExceptione){//disconnect();这句加上不加上都一样,关闭流;下同launchFrame();System.out.println("退出");}catch(Exceptione){e.printStackTrace();}}}}

第一次发帖:求大神罩

解决方案

解决方案二:
自顶,求大神
解决方案三:
看看线程start方法的描述吧,Throws:IllegalThreadStateException-ifthethreadwasalreadystarted.也就是说当线程正在运行时则调用start方法抛出异常。你的代码中在trycatch中调用launchFrame方法,而这时线程还未结束。所以不能启动。在每次启动线程是都重新创建一个线程对象即可。修改代码如下:publicvoidlaunchFrame(){connect();//调用connect方法,启Socket连接;tRecv=newThread(newRecvThread());tRecv.start();//启接收消息的线程;}

解决方案四:
引用2楼zyb134506的回复:

看看线程start方法的描述吧,Throws:IllegalThreadStateException-ifthethreadwasalreadystarted.也就是说当线程正在运行时则调用start方法抛出异常。你的代码中在trycatch中调用launchFrame方法,而这时线程还未结束。所以不能启动。在每次启动线程是都重新创建一个线程对象即可。修改代码如下:publicvoidlaunchFrame(){connect();//调用connect方法,启Socket连接;tRecv=newThread(newRecvThread());tRecv.start();//启接收消息的线程;}

还是不行。我试了。我把Serve端的代码也给出来吧,希望大神帮我解决,有点急。。。importjava.io.*;importjava.net.*;importjava.util.*;publicclassServerTest{booleanstarted=false;ServerSocketss=null;Sockets=null;DataInputStreamdis=null;List<client>clients=newArrayList<client>();publicstaticvoidmain(String[]args){newServerTest().start();}publicvoidstart(){try{ss=newServerSocket(9990);started=true;}catch(BindExceptione){System.out.println("端口使用中!");System.out.println("请关掉相关程序");System.exit(0);}catch(IOExceptione2){e2.printStackTrace();}try{while(started){s=ss.accept();clientc=newclient(s);System.out.println("aclientconnected!");newThread(c).start();clients.add(c);//dis.close();}}catch(IOExceptione){try{s=ss.accept();}catch(IOExceptione1){e1.printStackTrace();}//e.printStackTrace();}finally{try{ss.close();}catch(IOExceptione1){e1.printStackTrace();}}}classclientimplementsRunnable{privateSockets;privateDataInputStreamdis=null;privateDataOutputStreamdos=null;privatebooleanbConnected=false;publicclient(Sockets){this.s=s;try{dis=newDataInputStream(s.getInputStream());dos=newDataOutputStream(s.getOutputStream());bConnected=true;}catch(IOExceptione){e.printStackTrace();}}publicvoidsend(Stringstr){try{dos.writeUTF(str);}catch(IOExceptione){clients.remove(this);e.printStackTrace();}}publicvoidrun(){try{while(bConnected){Stringstr=dis.readUTF();System.out.println(str);for(inti=0;i<clients.size();i++){clientc=clients.get(i);c.send(str);}/*for(Iterator<client>it=clients.iterator();it.hasNext();){clientc=it.next();c.send(str);}*/}}catch(EOFExceptione){System.out.println("Clientclosed!");}catch(IOExceptione){e.printStackTrace();}finally{try{if(dis!=null)dis.close();if(dos!=null)dos.close();if(s!=null){s.close();s=null;}}catch(IOExceptione1){e1.printStackTrace();}clients.remove(this);}}}}

解决方案五:
建议楼主用框架来做,你可以用MINA或NETTY来做通讯框架。
解决方案六:
有没有人啊。求解决
解决方案七:
一般c/s架构都用什么框架做。本人新手
解决方案八:
没人了么?求解释啊
解决方案九:
在重新链接之前把旧的链接关掉。
解决方案十:
额,不是那个原因,谢谢了。我自己解决了。。。

时间: 2024-09-16 21:18:42

简易聊天程序中,C/S架构中C端通过能实现断开重连,为什么重连后不能接受服务端的对象。的相关文章

java-关于web中的文件框,上传后如何在服务端获得文件在本地电脑上的位置

问题描述 关于web中的文件框,上传后如何在服务端获得文件在本地电脑上的位置 网页上的文件框选择了本地文件之后,点击上传,能在服务端接收到文件在我本地电脑上的位置么,怎么弄 解决方案 不同的浏览器不一样,不是所有浏览器都可以获得上传文件的本地路径.一个合乎标准的web程序不要期待可以获得文件的本地位置.如果你限定程序只支持pc,windows,使用IE内核,可以用fso获取. 解决方案二: 你获取客户端路径没有意义,安全性问题已经不回发客户端路径了 解决方案三: 获得上传文件file,有方法可以

scp ssh io-SCP执行到100%后卡住,服务端中文件缺少部分

问题描述 SCP执行到100%后卡住,服务端中文件缺少部分 从linux中scp到 cygwn时,时有发生卡在100%的问题 通过查看进程信息,得知client与server端的ssh连接未关闭: 有个方向: 通过查看成功scp文件的strace信息,发现一般read 数据大小为16324.49152,这些都是1024的倍数. 而scp失败的情况下,出现了read 32767(32768=1024*32).同时在网上查到,如果文件里出现''会发生pipe end的情况. 所以猜想文件传输过程中是

进入聊天室后能控制服务端不发默认的10条消息吗?

问题描述 退出聊天室后又重新进入聊天室,默认会收到服务端推的10条消息,很多是重复的信息,不想显示,但客户端又不太好判断哪些是初始进入时的消息,请问有办法控制不发这10条消息吗? 解决方案 进入聊天室后,服务端会默认推送10条消息,这个设置不了,是服务端默认推送的

WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直无暇管理自己的Blog.到目前为止<WCF技术剖析(卷1)>的写作暂告一段落,初步预计于下个月由武汉博文视点出版.在<WCF技术剖析>写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列.本系列的目的在于对<WCF技术剖析>的补充,会对书中的一些内容进行展开讲述,同时会囊括很多由于篇幅的原因忍痛割弃的内容. 本系列的第一篇,我

RequireJS简易绘图程序开发_javascript技巧

前言 RequireJS的出现让前端代码模块化变得容易,当前端项目越来越大,代码越来越多的时候,模块化代码让项目结构更清晰,不仅在开发时让我们的思路更清晰,而且后期维护起来也更容易.下面是我学习RequireJS后使用RequireJS开发的一款简易绘图程序,运行在浏览器中如下图所示: 如果你对RequireJS还不是很了解,可以看我的RequireJS学习笔记:http://blog.csdn.net/yubo_725/article/details/52913853 开始 这个简易绘图程序的

详解基于java的Socket聊天程序——客户端(附demo)_java

写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细设计和Common模块记录一下,因为这个周末开始就要去忙其他东西了. 设计: 客户端设计主要分成两个部分,分别是socket通讯模块设计和UI相关设计. 客户端socket通讯设计: 这里的设计其实跟服务端的设计差不多,不同的是服务端是接收心跳包,而客户端是发送心跳包,由于客户端只与一个服务端进行通

mq-IBM MQ 中怎么区分作为客户端时第三方响应的消息和作为服务端时第三方发过来的请求消息

问题描述 IBM MQ 中怎么区分作为客户端时第三方响应的消息和作为服务端时第三方发过来的请求消息 求大神指教,mq是怎么区分当自己作为客户端时主动请求时服务端返回的消息 和自己作为服务端时别人的请求消息的?也就是说怎么不会把服务端返回的消息认为是第三方 主动请求的请求消息的 解决方案 http://www.cnblogs.com/flydragon0815/articles/4449842.html

[100分]求ms ajax中关于js 调用服务端代码的方法

问题描述 以前用AjaxPro好像很容易,但换成MsAjax后不知该怎么做.要能实现异步回传的,就是在页面中使用了UpdatePanel控件.我提问一般都是给100分的.知道的快来吧. 解决方案 解决方案二:没用过.解决方案三:该回复于2008-04-10 08:33:57被版主删除解决方案四:没用过.解决方案五:该回复于2008-04-10 08:33:55被版主删除解决方案六:我现在正在学一本书叫asp.netajax程序设计第II卷microsoftajaxlibrary异步通信层是陈黎夫

C# Winform WCF 调试服务端的程序(三种方法)

推荐方法三 方法一: 服务端设置: 1.打开需要调试的解决方案,在WCF服务端项目上右键,将其设置为启动项目 2.在该解决方案下点击 或者直接按F5启动WCF服务端项目. 3.寻找端口号: i.方式一 启动调试后,浏览器中会出现下面的界面 需要留意的是地址栏中的端口号. ii.方式二: 在启动WCF服务项目后,在桌面的右下角会出现,如下面所示的图标: 在这里也可以看到端口号,由于我是重新启动了一次WCF项目,所以显示的端口号与在浏览器中显示的是不一样的. 客户端设置: 4.再次打开该解决方案,将