A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Friends★ 中级黑马   /  2012-7-27 18:05  /  1458 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//一个简单聊天的程序,客户端可以给服务端发送数据,
但是服务端不可以给客户端发送数据,请各位朋友帮我修改一下,看哪里出错了,谢谢了

/*
客户端
*/
import java.net.*;
import java.io.*;
class Client2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先就是不用说是建立服务
                Socket s=new Socket("LOIS",10002);
                //然后就是开始写数据
                OutputStream fos=s.getOutputStream();
                //读取键盘
                BufferedReader bufr =new BufferedReader(
                        new InputStreamReader(System.in));
                String line=null;
                while((line=bufr.readLine())!=null){
                        fos.write(line.getBytes());
                        fos.flush();
                }
                //读取服务端发的数据
                InputStream fis =s.getInputStream();
                int len=0;
                byte[] bys=new byte[1024];
                while((len=fis.read(bys))!=-1){
                        System.out.println(new String(bys,0,len));
                }
                s.close();
                bufr.close();
        }
}

/*
这个是服务端的部分
*/
import java.net.*;
import java.io.*;
class  Server2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先要做的就是建立服务端的额服务
                ServerSocket ss=new ServerSocket(10002);
                //确认是否建立连接
                Socket s=ss.accept();
                //读取数据
                InputStream ins=s.getInputStream();
                byte[] bys=new byte[1024];
                int len=0;
                while((len=ins.read(bys))!=-1){
                        System.out.println(new String(bys,0,len));
                }
                OutputStream out=s.getOutputStream();
                //然后就是写数据给客户端

                //服务端键盘没法录入数据
                BufferedReader bufr=new BufferedReader(
                        new InputStreamReader(System.in));
                String line=null;
                while((line=bufr.readLine())!=null){
                        out.write(line.getBytes());
                        out.flush();
                }
                ss.close();
                bufr.close();
        }
}




评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

7 个回复

倒序浏览
import java.net.*;import java.io.*;class Client2Demo {        public static void main(String[] args) throws IOException        {                //首先就是不用说是建立服务                Socket s=new Socket("127.0.0.1",10002);                //然后就是开始写数据                OutputStream fos=s.getOutputStream();                //读取键盘                BufferedReader bufr =new BufferedReader(                        new InputStreamReader(System.in));                                fos.write(bufr.readLine().getBytes());//                String line=null;//                while((line=bufr.readLine())!=null){//                        fos.write(line.getBytes());//                        fos.flush();//                }                //读取服务端发的数据                InputStream fis =s.getInputStream();                byte[] bys=new byte[1024];                int len= fis.read(bys);//                while((len=fis.read(bys))!=-1){                        System.out.println(new String(bys,0,len));//                }                s.close();                bufr.close();        }}
/*这个是服务端的部分*/
class  Server2Demo{        public static void main(String[] args) throws IOException        {                //首先要做的就是建立服务端的额服务                ServerSocket ss=new ServerSocket(10002);                //确认是否建立连接  注意这里不是确认连接 是在侦听并接收套接字的连接                Socket s=ss.accept();                //读取数据                InputStream ins=s.getInputStream();                byte[] bys=new byte[1024];                int len= ins.read(bys);                                 System.out.println(new String(bys,0,len));//                while((len=ins.read(bys))!=-1){//                        System.out.println(new String(bys,0,len));//                }                OutputStream out=s.getOutputStream();                //然后就是写数据给客户端
                //服务端键盘没法录入数据                BufferedReader bufr=new BufferedReader(                        new InputStreamReader(System.in));                                out.write(bufr.readLine().getBytes());//                String line=null;//                while((line=bufr.readLine())!=null){//                        out.write(line.getBytes());//                        out.flush();//                        //                }                ss.close();                bufr.close();        }}//你需要注意的是阻塞式方法BufferedReader 的readLine方法

键盘的录入方法
Socket的循环读取方法
这些都是阻塞式方法
你服务端无法输入是因为在等待客户端的无止尽的输出,服务端的输入代码其实根本没有执行到
回复 使用道具 举报
import java.net.*;
import java.io.*;
class Client2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先就是不用说是建立服务
                Socket s=new Socket("127.0.0.1",10002);
                //然后就是开始写数据
                OutputStream fos=s.getOutputStream();
                //读取键盘
                BufferedReader bufr =new BufferedReader(
                        new InputStreamReader(System.in));
                                fos.write(bufr.readLine().getBytes());
//                String line=null;
//                while((line=bufr.readLine())!=null){
//                        fos.write(line.getBytes());
//                        fos.flush();
//                }
                //读取服务端发的数据
                InputStream fis =s.getInputStream();
                byte[] bys=new byte[1024];
                int len= fis.read(bys);
//                while((len=fis.read(bys))!=-1){
                        System.out.println(new String(bys,0,len));
//                }
                s.close();
                bufr.close();
        }
}

/*
这个是服务端的部分
*/

class  Server2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先要做的就是建立服务端的额服务
                ServerSocket ss=new ServerSocket(10002);
                //确认是否建立连接  注意这里不是确认连接 是在侦听并接收套接字的连接
                Socket s=ss.accept();
                //读取数据
                InputStream ins=s.getInputStream();
                byte[] bys=new byte[1024];
                int len= ins.read(bys);
                                 System.out.println(new String(bys,0,len));
//                while((len=ins.read(bys))!=-1){
//                        System.out.println(new String(bys,0,len));
//                }
                OutputStream out=s.getOutputStream();
                //然后就是写数据给客户端

                //服务端键盘没法录入数据
                BufferedReader bufr=new BufferedReader(
                        new InputStreamReader(System.in));
                                out.write(bufr.readLine().getBytes());
//                String line=null;
//                while((line=bufr.readLine())!=null){
//                        out.write(line.getBytes());
//                        out.flush();
//                                                break;
//                }
                ss.close();
                bufr.close();
        }
}
//...上边的代码怎么变那么乱...看这个好了...

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
/*
客户端
*/
import java.net.*;
import java.io.*;
class Client2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先就是不用说是建立服务
                Socket s=new Socket("LOIS",10002);
                //然后就是开始写数据
                OutputStream fos=s.getOutputStream();
                //读取键盘
                BufferedReader bufr =new BufferedReader(
                        new InputStreamReader(System.in));
                String line=null;
                while((line=bufr.readLine())!=null){
                        fos.write(line.getBytes());
                        fos.newline();
                        fos.flush();
                }
                //读取服务端发的数据
                InputStream fis =s.getInputStream();
                int len=0;
                byte[] bys=new byte[1024];
                while((len=fis.read(bys))!=-1){
                        System.out.println(new String(bys,0,len));
                }
                               bufr.close();//先关闭IO流,在关闭socket服务
                                s.close();

        }
}

/*
这个是服务端的部分
*/
import java.net.*;
import java.io.*;
class  Server2Demo
{
        public static void main(String[] args) throws IOException
        {
                //首先要做的就是建立服务端的额服务
                ServerSocket ss=new ServerSocket(10002);
                //确认是否建立连接
                Socket s=ss.accept();
                //读取数据
                InputStream ins=s.getInputStream();
                byte[] bys=new byte[1024];
                int len=0;
                while((len=ins.read(bys))!=-1){
                        System.out.println(new String(bys,0,len));
                }
                OutputStream out=s.getOutputStream();
                //然后就是写数据给客户端

                //服务端键盘没法录入数据
                BufferedReader bufr=new BufferedReader(
                        new InputStreamReader(System.in));
                String line=null;
                while((line=bufr.readLine())!=null){
                        out.write(line.getBytes());
                        out.newline();
                        out.flush();
                }
                              bufr.close();//先关闭IO流,在关闭socket服务
                              ss.close();

        }
}


评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
聂峰 发表于 2012-7-27 18:52
/*
客户端
*/

不过OutputStream中没有newline()方法。

呵呵……要不你发个完整的代码给我,修改好的!
回复 使用道具 举报
这是我之前做的,给你参考一下:
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.ConnectException;
  7. import java.net.Socket;
  8. import java.net.SocketException;
  9. import java.net.UnknownHostException;

  10. public class ChatClient extends Frame {
  11.         Socket s=null;
  12.         DataOutputStream dos=null;
  13.         DataInputStream dis=null;
  14.         TextField tf = new TextField();
  15.         TextArea ta = new TextArea();
  16.         private boolean bConnected=false;

  17.         public static void main(String[] args) {
  18.                 new ChatClient().launchFrame();
  19.         }

  20.         public void launchFrame() {
  21.                 setTitle("Chat Client");
  22.                 setLocation(300, 300);
  23.                 setSize(300, 300);
  24.                 add(tf, BorderLayout.SOUTH);
  25.                 add(ta, BorderLayout.NORTH);
  26.                 pack();
  27.                 this.addWindowListener(new WindowAdapter() {

  28.                         @Override
  29.                         public void windowClosing(WindowEvent e) {
  30.                                 // TODO Auto-generated method stub
  31.                                 disConnect();
  32.                                 System.exit(0);
  33.                         }

  34.                 });
  35.                 tf.addActionListener(new TFListener());
  36.                 setVisible(true);
  37.                 connect();
  38.                 new Thread(new RecvThread()).start();
  39.         }
  40.        
  41.          
  42.         public void connect(){
  43.                 try {
  44.                          s=new Socket("127.0.0.1", 8888);
  45.                          dos=new DataOutputStream(s.getOutputStream());
  46.                          dis=new DataInputStream(s.getInputStream());
  47.                          bConnected=true;
  48.                         System.out.println("connected");
  49.                 } catch(ConnectException e){
  50. System.out.println("Server refused.");
  51.                         System.exit(0);
  52.                 } catch (UnknownHostException e) {
  53.                         e.printStackTrace();
  54.                 } catch (IOException e) {
  55.                         e.printStackTrace();
  56.                 }
  57.         }
  58.         public void disConnect(){
  59.                 try {
  60.                         dis.close();
  61.                         s.close();
  62.                         dos.close();
  63.                 } catch (IOException e) {
  64.                         e.printStackTrace();
  65.                 }
  66.                
  67.         }

  68.         private class TFListener implements ActionListener {
  69.                 public void actionPerformed(ActionEvent e) {
  70.                         String str=tf.getText().trim();
  71. //                        ta.setText(str);
  72.                         tf.setText("");
  73.                         try {
  74.                                 dos.writeUTF(str);
  75.                                 dos.flush();
  76.                         } catch (IOException e1) {
  77.                                 e1.printStackTrace();
  78.                         }
  79.                 }
  80.         }

  81.         private class RecvThread implements Runnable{

  82.                 public void run() {
  83.                         try{
  84.                                 while(bConnected){
  85.                                          String str=dis.readUTF();
  86.                                          ta.setText(ta.getText()+str+"\n");
  87.                                 }
  88.                         }catch(SocketException e){
  89. System.out.println("退出了");                                
  90.                         }catch(IOException e){
  91.                                   e.printStackTrace();
  92.                         }
  93.                 }
  94.                
  95.         }
  96. }
复制代码
  1. import java.io.DataInputStream;
  2. import java.io.DataOutputStream;
  3. import java.io.EOFException;
  4. import java.io.IOException;
  5. import java.net.*;
  6. import java.util.*;

  7. public class ChatServer {

  8.         boolean bStarted = false;
  9.         ServerSocket ss = null;
  10.         List<Client> clients = new ArrayList<Client>();

  11.         public static void main(String[] args) {
  12.                 new ChatServer().start();
  13.         }

  14.         public void start() {
  15.                 try {
  16.                         ss = new ServerSocket(8888);
  17.                         bStarted = true;
  18.                         System.out.println("服务器启动完成!");
  19.                 } catch (IOException e) {
  20.                         System.out.println("端口使用中。。。");
  21.                         System.exit(0);
  22.                 }

  23.                 try {
  24.                         while (bStarted) {
  25.                                 Socket s = ss.accept();
  26.                                 Client c = new Client(s);
  27.                                 new Thread(c).start();
  28.                                 System.out.println("a client has connected!");
  29.                                 clients.add(c);
  30.                         }
  31.                 } catch (IOException e) {
  32.                         e.printStackTrace();
  33.                 } finally {
  34.                         try {
  35.                                 ss.close();
  36.                         } catch (IOException e) {
  37.                                 e.printStackTrace();
  38.                         }
  39.                 }
  40.         }

  41.         private class Client implements Runnable {
  42.                 private Socket s = null;
  43.                 private DataInputStream dis = null;
  44.                 private DataOutputStream dos = null;
  45.                 private boolean bConnected = false;

  46.                 public Client(Socket s) {
  47.                         this.s = s;
  48.                         try {
  49.                                 dis = new DataInputStream(s.getInputStream());
  50.                                 dos = new DataOutputStream(s.getOutputStream());
  51.                                 bConnected = true;
  52.                         } catch (IOException e) {
  53.                                 e.printStackTrace();
  54.                         }
  55.                 }

  56.                 public void run() {
  57.                         try {
  58.                                 while (bConnected) {
  59.                                         String str = dis.readUTF();
  60.                                         System.out.println(str);
  61.                                         for (int i = 0; i < clients.size(); i++) {
  62.                                                 Client c = clients.get(i);
  63.                                                 c.send(str);
  64.                                         }
  65.                                 }
  66.                         } catch (EOFException e) {
  67.                                 System.out.println("Client closed!");
  68.                         } catch (IOException e) {
  69.                                 e.printStackTrace();
  70.                         } finally {
  71.                                 try {
  72.                                         if (dis != null)
  73.                                                 dis.close();
  74.                                         if (s != null)
  75.                                                 s.close();
  76.                                         if (dos != null)
  77.                                                 dos.close();
  78.                                 } catch (IOException e1) {
  79.                                         e1.printStackTrace();
  80.                                 }
  81.                         }
  82.                 }

  83.                 public void send(String str) {
  84.                         try {
  85.                                 dos.writeUTF(str);
  86.                         } catch (IOException e) {
  87.                                 clients.remove(this);
  88.                                 System.out.println("A client exit!");
  89.                         }
  90.                 }

  91.         }
  92. }
复制代码
回复 使用道具 举报
楼主的程序存在问题:
1. 读写操作没有使用两个线程。要使服务器端而客户端同时有接收与发送数据的功能,使用多线程能很好地解决问题。
2. System.in对象运行的是一个阻塞式的方法,在同一个线程中用while循环运行到它时,循环外面的程序块将不能得到运行
所以建议 Lz 使用多线程再试试。也可以参考我上面的例子进行理解。
因为时间仓促,我上面的代码没有加注释,Lz 可以运行一下看一下结果再看代码,如有看不懂的地方,可以问我的。
提醒一句,我那个例子可以运行多个客户端的!

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张莹莹 于 2012-7-27 21:09 编辑

程序只要稍加修改,接收数据的部分挪到线程中即可,详细代码如下:

客户端代码1:


客户端代码2:


服务器端代码1:


服务器端代码2:


客户端运行结果:

服务器端运行结果:


项目文件:
SocketTest.zip (6.4 KB, 下载次数: 57)

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马