zhangxu261 2011-07-29 16:31
浏览 240
已采纳

java socket server

用java编写的一个socket服务端,通过一个tcp测试工具测试这个服务端,发现发送数据给服务端,服务端接收不到,当tcp测试工具断开连接后,测试工具发送的字符串才被服务端接收到,这是为什么?

java socket服务端代码
[code="java"]
package com.myserver.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadServer {

private int port = 6666;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE = 10;//单个CPU线程池大小

public MultiThreadServer() throws IOException {
    serverSocket = new ServerSocket(port);
    //Runtime的availableProcessor()方法返回当前系统的CPU数目.
    executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
    System.out.println("server start");
}

public void service() {
    while (true) {
        Socket socket = null;
        try {
            //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
            socket = serverSocket.accept();
            executorService.execute(new Handler(socket));
            Count.add();
            System.out.println("client number " + Count.num);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws IOException {
    new MultiThreadServer().service();
}

}

class Handler implements Runnable {

private Socket socket;

public Handler(Socket socket) {
    this.socket = socket;
}

public void run() {
    try {
        System.out.println("a client connect " + socket.getInetAddress() + ":" + socket.getPort());
        PrintWriter writer = new PrintWriter(socket.getOutputStream());
        writer.println("connect success");
        writer.flush();
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String readLine = reader.readLine();
        while (true) {
            if (readLine != null) {
                System.out.println(readLine);
                readLine = reader.readLine();
            } else {
                break;
            }
        }
        writer.close();
        reader.close();
    } catch (IOException e) {
        System.out.println("a client leave");
        Count.sub();
        System.out.println("client number " + Count.num);
    } finally {
        try {
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}

class Count {
public static int num = 0;

public static void add() {
    num += 1;
}

public static void sub() {
    num -= 1;
}

}
[/code]

java服务端状态输出如下
server start
client number 1
a client connect /127.0.0.1:50437
affff

tcp测试工具截图
[img]http://dl.iteye.com/upload/attachment/526919/4726dc79-31b2-3216-8887-de70efdd80cb.jpg[/img]

补充说明:
tcp测试工具能够正常连接到服务端,但是文本数据发送,服务端不会实时显示,只有当测试工具断开连接时,这时,服务端才显示刚才测试工具发送的文本数据

  • 写回答

1条回答 默认 最新

  • 也许世界还没停 2011-07-29 16:51
    关注

    不要在网络中使用readline
    这个方法要判断换行符才结束的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示