求解答:Thread.run()中如何让JTextArea.append()及时更新?

"S_server.java"
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class S_server extends JFrame implements ActionListener,Runnable{

	ServerSocket 		s_Socket;		//服务器套接字
	Socket 				c_Socket;		//套接字
	DataInputStream 	in = null;		//数据输入流
	DataOutputStream	out = null;		//数据输出流
	InputStream 		in_data;		//接收到的数据流
	OutputStream 		out_data;		//发送的数据流
	int 				i=0;			//计数
	int 				srvPort;		//服务器端口号
	JTextArea 	txt;
	JTextField 	txtPort;
	JButton 	btn;
	JPanel 		p;
	JLabel 		lb;
	String str;					//存放接收的数据
	JScrollPane jScrollPane;
	
	public S_server() {
		// TODO Auto-generated constructor stub
		super("Server");
		setSize(600, 400);
		setVisible(true);
		txt = new JTextArea(25,8);
		jScrollPane = new JScrollPane(txt);
		add(jScrollPane,BorderLayout.CENTER);
		p = new JPanel();
		add(p,BorderLayout.NORTH);
		lb = new JLabel("设置端口:");
		txtPort = new JTextField(10);
		btn = new JButton("监听端口");
		p.add(lb);p.add(txtPort);p.add(btn);
		btn.addActionListener(this);
		validate();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}
	
	@Override
	public void actionPerformed(ActionEvent eee) {
		// TODO Auto-generated method stub
		srvPort = Integer.parseInt(txtPort.getText());
		try {
			s_Socket = new ServerSocket(srvPort);
			while (true) {
				c_Socket = s_Socket.accept();
				Thread t = new Thread(this);
				t.start();
//				txt1.append("第"+i+"个客户发来:"+str+"\n");
				i++;
				System.out.println(t);
			}
		} catch (IOException e) {	System.out.println("建立连接出错");}
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			while (true) {
				in_data = c_Socket.getInputStream();
				out_data = c_Socket.getOutputStream();
				in = new DataInputStream(in_data);
				out= new DataOutputStream(out_data);
				out.writeUTF("Hello,我是服务器");
				str = in.readUTF();
				System.out.println("序号:"+i+","+str+"\n");
				if (str.equals("end")) {
					in.close();
					out.close();
					c_Socket.close();	
				}		
				System.out.println("第"+i+"个客户发来:"+str+"\n");
				txt.setText("第"+i+"个客户发来:"+str+"\n");
				Thread.sleep(1000);
			}
		} catch (IOException e) {	
			System.out.println("线路上读写信息出错");
		} catch (Exception ee) {
			System.out.println("线程出错");
		}
	}
	public static void main(String[] args) {
		new S_server();
	}
}
"C_client.java"
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class C_client extends JFrame implements ActionListener{

	JTextArea 	txt1;
	JButton 	btn;
	JPanel 		p;
	int 		srvPort;		//服务器端口号
	DataInputStream in = null;	//数据输入流
	DataOutputStream out = null;//数据输出流
	Socket c_Socket;			//套接字
	InputStream in_data;		//接收到的数据流
	OutputStream out_data;		//发送的数据流
	String str;					//存放接收的数据
	int i=0;					//计数
	JTextField txtPort;
	JLabel lb;
	JScrollPane jScrollPane;
	
	public C_client() {
		// TODO Auto-generated constructor stub
		super("客户端");
		setSize(600, 400);
		setVisible(true);
		txt1 = new JTextArea(5,4);
		jScrollPane = new JScrollPane(txt1);
		add(jScrollPane,BorderLayout.CENTER);
		p = new JPanel();
		add(p,BorderLayout.NORTH);
		lb = new JLabel("连接服务器端口:");
		txtPort = new JTextField(10);
		btn = new JButton("连接");
		p.add(lb);p.add(txtPort);p.add(btn);
		btn.addActionListener(this);
		validate();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new C_client();
	}

	@Override
	public void actionPerformed(ActionEvent eee) {
		// TODO Auto-generated method stub
		srvPort = Integer.parseInt(txtPort.getText());
		try {
			InetAddress localhost =  InetAddress.getLocalHost();
			c_Socket = new Socket(localhost, srvPort);
		} catch (IOException e) {	System.out.println("找不到服务器");}
		
		try {
			in_data = c_Socket.getInputStream();
			out_data = c_Socket.getOutputStream();
			in = new DataInputStream(in_data);
			out= new DataOutputStream(out_data);
			
			//获取到对方及本机的端口号
			int p1 = c_Socket.getPort();
			int p2 = c_Socket.getLocalPort();
			txt1.append("获取到对方的端口号:"+p1+"\n");
			txt1.append("本机的端口号:"+p2+"\n");
			} catch (IOException e) {	System.out.println("建立输入输出流出错");}
		try {
			str = in.readUTF();
			txt1.append("用户收到"+str+"\n\n");
			if (i>=10) {
				out.writeUTF("end");//发出end信息,关闭连接
				in.close();
				out.close();
				c_Socket.close();
				System.exit(0);
			}else {
				out.writeUTF("I am Client");
				i++;
			}
		} catch (IOException e) {	System.out.println("线路读写出错");}
	}

}


张思明Java语言程序设计(第3版)第246页例9_4中图9_9(a)中效果无法实现,定位原因是可能因为Thread.run()中JTextArea.append()无法及时更新

猜你喜欢

转载自blog.csdn.net/qq_38179971/article/details/80480793