服务端程序是这样的:
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class serverTwo extends JFrame implements ActionListener , Runnable {
//声明数据通信类对象和窗体组件对象
InetAddress addr ;
ServerSocket se ;
Socket so; 
DataInputStream in ; 
DataOutputStream out;   
JButton btn;
JTextField jtf;   
JTextArea jta;
JScrollPane jsp; 
serverTwo() throws Exception {
  //构建可视化窗体
btn = new JButton("发送");
jtf = new JTextField(15);
btn.addActionListener(this);
this.setLayout(new BorderLayout());
jta = new JTextArea();
JPanel jp = new JPanel();
jp.add(btn);
jp.add(jtf);
  //创建滚动条面板
jsp = new JScrollPane(); 
jsp.setViewportView(jta);
this.setTitle("Server");
this.add(BorderLayout.SOUTH,jp); 
this.add(jsp);
  this.setSize(300,200);
  this.setVisible(true);   
  //创建ServerSocket,并开始监听
  addr= InetAddress.getByName("aci");
se= new ServerSocket(135);
  System.out.println("服务器启动..."); 
so=se.accept(); 
System.out.println("有客户端连接...");
//创建数据流
in = new DataInputStream(so.getInputStream());
out =new DataOutputStream(so.getOutputStream());
}
public void run() {
//接收客户端的消息
try { 
while (true) {
jta.append("client:" + in.readUTF());
jta.append("\n");
}
}
catch(Exception ex) {
System.out.println(ex.getMessage());

}
public static void main(String[] args) throws Exception {
  //将当前类作为线程启动
Thread t = new Thread(new serverTwo());
t.start();

public void actionPerformed(ActionEvent e) {
try { 
//向客户端发送消息 
out.writeUTF(jtf.getText());
out.flush();
  //发送一次消息,在当前窗体也显示自身的消息
jta.append("me:" + jtf.getText());
jta.append("\n");
}
catch(Exception ex) {  
System.out.println(ex.getMessage());
  }
}
}客户端是这样的:import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class clientTwo extends JFrame implements ActionListener , Runnable {
Socket so ;
DataInputStream in ; 
DataOutputStream out;   
JButton btn;
JTextField jtf;   
JTextArea jta;
JScrollPane jsp; 
clientTwo() throws Exception { 
btn = new JButton("发送");
jtf = new JTextField(15);
btn.addActionListener(this);
this.setLayout(new BorderLayout());
jta = new JTextArea();
JPanel jp = new JPanel();
jp.add(btn);
jp.add(jtf); 
jsp = new JScrollPane();
jsp.setViewportView(jta);
this.setTitle("Client");
this.add(BorderLayout.SOUTH,jp); 
this.add(jsp);
  this.setSize(300,200);
  this.setVisible(true);
  //创建客户端Socket并创建输入输出流
  so= new Socket("localhost",135);
  in = new DataInputStream(so.getInputStream());
out= new DataOutputStream(so.getOutputStream()); 
}
public void run() {
//接收服务器返回的消息
try { 
while (true) {
jta.append("server:" + in.readUTF());
jta.append("\n");
}
}
catch(Exception ex) {
System.out.println(ex.getMessage());

}
  public static void main(String[] args) throws Exception { 
  Thread t = new Thread(new clientTwo());
t.start();
}
public void actionPerformed(ActionEvent e) {
try { 
//向服务器发送消息 
out.writeUTF(jtf.getText());
out.flush();   
jta.append("me:" + jtf.getText());
jta.append("\n"); 
}
catch(Exception ex) {  
System.out.println(ex.getMessage());
  }
}
}
运行时,客户端可以,服务端运行时,不能在jta中显示jtf中输入的信息,控制台只是输出一个null

解决方案 »

  1.   

    jta无法赋值,看看语句,赋值是在socket发送ok之后才赋值。既然赋值语句没执行到,说明socket出问题了。所以,可疑地方有2个:
    1)("aci");这个aci主机名称是否正确?是否真实存在?你用cmd的ping aci能否ping通?如果不能通,先把这个问题解决了。如果是本机测试,直接写localhost2)看到你给服务器绑定到的端口是135.要知道,在os世界,<1024的端口号大部分是分配给os用的。你搞这么特殊的端口,很容易绑定失败(socket创建失败)。建议改一个不超过65535的很随意的,比如12345都没问题如果这两个都搞定了,估计没大问题了