TCP实现类似于聊天室一直接收不到!请给位资深老板给我个答案!

#TCP协议实现类似于qq聊天,我想实现一直对话的效果,但是客户端发送一个以后,服务器端一直收不到,也不关闭!

#客户端代码如下:

public class Tclicent {
    public void chatc() {
        try {
            Socket soc = new Socket( "192.168.3.48",100);
            try {
                InputStream i1 = soc.getInputStream();
                InputStreamReader i2 = new InputStreamReader(i1);
                BufferedReader b1 = new BufferedReader(i2);
                BufferedWriter b2 = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
                Scanner sc = new Scanner(System.in);
                while (true) {
                    String s = sc.nextLine();
                    System.out.println("客户端" + s);
                    b2.write(s+"\n");
                    String s1 = b1.readLine();
                    System.out.println(s1);
                }
            } finally {
                soc.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

#服务器端代码如下:

public class Tserver {
    public void chats() {
        try {
            ServerSocket ser = new ServerSocket(100);
            Socket accept = ser.accept();
            try {
                InputStream i1 = accept.getInputStream();
                InputStreamReader i2 = new InputStreamReader(i1);
                BufferedReader b1 = new BufferedReader(i2);
                BufferedWriter b2 = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
                Scanner sc = new Scanner(System.in);
                while (true) {
                    String s = b1.readLine();
                    System.out.println(s);
                    String s1 = sc.nextLine();
                    System.out.println("客户端:" + s1);
                    b2.write(s1+"\n");
                }
            } finally {
                ser.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端要创建并启用线程接收数据。

检查防火墻,另外,server 试试用 admin 起,1024以下的 port应该不是普通账户能起得了
起来 server 用 netstat 看看是不是在监听

接收到一个客户端的accept()后,你要开一个线程去维护这个长连接才能正常通讯
这是BIO服务端的模板代码


public class BIOServer {
    public static void main(String[] args) throws Exception {
        //创建线程池
        ExecutorService threadPool = Executors.newCachedThreadPool();
        //创建Socket 9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端:服务端启动成功,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
        while (true){
            //死循环监听客户端连接
            System.out.println("服务端:阻塞,等待新客户端连接");
            final Socket socket = serverSocket.accept();
            //创建一个线程和客户端通信
            threadPool.execute(new Runnable() {
                public void run() {
                    System.out.println("服务端:连接到一个客户端,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
                    handler(socket);
                }
            });
        }
    }

    //一个Handler方法用于处理客户端消息
    public static void handler(Socket socket){
        try {
            //创建一个byte数组用于接受数据
            byte[] bytes = new byte[1024];
            //从socket获取当前客户端的流
            InputStream inputStream = socket.getInputStream();
            //循环读取客户端的流
            while (true){
                System.out.println("服务端:阻塞,等待客户端发送数据,线程信息 ID="+Thread.currentThread().getId()+" Name="+Thread.currentThread().getName());
                int read = inputStream.read(bytes);
                //如果read不是-1表示有数据 把当前读取的内容打印出来
                if (read != -1){
                    System.out.println("接受到客户端消息:"+new String(bytes,0,read));
                }else {//否则就退出循环
                    break;
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("服务端:关闭和client的连接");
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}