"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()无法及时更新