问题描述
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架构都用什么框架做。本人新手
解决方案八:
没人了么?求解释啊
解决方案九:
在重新链接之前把旧的链接关掉。
解决方案十:
额,不是那个原因,谢谢了。我自己解决了。。。