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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡生蒙 中级黑马   /  2012-3-31 00:38  /  1950 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatRoomServer {
        public static void main(String[] args) {
                try {
                        ServerSocket ss = new ServerSocket(4800);
                        Socket s = ss.accept();
                        BufferedReader brs = new BufferedReader(new InputStreamReader(
                                        System.in));
                        BufferedReader br = new BufferedReader(new InputStreamReader(
                                        s.getInputStream()));

                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                                        s.getOutputStream()));
            String str1, str2;
                        while (!(str2 = brs.readLine()).equals("bye")) {
                                System.out.println("服务器" + str2);
                                bw.write(str2);
                                bw.flush();
                                                        }

                        while (!(str1 = br.readLine()).equals("bye")) {
                                System.out.print("客户端" + str1);
                        }
                       
                         bw.close();
                         brs.close();
                         br.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ChatRoomClient {

        public static void main(String[] args) {
                try {
                        Socket s = new Socket("localhost", 4800);
                        BufferedReader brs = new BufferedReader(new InputStreamReader(
                                        System.in));
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                                        s.getOutputStream()));
                        BufferedReader br = new BufferedReader(new InputStreamReader(
                                        s.getInputStream()));
                        String str1, str2;
                        while (!(str1 = brs.readLine()).equals("bye")) {
                                System.out.println("客户端" + str1);
                                bw.write(str1);
                                // str1 = brs.readLine();
                        }
                        while (!(str2 = br.readLine()).equals("bye")) {
                                System.out.println("服务器" + str2);
                        }
                         brs.close();
                        bw.close();
                        br.close();
                } catch (UnknownHostException e) {
                                e.printStackTrace();
                } catch (IOException e) {
                                e.printStackTrace();
                }

        }
}
        }
}
这是聊天的小程序,为什么服务器端老是readLine不到东西?

4 个回复

倒序浏览
本帖最后由 gackor 于 2012-3-31 14:55 编辑

很明显你忽视了一个错误:readLine读取的数据是不包含任何换行符的,你客户端利用readLine将数据发送给服务器,服务器接收到的数据自然没有换行符,所以服务器端的readLine一直在等待那个换行符,也就堵塞了。
改成这个就行了bw.write(str1+"\r\n");还有服务器端的第一个while堵塞了,先给注释掉,可以改成多线程。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatRoomServer {
        public static void main(String[] args) {
                try {
                        ServerSocket ss = new ServerSocket(4800);
                        Socket s = ss.accept();
                        BufferedReader brs = new BufferedReader(new InputStreamReader(
                                        System.in));
                        BufferedReader br = new BufferedReader(new InputStreamReader(
                                        s.getInputStream()));

                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                                        s.getOutputStream()));
                        String str1, str2;
/*                        while (!(str2 = brs.readLine()).equals("bye")) {
                                System.out.println("服务器" + str2);
                                bw.write(str2);
                                bw.flush();
                        }
*/
                        while (!(str1 = br.readLine()).equals("bye")) {
                                System.out.print("客户端" + str1);
                        }

                        bw.close();
                        brs.close();
                        br.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ChatRoomClient {

        public static void main(String[] args) {
                try {
                        Socket s = new Socket("localhost", 4800);
                        BufferedReader brs = new BufferedReader(new InputStreamReader(
                                        System.in));
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                                        s.getOutputStream()));
                        BufferedReader br = new BufferedReader(new InputStreamReader(
                                        s.getInputStream()));
                        String str1, str2;
                        while (!(str1 = brs.readLine()).equals("bye")) {
                                System.out.println("客户端" + str1);
                                bw.write(str1+"\r\n");
                                bw.flush();
                                // str1 = brs.readLine();
                        }
                        while (!(str2 = br.readLine()).equals("bye")) {
                                System.out.println("服务器" + str2);
                        }
                        brs.close();
                        bw.close();
                        br.close();
                } catch (UnknownHostException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }

        }
}
回复 使用道具 举报
谢谢了,那怎么才能让服务器向客户端发东西呢
回复 使用道具 举报
胡生蒙 发表于 2012-3-31 22:41
谢谢了,那怎么才能让服务器向客户端发东西呢

//TCP 客户端向服务器端写消息   

package com.baidu.www;
  import java.net.*;
import java.io.*;
  public class TcpClient {
   public static void  main(String[]args)throws Exception{
       Socket socket=new Socket("127.0.0.1",6666);
       System.out.println("Client Started");
       BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//在本程序中向控制台发出输入请求
       BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//向服务器端写程序
       String  readline;
       //readline=br.readLine();      
       while ((!(readline=br.readLine()).equals("bye"))){
        bw.write(readline);
        bw.newLine();
        //readline=br.readLine();
       // System.out.println("刚才键入"+readline);
        bw.flush();      
       }
       bw.close();
       br.close();
       socket.close();  
       System.out.println("Client Over");
         }
       }



//服务器端读取客户端

package com.baidu.www;
import java.net.*;
import java.io.*;
import java.util.*;
public class TcpSocketServer {
  public static void main(String[]args)throws Exception {
    System.out.println("Server Started!");
    ServerSocket server=new   ServerSocket(6666);
    //Socket socket=null;
        //  socket = server.accept();
    Socket socket=server.accept();
    BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String Line;
    //Line = br.readLine();
   while(!(Line=br.readLine()).equals("bye")){
             System.out.println(Line);
          //   Line = br.readLine();
   }
     System.out.println("Server End!");
   br.close();
   server.close();

}


}



回复 使用道具 举报
胡生蒙 发表于 2012-3-31 22:41
谢谢了,那怎么才能让服务器向客户端发东西呢

大一时写的一个

    server端
package com.sina.www;
import java.net.*;
import java.io.*;
public class server {
public static void main(String[] args) throws Exception{       
        try {
                ServerSocket s = new ServerSocket(8888);//创建端口号
                Socket s1 = s.accept();//Socket接收

                OutputStream os = s1.getOutputStream();//在服务器端导入输出流
                DataOutputStream dos = new DataOutputStream(os);

                InputStream is = s1.getInputStream();//在服务器端导入输入流
                DataInputStream dis = new DataInputStream(is);

                //InputStreamReader isr = new InputStreamReader(System.in);
                //BufferedReader bf = new BufferedReader(isr);
                               
                new  MyReaderServer (dis).start();//实例化MyReaderServer类并调用start()方法
                new    MyWriterServer(dos).start();//实例化MyWriterServer类并调用start()方法
                System.out.println("在乎--主流:");//输出自己的网名
                                       

        } catch (Exception e) {
                e.printStackTrace();
        }
}
}
       
class MyReaderServer extends Thread {//创建读出对方发送信息的类
                private DataInputStream dis;
public MyReaderServer(DataInputStream dis) {//初始化
                        this.dis = dis;
                }

                public void run() { //创建run方法
                        String str;
                        try {
                                while (true) {
                                        str = dis.readUTF();//读出对方发送的消息
                                        System.out.println("舞动的心弦:" + str);//输出对方发送的消息
                                        if (str.equals("bye")) {//当对方发送的消息为bye时,聊天结束
                                                System.out.println("通话已经结束");
                                                System.exit(0);
                                        }
                                }
                        } catch (Exception ex) {
                                ex.printStackTrace();
                        }
                }

        }

        class MyWriterServer extends Thread {//创建向客户端写的类
                private DataOutputStream ops;

                public MyWriterServer(DataOutputStream ops) {
                        this.ops = ops;
                }

                public void run() {
                        InputStreamReader isr = new InputStreamReader(System.in);
                        BufferedReader br = new BufferedReader(isr);
                        String str;
                        try {
                                while (true) {
                                        str = br.readLine();
                                        ops.writeUTF(str);
                                        if (str.equals("bye")) {
                                                System.out.println("自己下线,程序退出");
                                                System.exit(0);
                                        }
                                }

                        } catch (Exception ed) {
                                ed.printStackTrace();
                        }

                }

        }


client端

package com.sina.www;
import java.net.*;
import java.io.*;
public class Client {
        public static void main(String[] args) throws Exception{
                try {
                        Socket s1 = new Socket("127.0.0.1", 8888);

                        InputStream is = s1.getInputStream();
                        DataInputStream dis = new DataInputStream(is);

                        OutputStream os = s1.getOutputStream();
                        DataOutputStream dos = new DataOutputStream(os);

                        new ReaderClient(dis).start();
                        new WriterClient(dos).start();
                        System.out.println("舞动的心弦:");
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }

}

class ReaderClient extends Thread {//创建读出对方发送信息的类
        private DataInputStream dis;
        public  ReaderClient(DataInputStream dis) {
                this.dis = dis;
        }

        public void run() {
                String str;
                try {
                        while (true) {
                                str = dis.readUTF();
                                System.out.println("在乎—主流:" + str);
                                if (str.equals("bye")) {
                                        System.out.println("通话已经结束");
                                        System.exit(0);
                                }
                        }
                } catch (Exception e1) {
                        e1.printStackTrace();

                }

        }

}

class WriterClient extends Thread {//创建写出信息的类
        private DataOutputStream dos;

        public WriterClient(DataOutputStream dos) {
                this.dos = dos;

        }

        public void run() {
                InputStreamReader isr = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(isr);
                String str;
                try {
                        while (true) {
                                str = br.readLine();
                                dos.writeUTF(str);

                                if (str.equals("bye")) {
                                        System.out.println("对方下线,程序退出");
                                        System.exit(0);
                                }
                        }
                } catch (Exception e2) {
                        e2.printStackTrace();
                }

        }

        }


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