求教一个Socket的问题
小弟最近在写一个聊天室的程序,目前在测试阶段。希望在客户端发送一个消息之后每个客户端都能显示这条消息。但是这个功能没能实现。也不知道是哪里错了,希望各位大神能指点一二。
以下是客户端程序:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClient extends Frame{
TextArea displayFrame = new TextArea();
TextField inputFrame= new TextField();
Socket s;
PrintWriter pw;
BufferedReader br = null;
//line用于读取输入行的一行字符串,交给printwriter进行写入
String line = null;
private static final long serialVersionUID = 1L;
public ChatClient(String title){
//初始化窗口界面
super(title);
this.setBounds(100, 100, 450, 370);
this.setVisible(true);
this.setLayout(new BorderLayout());
this.add(displayFrame,BorderLayout.CENTER);
displayFrame.setEditable(false);
this.add(inputFrame,BorderLayout.SOUTH);
//给输入框添加一个按回车的易做图
inputFrame.addActionListener(new MyListener());
//增加关闭窗口的易做图
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
try {
//s.shutdownOutput();//客户端socket使用shutdownOutput() 代替 close()
s.close();
//pw.flush();
//pw.close();
br.close();
System.exit(0);
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
//连接到服务器
connect();
}
public static void main(String[] args) {
ChatClient chatClient = new ChatClient("客户端窗口");
}
private class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
line=inputFrame.getText();
displayFrame.setText(displayFrame.getText()+line+"\n");
inputFrame.setText("");
try {
pw = new PrintWriter(s.getOutputStream());
pw.println(line);
pw.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private void connect(){
try {
s = new Socket("localhost",8888);
new Thread(new RecvThread()).start();
System.out.println("connect server");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class RecvThread implements Runnable{
String str = null;
RecvThread(){
try {
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while(true)
{
System.out.print("xxxx");
str=br.readLine();
System.out.println(str);//这句数据用于调试,在控制台显示消息,但没有执行。
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
——————————————————————————————————————————————————
以下是服务端程序:
import java.net.*;
import java.util.*;
import java.io.*;
public class ChatServer {
private ArrayList<Client> clients = new ArrayList<Client>();
public static void main(String[] args) {
new ChatServer().start();
}
private void start(){
ServerSocket ss=null;
int i=0;
try {
ss = new ServerSocket(8888);
//started = true;
while(true){
i++;
Client c = new Client(ss.accept());
System.out.println(i+" client logined");//试用输出
new Thread(c).start();
clients.add(c);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
private class Client implements Runnable{
private Socket s = null;
private boolean beConnect = false;
private String line=null;
private BufferedReader br = null;
private PrintWriter pw = null;
Client (Socket s){
this.s=s;
beConnect = true;
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while(beConnect){
try {
line=br.readLine();
if(null!=line){
System.out.println(line);//输出到控制台,调试使用。
for(int i=0;i<clients.size();i++)
{
Client c = clients.get(i);
c.send(line);
}
}else{
beConnect = false;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void send(String str){
pw.println(str);
}
}
}
--------------------编程问答-------------------- 看了一下关键代码好像没有发现有什么明显错误。建议调试一下看看,是否报错,不就知道了。 --------------------编程问答--------------------
————————————————————————————————————————————————
谢了,关键代码确实没什么大的问题,运行不报错。 但是像这种既有客户端、又有服务端、又有多线程的程序该怎么调试呀。 --------------------编程问答--------------------
调试很简单, 添加端点,然后单步运行,对于问题出现的地方,比如你点击了哪一个按钮之后没有出现你想要的结果,那就在这个按钮的监听事件要运行的代码上添加断点,然后观察他的运行过程。至于有多线程,那你要确保你每一次调试添加的所有端点都要在一个线程的的代码上
补充:Java , Java SE