日期:2014-05-20  浏览次数:20702 次

线程操作问题
import   java.net.*;
import   java.util.ArrayList;
import   java.util.List;
import   java.io.*;
public   class   chatServer   {

/**
  *   @param   args
  */
private   ServerSocket   ss=null;
private   Socket   s=null;
private   boolean   Started=true;
private   List <Clint>   Clints=new   ArrayList <Clint> ();
public   static   void   main(String[]   args)   {
new   chatServer();
}

public   chatServer()
{
boolean   Started=true;
try   {
ss=new   ServerSocket(6666);

while(Started)
{
s=ss.accept();
Clint   c=new   Clint(s);
Clints.add(c);
Thread   t=new   Thread(c);
t.start();
}
//用线程实现以上方法
System.out.println( "我跳出来了 ");

}   catch   (IOException   e)   {
e.printStackTrace();
}
}
class   Clint   implements   Runnable{
Socket   s;
DataInputStream   dis;
DataOutputStream   dos;
public   void   run()   {

}
public   Clint(Socket   s)
{
this.s=s;
 
try   {
dis=new   DataInputStream(s.getInputStream());
String   str=dis.readUTF();
if(str.equals( "bye "))
{
System.out.println( "和服务器断开连接 ");
Started=false;
dis.close();
s.close();
}
else
{
System.out.println(str);
}
System.out.println(Started);
}   catch   (IOException   e)   {
e.printStackTrace();
}
}
public   void   send(String   str)
{
try   {
dos.writeUTF(str);
}   catch   (IOException   e)   {
e.printStackTrace();
}
}

}
}

用一个客户端给服务端发信息,然后服务端打印。当客户端输入bye是是服务端停止,以上是服务端的代码,我再内部类中操作外部类的一个变量,为什么再内部类中可以看到值已经变了,开始外部类的循环还在继续,也就是我输入数据后服务器还会打印

下面是客户端的代码

import   java.net.*;
import   java.io.*;
import   java.awt.*;
import   java.awt.event.*;

import   javax.swing.border.Border;

import   sun.awt.WindowClosingListener;
public   class   chatClint   extends   Frame     {

/**
  *   @param   args
  */
private   Socket   s=null;
private   TextArea   ta=null;
private   TextField   tf=null;

public   static   void   main(String[]   args)   {

new   chatClint();
}
public   chatClint()
{
this.setLocation(100,100);
this.setSize(400,300);
this.setVisible(true);
ta=new   TextArea();
tf=new   TextField();
tf.addActionListener(new   Post());
add(ta,BorderLayout.NORTH);
add(tf,BorderLayout.SOUTH);
pack();
setVisible(true);


this.addWindowListener(new   WindowAdapter()
{

@Override
public   void   windowClosing(WindowEvent   e)   {
System.exit(1);
}

});
}
class   Post   implements   ActionListener
{

public   void   actionPerformed(ActionEvent   e)   {