这是我的程序:服务端
package 聊天;import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JFrame;
import javax.swing.JTextField;public class 服务端 {
    public static void main(String[] args) {
    
    
     JFrame f = new JFrame("服务器");
     JTextField text = new JTextField(20);
     f.add(text,BorderLayout.NORTH);
     f.setSize(300, 400);
     f.setLocation(100,100);
     f.setVisible(true);
    
    
    
     int i = 1;
     ServerSocket s = null;
    
    
     try {
s=new ServerSocket(8888);

} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();

}
while (true) {
try {

Socket s1=s.accept();

BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));

PrintWriter out = new PrintWriter(s1.getOutputStream());
out.println("您是第"+i+"个连接服务器的!");
out.flush();
text.setText(in.readLine());
i++;


} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}    }  }客户端:package 聊天;import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
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.JFrame;
import javax.swing.JTextField;public class bbb { String setword = null;
JFrame f = new JFrame("客户端");

JTextField text = new JTextField(20);
    JTextField textInput = new JTextField(20);
    PrintWriter out;
    public bbb(){
       
     textInput.addKeyListener(new KeyListener(){     public void keyPressed(KeyEvent arg0) {
     // TODO 自动生成方法存根
    
     }     public void keyReleased(KeyEvent arg0) {
     // TODO 自动生成方法存根
    
     }     public void keyTyped(KeyEvent arg0) {
     // TODO 自动生成方法存根
     if (arg0.getKeyChar()==KeyEvent.VK_ENTER) {
    
     out.println(textInput.getText());
     out.flush();
    
     try {
    
Socket s1 = new Socket("127.0.0.1",8888);
out = new PrintWriter(s1.getOutputStream());

} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
      
     }
     }});
    
     f.add(text,BorderLayout.NORTH);
     f.add(textInput,BorderLayout.SOUTH);
     f.setSize(300, 400);
     f.setLocation(100,100);
     f.setVisible(true);
    
      try {
Socket s1 = new Socket("127.0.0.1",8888);
BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));

text.setText(in.readLine());

out = new PrintWriter(s1.getOutputStream());
    
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
            System.out.println("连接服务器失败");
  
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
        
    
    }
    
public static void main(String[] args) {

bbb b = new bbb();

}}客户端连接服务器端  并可以发消息给服务器端  服务器端显示出来
我每次发消息都要建立新的socket,不建新的服务器收不到,socket必须这样吗? 不能建一个socket持续传消息吗?

解决方案 »

  1.   

    查不出来啊  指点一下!  
    如果public void keyTyped(KeyEvent arg0)方法里的
             Socket s1 = new Socket("127.0.0.1",8888);
            out = new PrintWriter(s1.getOutputStream());
    不写 服务器就收不到第二次以后的消息  咋改啊?
      

  2.   

    重构下
    吧建立socket与消息发送分开
    消息发送在while循环里,根据特定条件,结束发送,关闭socket
      

  3.   

    楼主 都不带 close的啊??
    聊天的程序么?  
    楼主看下我这个 http://blog.csdn.net/java_cxrs/archive/2009/01/13/3769573.aspx
      

  4.   

    大体的看了下你的代码,发现了你的程序中有一个致命的缺陷。
    用Socket编写聊天程序,最主要的应该要掌握两点:
    第一:服务器端多线程
    第二:客户端多线程
    而这里的多线程,从你的代码里面没有体现出来,当然,代码不是必须得这样去编写,但是一般来说这是一个规范,而且也是一个很好的思路。
    方法:
    服务器端:两个线程,一个负责专门等待客户端的连接,核心代码为:Socket client = serverSocket.accept();第二个线程主要负责所有客户端发来的消息的处理。
    服务器端:一个线程,就负责接受并解析所有的消息。
    严格按照这样的方式去编写代码去改写你的代码的话,很快就会实现的。楼主不妨试一下...
    如果需要的话,我可以给你共享一下我以前的代码
      

  5.   

    1.楼主用的键盘事件? 用 ActionListener 接口就行了 里面就一个方法 可以响应回车输入
    2.在ActionListener方法里向服务端发送数据  关闭窗口时close掉输出流
    3.服务端只要有客户端连上就接收客户端的数据
      

  6.   


    你这个都显示在客户端的textarea上了  我是要客户端写的东西都显示在服务器端啊  并且持续的就收信息
      

  7.   

    while (true) {
    Socket s1=s.accept();你这种方法是客户端每发一次请求就新建一个连接,连上之后就不管了。