java socket server

2019-03-25 13:38|来源: 网路

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

java socket服务端代码
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;
	}
}


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

tcp测试工具截图


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

相关问答

更多
  • 最简单的就是将dins.readUTF()方法换成dins.readLine(),出错的原因是到达流的末尾导致的意外终止。 你会发现readLine()方法已经是废弃方法,不建议使用了。 比较常规的方法是使用 BufferedReader br= new BufferedReader(new InputStreamReader(ins)); 来替代DataInputStream 祝你好运!
  • 1. ServerThread中,已从主线程中得到一个已连接上的Socket socket,但你在ServerThread中又开了一个ServerSocket监听了另一个端口,又把传入来的socket=server.accept();那么在主线程中连接到的那个对话就没有用了,而且那个socket还没有关闭,一直连接着. 2. ServerThread中开的ServerSocket在这里是费的,在ServerThread里你没有循环accept();连接,所以只要有第一个连上了,这个ServerSocket就 ...
  • 服务器使用in.readLine()读取,而客户端使用print() (无新行)。 所以服务器正在等待出现从未发生的新行。 尝试在客户端使用println()编写。 此外,您需要刷新您的out.flush() :add out.flush() 。 这是使编写器实际发送其有效负载所必需的。 The server reads with in.readLine() while the client prints with print() (no new line). So the server is waitin ...
  • 不要在循环中创建新的ServerSocket - 您只需要在循环中接受 : ServerSocket myServerSocket = new ServerSocket(9999); while (true) { Socket skt = myServerSocket.accept(); Handling obj = new Handling(); obj.handle(skt); } Don't create a new ServerSocket in the loop - yo ...
  • 除非我完全误读了文档,否则flash.net.Socket和java.net.Socket都是客户端套接字。 您需要一侧作为服务器套接字才能将它们连接在一起。 对于Java中的服务器端,请查看本演练: Socket Communications 。 Unless I'm misreading the docs completely, both flash.net.Socket and java.net.Socket are client sockets. You need one side to be a ...
  • 至少: 从Socket.setSoTimeout() javadoc接收异常并不意味着套接字总是死的: 如果超时到期[例如,在读取时,会引发java.net.SocketTimeoutException,尽管Socket仍然有效。 套接字的关闭标志似乎只在Socket.close()方法时设置,所以我不会依赖它。 At least: Receiving an exception does NOT mean the socket is always dead, from Socket.setSoTimeout ...
  • 小程序只能连接到从中下载的服务器。 出于安全原因,存在此限制。 因此,如果您的applet的code属性是http://mycompany.com/myapplet ,则必须从applet连接到mycompany.com。 否则您将获得安全性异常。 如果你真的需要连接到其他地方,你必须签署你的applet。 Applets can connect only to server they were downloaded from. This restriction exists for security re ...
  • 这可能是因为循环永远不会停止: while(true) { //code 你可以使用我为java服务器和客户端制作的类: ChatCleint package com.weebly.foxgenesis.src; import java.net.*; import java.io.*; public final class ChatClient { private Socket socket = null; private DataOutputStrea ...
  • 确定发现了问题,你必须在php中显示行结束的位置,以便套接字可以发送它,它将像魅力一样工作:) socket_write ($my_socket, $data."\r\n", strlen ($data."\r\n")); ok found the problem, you have to show where is the end of the line in php so the socket could send it, and it will work like a charm :) sock ...
  • 在你的代码中 Client clientSocket = new Client(9999,"host"); 你可以改变并运行 Client clientSocket = new Client(9999,"localhost"); 您的代码正在寻找名为“host”的主机。 要么给它主机的IP地址。 如果要使用上面定义的变量host使用 Client clientSocket = new Client(9999,host); 但我没有看到它被初始化的地方 In you code Client client ...