肝胆相照论坛

 

 

肝胆相照论坛 论坛 电脑技术 有关线程的问题
查看: 865|回复: 2
go

有关线程的问题 [复制链接]

现金
14 元 
精华
帖子
2 
注册时间
2009-3-13 
最后登录
2009-3-16 
1
发表于 2009-3-14 00:28 |只看该作者 |倒序浏览 |打印
劳烦各位大虾帮我看看:
package server;
//server端的程序如下:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class MySocketServer                          //Java Application主类
{
public static void main(String args[])
{
//  ServerService MyServer=
  new ServerService(8000,10);//建立监听服务
  }
}

class ServiceThread extends Frame implements Runnable
{                                //当有Client请求时,Server创建一个Frame用于与之交互数据
ServerService FatherListener;                   //创建当前通信线程的监听器对象
Socket ConnectedClient;                         //负责当前线程中C/S通信的Socket对象
Thread ConnectThread;                           //负责通信的线程
Panel ListenerPanel;                            //本次通信Server端的信息显示窗口
PrintWriter out;
BufferedReader in;                           
TextArea ServerMeg;                             //信息显示窗口
TextField textF;
Button MyButton;
String s,o;
public ServiceThread(ServerService sv,Socket sc)  //构造函数
{
  FatherListener=sv;
  ConnectedClient=sc;
  ConnectThread=new Thread(this);
  setTitle("Answer Client");                    //建立并显示Server端信息显示窗口
  setLayout(new BorderLayout());
  ServerMeg=new TextArea(10,50);
  textF=new TextField();
  MyButton=new Button("发送");
  MyButton.addActionListener(new ActionListener()//内部类,用于监听MyButton
                               {
                                public void actionPerformed(ActionEvent e)
                                 {                                                                                                                        
                                o=textF.getText();
                                 try{
                                    out.println(o);
                                    textF.setText("");
                                    ServerMeg.append(o);
                                    out.flush();
                                    }catch(Exception ex){}
                                  }
                                });
  add("Cneter",ServerMeg);
  add("South",textF);
  add("East",MyButton);
  setResizable(false);                         //不可改变窗口大小
  pack();
  setVisible(true);                                     //获得请求服务的Client端计算机的IP地址
  InetAddress ClientAddress=ConnectedClient.getInetAddress();
  ServerMeg.append("Client connected"+"from\n"+ClientAddress.toString()+".\n");
  }

public void run()                             //子线程任务:与client端通信
{
  try{
       in=new BufferedReader(   //获得从Client端读入数据流
                         new InputStreamReader(ConnectedClient.getInputStream()));
            
       out=new PrintWriter(ConnectedClient.getOutputStream());//获得向Client端输出的数据流
           
       out.println("Hello! Wellcome connect to our server!\r");
       out.flush();                           //向Client端输出信息      
       s=in.readLine();                       //从Client端读入信息
       while(!s.equals("Bye"))                //直至Client端表示要断开结束
       {
        ServerMeg.append("Client 端输入的信息为:\n"+s);
        s=in.readLine();                     //读入Client端写入的下一行信息
        }
       ConnectedClient.close();               //若Client端写入"Bye"则结束通信      
   }                                        //catch
   catch(Exception e){}
   FatherListener.addMeg("Client"+"closed."+"\n");
   dispose();                               //关闭当前通信Frame
  }                                          //run
  
                                         
/*public Thread ThreadRun()
{
  ConnectThread=new Thread(this);
  ConnectThread.start();
  return ConnectThread;
  }*/                                          
}


class ServerService extends Frame              //服务器端的监听器窗口
{
ServerSocket m_sListener;                   //监听器
Socket Connected;
TextArea ListenerMeg;                        //显示信息的监听器窗口
public ServerService(int Port,int Count)
{
  try{
         m_sListener=new ServerSocket(Port,Count);//建立监听服务
  }catch(Exception e){System.out.println(e.toString());}
         setTitle("Server Listener");             //建立监听服务的窗口并显示
         this.addWindowListener(new WinAdpt());
         setLayout(new BorderLayout());
         ListenerMeg=new TextArea("监听服务已经启动\n",10,50);
         add("Center",ListenerMeg);
         setResizable(false);
         pack();
         setVisible(true);
         while(true)
         {
          try{
             Connected=m_sListener.accept();//接受来自Client端的请求
                }catch(Exception e)
               {System.out.println(e.toString());}
             InetAddress ClientAddress=Connected.getInetAddress();
             ListenerMeg.append("Client "+"connected "+"from:客户端"+ClientAddress.toString()+".\n");
                     //获得请求Client的IP并建立新的线程新的窗口与此Client通信
             ServiceThread MyST=new ServiceThread(this,Connected);
             MyST.ConnectThread.start();           //启动新线程
          }   
   }
   
  
  
  public void addMeg(String s)                  //在监听器窗口中加入信息
  {
   ListenerMeg.append(s);
   }
}                                               //ServerSevice Class


class WinAdpt extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
  ((Frame)e.getWindow()).dispose();
//  System.exit(0);
  }
}
程序可以简单运行,但当Server端监听到Socket请求时 ,却不能生成与之交互的另一个线程窗口,我用红色标记了,这段程序似乎没有运行,不知道问题出在哪,劳烦各位大虾了,感激不尽!!!
由于字数限制,线分两贴征询!

Rank: 4

现金
93 元 
精华
帖子
133 
注册时间
2009-2-22 
最后登录
2010-3-27 
2
发表于 2009-3-15 13:27 |只看该作者
我不是高手,懂得也不多,但我知道这句写得有问题
add("Cneter",ServerMeg);
"Cneter"拼写错误啦,造成你红字部分的
ServiceThread MyST=new ServiceThread(this,Connected);
调用构造函数的时候抛异常,自然不能运行成功

现金
14 元 
精华
帖子
2 
注册时间
2009-3-13 
最后登录
2009-3-16 
3
发表于 2009-3-15 14:57 |只看该作者

搞定了

恩,确实是手误,现在搞定了,谢谢啦!
‹ 上一主题|下一主题

肝胆相照论坛

GMT+8, 2024-5-18 08:04 , Processed in 0.014336 second(s), 10 queries , Gzip On.

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.