import java.awt.Rectangle;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehuduan extends JFrame { private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JTextField jTextField = null;
private JScrollPane jScrollPane = null;
private JTextArea jTextArea = null;
private JButton jButton = null;
PrintWriter writer;
Socket sock;  //  @jve:decl-index=0:
BufferedReader reader;  //  @jve:decl-index=0:
/**
 * This method initializes jTextField
 * 
 * @return javax.swing.JTextField
 */
private JTextField getJTextField() {
if (jTextField == null) {
jTextField = new JTextField();
jTextField.setBounds(new Rectangle(90, 108, 164, 22));
}
return jTextField;
} /**
 * This method initializes jScrollPane
 * 
 * @return javax.swing.JScrollPane
 */
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setBounds(new Rectangle(65, 2, 204, 84));
jScrollPane.setViewportView(getJTextArea());
}
return jScrollPane;
} /**
 * This method initializes jTextArea
 * 
 * @return javax.swing.JTextArea
 */
private JTextArea getJTextArea() {
if (jTextArea == null) {
jTextArea = new JTextArea();
}
return jTextArea;
} /**
 * This method initializes jButton
 * 
 * @return javax.swing.JButton
 */
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(150, 145, 68, 24));
jButton.setText("发送");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
try {
writer.println(jTextField.getText());
writer.flush();
jTextField.setText("");
jTextField.requestFocus();
Thread readerThread=new Thread(new IncomingReader());
readerThread.start();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
}
});
}
return jButton;
} /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub


kehuduan thisClass = new kehuduan();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
};
/**
 * This is the default constructor
 */
private void setUpNetworking(){
try {
sock=new Socket("127.0.0.1",5000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
InputStreamReader steamReader=new InputStreamReader(sock.getInputStream());
reader=new BufferedReader(steamReader);
writer=new PrintWriter(sock.getOutputStream());
System.out.println("networking established");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public kehuduan() {
super();
initialize();
} /**
 * This method initializes this
 * 
 * @return void
 */
private void initialize() {
this.setSize(358, 236);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
setUpNetworking();
}
public class IncomingReader implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
String message;
try {
while((message=reader.readLine())!=null){
System.out.println("read"+message);
jTextArea.append(message+"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} /**
 * This method initializes jContentPane
 * 
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJTextField(), null);
jContentPane.add(getJScrollPane(), null);
jContentPane.add(getJButton(), null);
}
return jContentPane;
}}  //  @jve:decl-index=0:visual-constraint="309,6"

解决方案 »

  1.   

    个人看法:
    你的程序没问题,只是需要有个Server端,sock=new Socket("127.0.0.1",5000);
    这句就是和Server端连接的。所以给你个server 端程序,先运行,再运行你的客户端就行了。import java.io.*;
    import java.net.*;
    public class Server1 extends ServerSocket //注意新的用法.
    {
    private static final int SERVER_PORT = 5000;
    public Server1() throws IOException
    {
    super(SERVER_PORT);
    try
    {
    while (true)
    {
    Socket socket = accept();
    new CreateServerThread(socket);
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    finally
    {
    close();
    }
    }
    //--- CreateServerThread
    class CreateServerThread extends Thread //inner class.
    {
    private Socket client;
    private BufferedReader in;
    private PrintWriter out;
    public CreateServerThread(Socket s) throws IOException
    {
    client = s;
    in = new BufferedReader(new InputStreamReader(
    client.getInputStream(), "GB2312"));
    out = new PrintWriter(client.getOutputStream(), true);
    out.println("--- Welcome ---");
    start(); //start at the constructor.
    }
    public void run()
    {
    try
    {
    String line = in.readLine();
    while (!line.equals("bye"))
    {
    String msg = createMessage(line);
    out.println(msg);
    System.out.println(msg);
    line = in.readLine();
    }
    out.println("--- See you, bye! ---");
    client.close();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    } private String createMessage(String line)
    {
    return client.getInetAddress().getHostName()+client.getPort()+":"+line;
    }
    }
    public static void main(String[] args) throws IOException
    {
    new Server1();
    }
    }
      

  2.   

    线程用在这里的意义,也就是说,你在发消息的同时,cpu有其他的空闲时间去接受消息,这是一个并发的过程..
      

  3.   

    主线程不停监控socket连接,一旦有客户端连接,其通信交给一个线称去处理。主线程继续监听。可以有多个客户端连接。
    你把线程关了,不会往回发数据了,窗口不会回显了。