package chat;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.ServerSocket;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class Serverport extends JFrame { /**
 * 
 */
private static final long serialVersionUID = 1L;
JTextField jf1;
JTextField jf2;
JTextArea ja;
JScrollPane jsp;
JRootPane jp;
ServerSocket s= new ServerSocket(9999); @SuppressWarnings("deprecation")
public Serverport() throws IOException {
System.out.println("serverport starting .....");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setSize(400, 450);
this.setTitle("Server的聊天室");
this.setLocation(800, 200);
this.getContentPane().setLayout(new BorderLayout());
jp = new JRootPane();
jp.setLayout(new GridLayout(1, 2));
jsp = new JScrollPane();
jf1 = new JTextField(500);
jf2 = new JTextField(500);
ja = new JTextArea("");
ja.setFont(new Font("", Font.BOLD & Font.ITALIC, 80));
ja.disable();
ja.setBackground(Color.PINK);
jp.add(jf1, 1);
jp.add(jf2, 2);
this.getContentPane().add(jp, BorderLayout.SOUTH);
jsp.getViewport().setView(ja);
this.getContentPane().add(jsp, BorderLayout.CENTER);
// 接收 jf2.addKeyListener(new KeyAdapter() {
@SuppressWarnings("static-access")
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == e.VK_ENTER) {
ja.setText(ja.getText() + "\n" + jf2.getText());
Thread t=new Thread(new Servicers(s,jf1,jf2,ja));
t.start();
jf2.setText("");
}
} }); this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
System.exit(0);
}
});

} public static void main(String args[]) throws IOException {
Serverport sp = new Serverport();
sp.setVisible(true);
}
}
-----------------------------
package chat;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class Client extends JFrame { /**
 * 
 */
private static final long serialVersionUID = 1L;
JTextField jf1;
JTextField jf2;
JTextArea ja;
JScrollPane jsp;
JRootPane jp;
Socket s; @SuppressWarnings("deprecation")
public Client() throws IOException {
System.out.println("Client starting .....");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setSize(400, 450);
this.setTitle("client's的聊天室");
this.setLocation(800, 200);
this.getContentPane().setLayout(new BorderLayout());
jp = new JRootPane();
jp.setLayout(new GridLayout(1, 2));
jsp = new JScrollPane();
jf1 = new JTextField(500);
jf2 = new JTextField(500);
ja = new JTextArea("");
ja.setFont(new Font("", Font.BOLD & Font.ITALIC, 80));
ja.disable();
ja.setBackground(Color.PINK);
jp.add(jf1, 1);
jp.add(jf2, 2);
this.getContentPane().add(jp, BorderLayout.SOUTH);
jsp.getViewport().setView(ja);
this.getContentPane().add(jsp, BorderLayout.CENTER);
jf2.addKeyListener(new KeyAdapter() {
@SuppressWarnings("static-access")
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == e.VK_ENTER) {
ja.setText(ja.getText() + "\n" + jf2.getText());
Thread t=new Thread(new Servicers(s, jf1, jf2,ja));
t.start();
jf2.setText("");
}
} });

this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
System.exit(0);
}
}); } public static void main(String args[]) throws IOException {
new Client().setVisible(true);
}
}
----------------------
package chat;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JTextArea;
import javax.swing.JTextField;import java.io.OutputStream;public class Servicers implements Runnable {
private ServerSocket st;
private Socket s;
private JTextField jf2;
private JTextArea ja;
private boolean type; public Servicers(Socket s, JTextField jf1, JTextField jf2, JTextArea ja) {
type = false;
this.s = s;
this.jf2 = jf2;
this.ja = ja;
} public Servicers(ServerSocket s, JTextField jf1, JTextField jf2,
JTextArea ja) {
type = true;
this.st = s;
this.jf2 = jf2;
this.ja = ja; } public void run() {
while (true) {
try {
if (type) {

s = this.st.accept();
} else {
s = new Socket("172.16.25.66", 9999);
}
OutputStream ops = s.getOutputStream();
InputStream ips = s.getInputStream();
byte[] content=jf2.getText().getBytes();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
String str=null;
InetAddress address=s.getInetAddress();
// System.out.println(s.isConnected());
ops.write(content,0,content.length);
while((str=br.readLine())!=null){
if(s.isInputShutdown()){
break;
}
System.out.println("br.readline");
ja.setText(ja.getText()+"\n"+address.getHostName()+":"+str);

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}

解决方案 »

  1.   

    楼主:
       public void run() {
    while (true) {
    try {
    if (type) {s = this.st.accept();
    } else {
    s = new Socket("172.16.25.66", 9999);
    }不管你先启动的是那个端(s和c)你的进程启动完以后就处于阻塞了,另外一个端怎么启动啊,你要把它们分开写好不好,不用节约
      

  2.   

    楼主::上面的我说错了,不过你的两面运行后都是阻塞了的是对的,你把if (type) {s = this.st.accept();
    } else {
    s = new Socket("172.16.25.66", 9999);
    }
    放在while的外面再试试,