其实现的功能是一对一通信,要求谁建立网络谁就是服务器,加入网络的为客户机。下面是我的代码,其能让服务器给客户端发信息,但却不能客户端给服务器发,请各位看看是哪里的问题。
package CSTest;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.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class ChartFrame extends JFrame implements ActionListener ,Runnable{

JTextArea disPlay ,inPut;
JButton ok;
JPanel panel;
JLabel seporator;

JMenuBar net;
JMenu menu;
JMenuItem connect ,join;

ServerSocket server;
Socket connection;
DataInputStream in;
DataOutputStream out;

boolean isServer=true;

String message="";
String user="";
String ip="";

public ChartFrame(){
super("test");
disPlay=new JTextArea();
inPut=new JTextArea(4 ,400);
ok=new JButton("ok");
panel=new JPanel();
seporator=new JLabel("分割线");
net=new JMenuBar();
menu=new JMenu("聊天");
connect=new JMenuItem("连接");
join=new JMenuItem("加入");
setJMenuBar(net);
net.add(menu);
menu.add(connect);
menu.add(join);
panel.setLayout(new BorderLayout());
setLayout(new BorderLayout());
panel.add("North" ,seporator);
panel.add("Center" ,inPut);
panel.add("South" ,ok);
add("Center" ,disPlay);
add("South" ,panel);
connect.addActionListener(this);
join.addActionListener(this);
ok.addActionListener(this);
setVisible(true);
setSize(400 ,300);

}

public void monitor(){
try {
connection=server.accept();
System.out.println("客户端已接入");
in=new DataInputStream(connection.getInputStream());
out=new DataOutputStream(connection.getOutputStream());
isServer=false;
Thread rec=new Thread(this);
rec.start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println("无连接响应");
}

}

public void receiv(){
String line="";
System.out.println("rec be commond");
try{
while(!line.equalsIgnoreCase(".QUIT")){
System.out.println("why server....");
line=in.readUTF();
disPlay.append(line+"\n");
System.out.println("rec"+line);
}
in.close();
}catch(IOException ioe){
System.err.println("连接中断");
}
}

public void send(String message){
//System.out.println("common...");
try {
out.writeUTF(message);
//System.out.println("write...");
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println("对方未响应");
}
}

@Override
public void run() {
// TODO Auto-generated method stub
if(isServer==true)
monitor();
if(isServer==false)
receiv();

}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==connect){
user="server";
try {
server=new ServerSocket(32707);
System.out.println("已建立...");
Thread monitor=new Thread(this);
monitor.start();
} catch (IOException e1) {
System.err.println("无法进行连接");
}
}
if(e.getSource()==join){
ChatDialog dialog=new ChatDialog(this);
if(dialog.flag){
isServer=false;
try {
connection=new Socket(dialog.ip ,32707);
in=new DataInputStream(connection.getInputStream());
out=new DataOutputStream(connection.getOutputStream());
Thread rec=new Thread(this);
rec.start();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
System.err.println("找不到主机");
} catch (IOException e1) {
// TODO Auto-generated catch block
System.err.println("连接错误");
}
}
}
if(e.getSource()==ok){
message=inPut.getText();
send(message);
}
}
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
new ChartFrame(); }}

解决方案 »

  1.   

    对于服务器端如果不执行ServerSocket.accept()方法的话是收不到客户端发来的消息的,建议将connection=server.accept();这句加入到循环中
      

  2.   

    ChatDialog没有贴出来,楼主能贴出来么?
      

  3.   


    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;
    public class Clinet {
    public static void main(String [] args)throws Exception{
    Socket socket=new Socket("192.168.0.125",8088);
    new ReadThread(socket).start();
    new WriteThread(socket).start();
    System.out.println("客户端已经启动");
    }}
    class ReadThread extends Thread{
    private Socket socket;
    public ReadThread(Socket socket){
    this.socket= socket;
    }
    public void run(){
      BufferedReader br = null;
      String ipString=null;
    try {

    synchronized (socket) {
     br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    ipString=socket.getLocalAddress().getHostAddress();
    }
    while(true){
    String msg="";
    if((msg=br.readLine())!=null){
    System.out.println(msg);
    }
    }
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }

    }class WriteThread extends Thread{
    private Socket socket;
    public WriteThread(Socket socket){
    this.socket= socket;
    }
    public void run(){
    PrintWriter pw=null;
        OutputStream outputStream=null;
    try {
    synchronized (socket) {
    outputStream=socket.getOutputStream();
    pw =new PrintWriter(outputStream);
    }
    String msg=null;
    while(true){
    Scanner scanner=new Scanner(System.in);
    msg=scanner.next();
    pw.println(msg);
    pw.flush();
    outputStream.flush();
    } } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }

    }
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;public class Server {
    public static Map map=new HashMap();
    public static Integer msgCount=0; public void doService() throws Exception {
    ServerSocket ss = new ServerSocket(8088);
    System.out.println("服务器已经启动.....");
    while (true) {
    Socket socket = ss.accept();
    System.out.println("一个客户端连接了...");
    try {
    new ReadThead(socket).start();
    new WriteThead(socket).start();
    } catch (Exception e) {
    // TODO: handle exception
    }
    }
    } public static void main(String[] args) throws Exception {
    new Server().doService();
    }
    }class ReadThead extends Thread { private Socket socket; public ReadThead(Socket socket) {
    this.socket = socket;
    } @Override
    public void run() {
    // TODO Auto-generated method stub BufferedReader br = null;
    String ipString = null;
    try { synchronized (socket) {
    br = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    ipString = socket.getLocalAddress().getHostAddress();
    }
    while (true) {
    String msg = ""; if ((msg = br.readLine()) != null) {
    msg = ipString + "说:" + msg;
    System.out.println(msg);
    synchronized (Server.map) {
    Server.map.put(Server.msgCount++, msg); }
    }
    } } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }}class WriteThead extends Thread {
    private Integer msgCount=0;
    private Socket socket; public WriteThead(Socket socket) {
    this.socket = socket;
    } public void run() {
    PrintWriter pw = null;
    OutputStream outputStream = null;
    try {
    synchronized (socket) {
    outputStream = socket.getOutputStream();
    pw = new PrintWriter(outputStream); }
    String msg = null;
    while (true) {
    synchronized (Server.map) {
    if (msgCount < Server.map.size()) {
    msg = Server.map.get(msgCount).toString();
    pw.println(msg);
    pw.flush();
    outputStream.flush();
    msgCount++;
    }
    } } } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace(); }
    }
    }给你个现成的吧、client写错了、、高手别见笑、今天没事写得玩的