最近一直在看Socket,将自己的所学的记录一下。
TCP/TP
不详细涉及,网络上有充足的信息,可以参考
http://baike.baidu.com/view/7729.htm。我说熟知的便是TCP/UDP属于传输层,而IP属于网络层。而IP提供了TCP/UDP网络传输的底层机制。
TCP提供检测和恢复IP层中通道可能造成的数据丢失以及其他错误。它的通道是基于byte-stream的,但是这个特点可能会造成报文接收不能与发送发一致,稍后谈这个问题。
UDP不对传输造成的错误进行修复,使用它时需要考虑处理这些问题。
Traditional Socket
再没有nio之前,一般使用blocking的方式编程。为了提高并发性,一般使用thrad-per-request的方式。
ss = new ServerSocket(10000);
while (true)
{
socket = ss.accept();
new Thread(new handle(socket)).start();//将处理丢给worker thread
}
当然这也有个问题,OS所能创建的thread是有限的,肯定不能无限制的创建,否则的话性能可能会不升反降。所以,可以采用thread pool的方式。1.5提供了很好的并发类库,所以可以将其修改为,
ArrayBlockingQueue workQueue = new ArrayBlockingQueue<Runnable>(20);
ThreadPoolExecutor excutor = new ThreadPoolExecutor(
20,
20,
60,
TimeUnit.SECONDS,
workQueue);
ss = new ServerSocket(10000);
while (true)
{
socket = ss.accept();
// new Thread(new handle(socket)).start();
excutor.execute(new handle(socket)); //handle by thread pool
}
TCP Stream
解释一下上面提到的“报文接收不能与发送发一致”。这个问题很容易模拟出来,举个例子,
引用
发送 1,2,3
引用
但是收到的却是 12,3
看了一些资料,果然有本书提到这个问题,大意是,
引用
若使用TCP,则不能假设在写入的输入流与输出流之间有任何联系。
实际表现就是一个read()可能会获得多次write()的值。这个应该是取决于read()时使用的buffer的大小以及write()的时机。
关于这点我认为只需要keep in mind即可,呵呵
。NIO在看,改天再录,最近一直在找关于NIO的长连接写法,教程和网上基本都是短连接的。
分享到:
相关推荐
Java应用Socket通讯一对多: ⑴、一对多; ⑵、通过list/map存储连接的socket对象,服务端向所有客户端群发消息,可以修改为服务端向指定客户端发送消息; ⑶、自动定时扫描客户端,移除断开的连接。
java socket教程java socket教程java socket教程
在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源
JAVA Socket教程 Java网络编程之传输控制协议 Socket套接字—Java套接字编程
java socket client 断线重连的简单实现 有什么意见可以提哦
Java Socket 聊天通信演示代码 Java Socket 聊天通信演示代码
1. 满足具有Socket客户端需求的基本应用. 2. 满足具有Socket服务端的基本应用. 具备并发能力, 能满足可设定个数客户端连接. 参考个人博客: http://blog.csdn.net/ostrichmyself/article/details/6618349
java socket使用加密协议传输对象
java socket 学习资料java socket 学习资料java socket 学习资料java socket 学习资料java socket 学习资料
java socket源码解析 java socket源码解析 java socket源码解析 java socket源码解析
Java Socket编程.pdf Java Socket编程.pdf Java Socket编程.pdf
Java Socket 操作 Demo import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import ...
java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。
java socket处理硬件传过来的16进制数据的工具类,包含大小端转换、byte[]数组转换为16进制的字符串、byte[]转ByteBuffer、16进制字符串转换为byte数组等
Java 基于socket聊天室客户端的代码
java socket nginx tcp转发 用户真实IP测试,文章请看我的博客
java socket 聊天系统 java传输文件 多线程聊天系统
java Socket 编程配套源码
用JAVA实现的文件上传,控制台输入,保存到数据库
此代码为 tcp 协议传输 java socket 图片