java socket server

用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测试工具能够正常连接到服务端,但是文本数据发送,服务端不会实时显示,只有当测试工具断开连接时,这时,服务端才显示刚才测试工具发送的文本数据
2019-03-25 13:38

相关教程

更多

Java socket通信

是从网上找到的聊天程序 有服务器和客户端, 在注册完之后出现 java.io.StreamCorruptedException: invalid stream header: 2A2A2A2A  Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException  at Register.register(

java server怎样和c++ client实现SSL通信??

java keytool生成的证书是CRT等格式的,这种格式是2进制编码的,而C++用的证书格式是pem,pem是ascii编码的。  我用keytool无法生成pem,并且又无法把C CLIENT给我的pem放进我的truststore中。  weblogic还只能用JKS来实现SSL  求高端玩家帮忙呀。。。     问题补充:     beneo 写道      socket跟语言无关

引入thread后socket接受不了报文了

不使用线程thread可以正常接受报文,加了后就在recvfrom那里不动了,是怎么回事?  using namespace std;  #include <thread>  #include <iostream>  #include <stdio.h>  #include <stdlib.h>  #include <errno.h>

Another MySQL daemon already running with the same unix socket.

两个方法解决: 第一个是立即关机 使用命令 shutdown -h now 关机,关机后在启动,进程就停止了。 第二个直接把mysql.sock文件改名即可。也可以删除,推荐改名。 然后就可以启动mysql了。 下面是国外原文 To prevent the problem from occurring, you must perform a graceful shutdown of the ser

Hadoop的thrift server配置

说明:Hadoop版本:hadoop-1.2.1.tar.gz。linux系统12.04,不过这里跟系统无关,可能安装软件的命令有差别。 相关阅读:  在Ubuntu 12.10 上安装部署Openstack http://www.linuxidc.com/Linux/2013-08/88184.htm Ubuntu 12.04 OpenStack Swift单节点部署手册 http://www.

socket访问页面时返回了301重定向的代码,我该怎么解决?

我在网上查了查,好像应该在次请求一下返回的location,但我不知道该怎么改代码.麻烦高手帮我看看.没多少分了  下面是我的代码,我请求的是一个测姻缘的网站..  import java.io.BufferedReader;  import java.io.BufferedWriter;  import java.io.InputStreamReader;  import java.io.Out

3年swing,1年JavaEE,1年java socket转android什么待遇

3年swing,技能除了跟做游戏的比足够了。做过IM 3款,手术X光机客户端1款,线程是我的强项,过度Android有绝对的自信。  1年JavaEE,spring struts都摸过,腻外了  1年java服务器开发,做过的项目包括网关、邮件服务器、金融信息发布、用过纯socket,MIMA框架,设计过协议,也熟悉一些协议比如sip、xmpp、activesync、webdav等等,http更不

HDFS1.0源代码解析—Hadoop的RPC机制之Server端解析

上一篇文章结合DN的应用简单的介绍了一下Hadoop RPC中client端的基本执行流程,算是给大家阅读源代码的一点提示吧。本文将对RPC的Server端的机制做一下简单的分析,但愿对大家的理解有所帮助,也算是对自己工作的一点总结。 按照惯例先来看一下Server类主要的组成部分Listener、Handler、Responser,通过名字很容易看出Server功能由三部分构成,负责获取用户请求

OpenCms 集成外部Solr Server

OpenCms默认是以内嵌的Solr作为全文搜索服务的,不过我们也可以配置一个独立的Solr搜索服务器 设置外部Solr Server  1. 从Solr 官方站点http://lucene.apache.org/solr/downloads.html下载solr最新版,目前是4.2.1版本,解开压缩包solr-4.2.1.zip, 解压缩文件至solr-4.2.1目录中 2. 创建一目录取名为S

solrcore.properties定义server是否是master

If the configuration directory for a Solr core contains a file namedsolrcore.propertiesthat file can contain any arbitrary user defined property names and values using the Java standardproperties file

Hadoop源码分析之一(RPC机制之Server)

网上已经有很多关于Hadoop源码分析的好文,在这记录的目的是把自己在看Hadoop源码时自己的一些体会,方便日后查询巩固。 相关阅读:Hadoop源码分析之二(RPC机制之Call处理) http://www.linuxidc.com/Linux/2013-01/77252.htm 想了解Hadoop是如何工作的,首先需要了解Hadoop RPC原理。Hadoop提供了一个统一的RPC机制来处理

命令行运行Hbase: Session 0x0 for server null, unexpected error

又重新看了下hbase的操作,以前虽说是运行过对Hbase的操作,比如直接的建表,导入数据,或者是使用MR操作Hbase,但是都是在单节点上做的,而且是用eclipse下操作的,不用担心一些包的问题。今天打算把代码拷贝到Hadoop的lib下面,然后在命令行中运行,遇到的一个问题如下:     12/09/2912:29:36INFOzookeeper.ZooKeeper:Initiatingcl

Solr Server对外提供Web Service的沟通方式 使用SolrJ跟Solr Server通信

使用SolrJ跟Solr Server通信     郝国梁 (2009年8月 3日 23:09)    |   暂无评论   |   暂无引用通告        我们都知道Solr Server对外提供Web Service的沟通方式,接受Xml格式的Post数据。这种方式本身没有问题,可当我们要把Solr跟我们的业务逻辑整合时,我们希望更加友好的接口和工具。SolrJ等Solr Client应运

rsync 文件校验及同步原理及rsync server配置

参考:http://rsync.samba.org/how-rsync-works.html 我们关注的是其发送与接收校验文件的算法,这里附上原文和我老婆(^_^)的翻译: The Sender The sender process reads the file index numbers and associated block checksum sets one at a time from

Hadoop海量put时出现的socket超时导致put失败解决方案

当一个HDFS系统同时处理许多个并行的put操作,往HDFS上传数据 时,有时候会出现dfsclient 端发生socket 链接超时的报错,有的时候甚至会由于这种原因导致最终的put操作失败,造成数据上传不完整。 log类似如下: All datanodes *** are bad. Aborting... 类似这样的错误,常常会在并行的put操作比较多,比如 60-80个,每个put的数据量约

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案