
JavaSocket
阿-杰
享受挨踢的人生,分享技术的精彩!
展开
-
Mina源码阅读笔记(五)—Mina对连接的操作IoSession
接上一篇Mina源码阅读笔记(四)—Mina的连接IoConnector2IoSession是Mina管理两端的一个重要部分,也是Mina的核心,Session具有了生命周期的概念,它的生命周期和连接时紧密相关的,这点在后面的介绍中会涉及。另外,好像hibernate中也有session也有生命周期(真的是好久没有用了,连hibernate有里session是干嘛的都想不起来了)。原创 2014-06-01 16:53:23 · 1486 阅读 · 0 评论 -
基本套接字:UDP 客户端/服务器端
UDP客户端 UDP客户端首先向被动等待联系的服务器端发送一个数据报文。一个典型的UDP客户端主要执行以下三步: 1. 创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置。2. 使用DatagramSocket类的send() 和 receive()方法来发送和接收DatagramPacket实例,进行通信。 3. 通信完成后原创 2012-12-18 17:55:47 · 1878 阅读 · 0 评论 -
投票协议:构建和解析协议消息
我们再看一个简单的例子,对在实现别人定义的协议时可能用到的技术进行了介绍。这个例子程序是一个简单的"投票"协议,如图3.2所示。这里,一个客户端向服务器发送了一个请求消息,消息中包含了一个候选人ID,范围是0至1000。Vote Reques:投票请求, Candidate:候选人,Vote Count:选票总数 程序支持两种请求。一种是查询(inquiry),即向服务器询问给原创 2012-12-20 14:11:46 · 1083 阅读 · 0 评论 -
多任务处理:线程池
线程池 每个新线程都会消耗系统资源:创建一个线程将占用CPU周期,而且每个线程都自己的数据结构(如,栈)也要消耗系统内存。另外,当一个线程阻塞(block)时,JVM将保存其状态,选择另外一个线程运行,并在上下文转换(context switch)时恢复阻塞线程的状态。随着线程数的增加,线程将消耗越来越多的系统资源。这将最终导致系统花费更多的时间来处理上下文转换和线程管理,更少的时间来对连原创 2012-12-23 09:44:36 · 1170 阅读 · 0 评论 -
多任务处理:阻塞和超时
阻塞和超时 Socket的I/O调用可能会因为多种原因而阻塞。数据输入方法read()和receive()在没有数据可读时会阻塞。TCP套接字的write()方法在没有足够的空间缓存传输的数据时可能阻塞。 ServerSocket 的accept()方法和Socket的构造函数都会阻塞等待,直到连接建立。同时,长的信息往返时间,高错误率的连接和慢速的(或已发生故障的)服务器,都可能导致需要原创 2012-12-23 09:49:16 · 1369 阅读 · 0 评论 -
NIO:数据报(UDP)信道
数据报(UDP)信道 Java的NIO包通过DatagramChannel类实现了数据报(UDP)信道。与我们之前看到的其他形式的SelectableChannel一样,DatagramChannel在DatagramSocket上添加了选择和非阻塞行为,以及基于缓冲区的I/O操作能力。 DatagramChannel: 创建,连接和关闭 static DatagramChan原创 2012-12-30 09:08:22 · 1547 阅读 · 0 评论 -
Java_TCPIP_Socket编程(doc)下载
Java_TCPIP_Socket编程(doc)第 1 章 简介 31.1 计算机网络,分组报文和协议31.2 关于地址61.3 关于名字81.4 客户端和服务器81.5 什么是套接字.91.6 练习10第 2 章 基本套接字 102.1 套接字地址102.2 TCP套接字.172.2.1 TCP客户端.172.2.2 TCP服务器端..222.原创 2012-12-30 09:38:42 · 1360 阅读 · 0 评论 -
基本套接字:输入输出流
Java中TCP套接字的基本输入输出形式是流(stream)抽象。(Java1.4加入的NIO(New I/O)工具提供了另一种替代的抽象形式,我们将在第5章介绍。)流只是一个简单有序的字节序列。Java的输入流(input streams)支持读取字节,而输出流(outputstreams)则支持写出字节。在我们的TCP服务器和客户端中,每个Socket实例都维护了一个InputStre原创 2012-12-18 17:45:39 · 1175 阅读 · 0 评论 -
信息编码:字符串和文本
字符串和文本 历史悠久的文本(可打印,即可显示的字符串)可能是用来表示信息最常用的方式。文本使用起来非常方便,因为人们习惯于处理各种各样以字符串形式表示的信息,如书本中,报纸中,以及电脑显示器上的信息。因此,只要我们指定如何对要传输的文本进行编码,我们就几乎能发送其他任何类型的数据:先将其表示成文本形式,再对文本进行编码。显然,我们可以将数字和boolean类型的数据表示成String类型原创 2012-12-19 10:52:07 · 1080 阅读 · 0 评论 -
通信:成帧与解析
成帧与解析当然,将数据转换成在线路上传输的格式只完成了一半工作,在接收端还必须将接收到的字节序列还原成原始信息。应用程序协议通常处理的是由一组字段组成的离散的信息。成帧(Framing)技术则解决了接收端如何定位消息的首尾位置的问题。无论信息是编码成了文本、多字节二进制数、或是两者的结合,应用程序协议必须指定消息的接收者如何确定何时消息已完整接收。 如果一条完整的消息负载在一个Da原创 2012-12-19 11:03:11 · 1852 阅读 · 0 评论 -
投票协议:二进制表示方法
二进制表示方法 下面我们将展示另一种对投票协议消息进行编码的方法。与基于文本的格式相反,二进制格式使用固定大小的消息。每条消息由一个特殊字节开始,该字节的最高六位为一个"魔术"值010101。这一点少量的冗余信息为接收者收到适当的投票消息提供了一定程度的保证。该字节的最低两位对两个布尔值进行了编码。消息的第二个字节总是0,第三、第四个字节包含了candidateID值。只有响应消息的最后8原创 2012-12-20 14:14:18 · 1113 阅读 · 0 评论 -
多任务处理:一客户一线程
一客户一线程 在一客户一线程(thread-per-client)的服务器中,为每个连接都创建了一个新的线程来处理。服务器循环执行一些任务,在指定端口上侦听连接,反复接收客户端传入的连接请求,并为每个连接创建一个新的线程来对其进行处理。 TCPEchoServerThread.java实现了这种一客户一线程的服务器结构。它与迭代服务器非常相似,也是用一个循环来接收和处理客户端的请求。主要不原创 2012-12-23 09:42:58 · 1622 阅读 · 0 评论 -
基本套接字:TCP 套接字
TCP套接字 Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一端。一个TCP连接(TCP connection)是一条抽象的双向信道,两端分别由IP地址和端口号确定。在开始通信之前,要建立一个TCP连接,这需要先由客户端TCP向服务器端TCP发送连接请求。ServerSocket实例则监听TCP连接请求,并为每个请求创建原创 2012-12-18 17:42:23 · 1726 阅读 · 0 评论 -
线程ava.lang.OutOfMemoryError: unable to create new native thread
近日开发遇到多线程的问题:java.lang.OutOfMemoryError: unable to create new native threadException in thread "Thread-2" java.lang.OutOfMemoryError: unable to create new native thread原因是创建过多thread引出的原创 2013-10-16 14:35:46 · 3536 阅读 · 0 评论 -
Java Socket:Java-NIO-Selector
Selector 的出现,大大改善了多个 Java Socket的效率。在没有NIO的时候,轮询多个socket是通过read阻塞来完成,即使是非阻塞模式,我们在轮询socket是否就绪的时候依然需要使用系统调用。而Selector的出现,把就绪选择交给了操作系统(我们熟知的selec函数),把就绪判断和读取数据分开,不仅性能上大有改善,而且使得代码上更加清晰。 Java NIO的选择器部原创 2013-10-17 10:33:46 · 1680 阅读 · 0 评论 -
Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture
IoFuture是和IoSession紧密相连的一个类,在官网上并没有对它的描述,因为它一般不会显示的拿出来用,权当是一个工具类被session所使用。当然在作用上,这个系列可并不简单,我们先看源码的注释对它的描述:IoFuture represents the completion of an asynchronous I/O operation on an IoSession.原创 2014-06-01 16:54:51 · 1568 阅读 · 0 评论 -
Mina源码阅读笔记(四)—Mina的连接IoConnector1
上一篇写的是IoAcceptor是服务器端的接收代码,今天要写的是IoConnector,是客户端的连接器。在昨天,我们还留下一些问题没有解决,这些问题今天同样会产生,但是都要等到讲到session的时候才能逐步揭开。先回顾一下问题:l 我们已经在AbstractPollingIoAcceptor中看到了,mina是将连接(命令)和业务(读写)分不同线程处理的,但是我们还没有看到mina原创 2014-06-01 16:49:52 · 1674 阅读 · 0 评论 -
Mina源码阅读笔记(七)—Mina的拦截器FilterChain
Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理。我们先大致连接下mina中的filter能给我们带来什么。LoggingFilter logs all events and requests.ProtocolCodecFilter converts an incomin原创 2014-06-01 16:55:48 · 1443 阅读 · 0 评论 -
Mina源码阅读笔记(四)—Mina的连接IoConnector2
接着Mina源码阅读笔记(四)—Mina的连接IoConnector1AbstractIoAcceptor:001package org.apache.mina.core.rewrite.service;002 003import java.io.IOExce原创 2014-06-01 16:51:31 · 1404 阅读 · 0 评论 -
使用异步 I/O 大大提高应用程序的性能
AIO 简介Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。I/O 模型在深入介绍 AIO API原创 2014-05-13 21:33:32 · 1108 阅读 · 0 评论 -
同步和异步,阻塞和非阻塞
什么是阻塞和非阻塞;什么是同步和异步;FTP传输在局域网中为什么这么快;C/S下采用什么样的模式才能更快,或者客户端怎么样才能发的更快;每次传多少才能到最大的性能。……今天找了大神分析了下项目的代码,拆包压缩的工作太频繁,而且每个切片都做一次checksum,导致性能上不去,这个之前也想到了。而真正的问题我觉得还是出在了通信模式上。到底客户端怎么发数原创 2014-05-13 21:30:52 · 1223 阅读 · 0 评论 -
多线程中使用静态方法是否有线程安全问题
类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。 简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。 我们在知道, 静态字段(static field)和静态方法(static method)的原创 2014-04-11 09:25:13 · 3762 阅读 · 0 评论 -
"AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no freetype in java.library.path
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no freetype in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)at java.lang.Runtime.loadLibrary0(Ru原创 2013-11-19 20:32:39 · 3880 阅读 · 0 评论 -
Java多线程操作局部变量与全局变量
在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的“线程池”,JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索。 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对“单对象多线程”的情况进行讨论,一般会将其分成两部分,一部分是关于“共享原创 2013-10-18 10:30:04 · 23572 阅读 · 1 评论 -
Java中使用C3P0连接池
先看官网给的范例:import java.sql.*;import javax.naming.*;import javax.sql.DataSource;import com.mchange.v2.c3p0.DataSources;/** * This example shows how to acquire a c3p0 DataSource and * bind i原创 2013-10-17 21:32:22 · 2493 阅读 · 0 评论 -
Java Socket:Java-NIO-ServerSocketChannel
ServerSocketChannel让我们从最简单的ServerSocketChannel来开始对socket通道类的讨论ServerSocketChannel是一个基于通道的socket监听器。它同我们所熟悉的java.net.ServerSocket执行相同的基本任务,不过它增加了通道语义,因此能够在非阻塞模式下运行。用静态的open( )工厂方法创建一个新的Se原创 2013-10-17 13:37:18 · 2379 阅读 · 1 评论 -
多任务处理:控制默认行为
控制默认行为 TCP/IP协议的开发者用了大量的时间来考虑协议的默认行为,以满足大部分应用程序的需要。(如果你对此表示怀疑,可以参考RFC1122和1123,它们根据多年的经验对TCP/IP协议的实现的推荐行为进行了详尽的描述。)对于大多数应用程序来说,这些设计都非常适合,然而,"满足所有需求的一种尺寸"能够真正适用于所有场合的情况非常少。前面我们已经看到UDP回显客户端的例子。默认情况下,D原创 2012-12-25 14:33:30 · 1150 阅读 · 0 评论 -
NIO:Selector 类用法
如本章第1节中提到的,Selector类可用于避免使用非阻塞式客户端中很浪费资源的"忙等"方法。例如,考虑一个即时消息服务器。可能有上千个客户端同时连接到了服务器,但在任何时刻都只有非常少量的(甚至可能没有)消息需要读取和分发。这就需要一种方法阻塞等待,直到至少有一个信道可以进行I/O操作,并指出是哪个信道。NIO的选择器就实现了这样的功能。一个Selector实例可以同时检查(如果需要,也可以等原创 2012-12-29 08:55:37 · 1837 阅读 · 0 评论 -
NIO:Selector 详解
示例程序TCPEchoServerSelector中展示了Selector的基本用法。在此,我们将对其进行更加详细的介绍。Selector: 创建和关闭static Selector open()boolean isOpen()void close()调用Selector的open()工厂方法可以创建一个选择器实例。选择器的状态是"打开"或"关闭"的。创建时选择器的状态是打开的原创 2012-12-30 09:06:20 · 1791 阅读 · 0 评论 -
Java开发技术大全(由简入深500个源码讲解)
下面是java代码的范例列表: 代码运行环境 所有的源程序(除书中特别注明的错误例子外)在以下环境调试通过: (1)操作系统:Windows 2000/XP/7 (2)编辑环境:UltraEdit/Eclipse/JCreator (3)编译和运行环境:JDK 1.5以上版本 (4)JSP容器:Tomcat 5.5以上版本 (5)数据原创 2012-12-03 12:58:54 · 2841 阅读 · 0 评论 -
信息编码:位操作布尔值编码
位操作:布尔值编码 位图(Bitmaps)是对布尔信息进行编码的一种非常紧凑的方式,通常用在协议中。位图的主要思想是整型数据中的每一位都能够对一个布尔值编码--通常是0表示false,1表示true。要操纵位图,你需要了解如何使用Java中的"位操作"方法来设置和清除单独的一位。掩码(mask)是一个的整数值,其中有一位或多位被设为1,其他各位被清空(即,设为0)。在这里我们处理的是int原创 2012-12-19 10:53:53 · 1086 阅读 · 0 评论 -
投票协议:基于文本的表示方法
首先,我们介绍一个用文本方式对消息进行编码的版本。该协议指定使用US-ASCII字符集对文本进行编码。消息的开头是一个所谓的"魔术字符串",即一个字符序列,用于接收者快速将投票协议的消息和网络中随机到来的垃圾消息区分开。投票/查询布尔值被编码成字符形式,'v'表示投票消息,'i'表示查询消息。消息的状态,即是否为服务器的响应,由字符'R'指示。状态标记后面是候选人ID,其后跟的是选票总数,它们都编原创 2012-12-20 14:13:14 · 923 阅读 · 0 评论 -
多任务处理:服务器协议
服务器协议 既然我们将要介绍的多任务服务器方法与特定的客户端-服务器协议相互独立,我们希望能够实现一个同时满足两者的协议。EchoProtocol中给出了回显协议的代码。这个类的静态方法handleEchoClient()中封装了对每个客户端的处理过程。除添加了写日志功能(马上会对其介绍)外,这段代码与TCPEchoServer.java中的连接处理部分几乎完全一致。该方法的参数是客户端Soc原创 2012-12-23 09:41:46 · 1207 阅读 · 0 评论 -
通信模块:网络编程原理及Socke函数详解
1、网络中进程之间如何通信?2、Socket是什么?3、socket的基本操作3.1、socket()函数3.2、bind()函数3.3、listen()、connect()函数3.4、accept()函数3.5、read()、write()函数等3.6、close()函数4、socket中TCP的三次握手建立连接详解原创 2012-11-01 10:26:20 · 1871 阅读 · 0 评论 -
Java多线程1-安全性、互斥与同步
首先举例说明: Count.java:[java] view plaincopyprint?public class Count { private int num; public void count() { for(int i = 1; i 10; i++) { num += i;原创 2012-11-02 08:34:33 · 1164 阅读 · 0 评论 -
Java多线程2-线程协作、Timer和TimerTask
线程协作 生产者/消费者模式是一个经典的线程同步以及通信的模型。 假设有这样一种情况,有一个盘子,盘子里只能放一个鸡蛋,A线程专门往盘子里放鸡蛋,如果盘子里有鸡蛋,则一直等到盘子里没鸡蛋,B线程专门从盘子里取鸡蛋,如果盘子里没鸡蛋,则一直等到盘子里有鸡蛋。这里盘子是一个互斥区,每次放鸡蛋是互斥的,每次取鸡蛋也是互斥的,A线程放鸡蛋,如果这时B线程要取鸡蛋,由于A没原创 2012-11-02 08:43:54 · 1456 阅读 · 0 评论 -
Java多线程3-线程池、Callable和Future
线程池 java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。 我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的原创 2012-11-02 08:48:14 · 2529 阅读 · 0 评论 -
Java多线程4- Lock、Condition
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:[java] view plaincopyprint?public cla原创 2012-11-02 22:15:16 · 1221 阅读 · 0 评论 -
如何开发一个SocketServer-Client模型的程序
开发原理: 服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。 客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socke原创 2012-11-01 10:21:30 · 1127 阅读 · 1 评论 -
NIO:与 Buffer 一起使用 Channel
如前文所述,Channel实例代表了一个与设备的连接,通过它可以进行输入输出操作。实际上Channel的基本思想与我们见过的普通套接字非常相似。对于TCP协议,可以使用ServerSocketChannel和SocketChannel。还有一些针对其他设备的其他类型信道(如,FileChannel),尽管我们在后文中不会再提及,这里介绍的大部分内容对于它们同样适用。信道(channel)和套接字(原创 2012-12-29 08:52:13 · 1160 阅读 · 0 评论