在基础网络协议上,java 支持TCP/IP 和UDP/IP。在网络操作上java支持BIO和NIO(新I/O可以查看http://tech.ccidnet.com/art/322/20030903/62354_1.html)。因此java拥有四种方法实现基于消息的系统间通讯。
1.TCP/IP+BIO
java对于TCP/IP方式的网络传输提供了socket机制,这也是传统unix网络通讯的抽象机制。
而TCP/IP+BIO方式,java提供了Socket和ServerSocket两个关键类来实现。网络操作是通过java中的流对象进行的。包括:
服务端:
new ServerSocket(int port)端口(unix中1024以下端口需要root权限开启)
Socket socket = serverSocket.accept()
socket.getInputStream();
socket.getOutputStream();
客户端则是:
new Socket(String host, int port);建立连接,如果服务器未启动,则会报出Connection refused异常。
socket.getInputStream();
socket.getOutputstream();
下面给出一个完整的TCP/IP+BIO方式的
Client
package client;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
static int RMIPort = 9999;
public static void main(String[] args) throws ClassNotFoundException {
try {
Socket socket = new Socket("127.0.0.1", 9999);
byte[] bytes = new byte[64];
while (true) {
InputStream serverinput = socket.getInputStream();
int length = serverinput.read(bytes);
if (length > 0) {
System.out.println(new String(bytes, 0, length));
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server
package server;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
System.out.println("开始侦听请求 。。。。");
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(9999);
// 服务器套接字
Socket clientSocket = null;
clientSocket = serverSocket.accept();// 获得客户端的请求的Socket
System.out.println("已侦听到了客户端的请求。。。。。");
OutputStream os = clientSocket.getOutputStream();
while (true) {
os.write("test".getBytes());
os.write("a".getBytes());
os.write("b".getBytes());
os.write("c".getBytes());
os.flush();
//os.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我对上面的代码进行过debug
1.对客户端的read方法的测试
如果我把服务端断点设置os.write("test".getBytes());客户端断点设在int length = serverinput.read(bytes);
如图
此时在debug中可以看到Server.main和Client.main线程,我进入Client线程
int length = serverinput.read(bytes);
让这句执行下去,发现Client处于等待状态。
然后我进入Server线程
让os.write("test".getBytes());执行下去。
发现Client被激活了
可以确定一点read方法如果服务端无数据过来,它会让整个线程进入等待状态,直到有数据过来。
然后我让Client一直执行下去,直到while下次循环开始,到int length = serverinput.read(bytes);这句又让被断点停住。
然后我回到Server,让Servlet到os.write("c".getBytes());被断点停住。
,然后回到Client,让Client执行下去。发现Client同时把ab两个字符都读出来了。说明read读取的数量不是服务端一次write的数量。而是从字节流缓存器读一次。一个缓冲器的数据就是最终读取的数据量。
上图是Client的输出结果
下面是对read的长度的测试;
由于很多情况下我们都是对read的结果来进行判断数据读取时候结束的。当返回的长度<1我们就认为是读取结束了。代码可能类似我上面的Client中的
int length = serverinput.read(bytes);
if (length > 0) {
System.out.println(new String(bytes, 0, length));
}
那么read在什么情况下会返回< 1的结果呢?
我修改Server,
package server;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
System.out.println("开始侦听请求 。。。。");
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(9999);
// 服务器套接字
Socket clientSocket = null;
clientSocket = serverSocket.accept();// 获得客户端的请求的Socket
System.out.println("已侦听到了客户端的请求。。。。。");
OutputStream os = clientSocket.getOutputStream();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意上面,客户端链接过来后,服务端会把输出流关闭。
客户端断点还是设在int length = serverinput.read(bytes);
服务端断点设置在
os.close();
然后我测试了下
让客户端int length = serverinput.read(bytes);这句执行下去
这时候客户端线程已经暂停了。
然后让服务端的os.close();这句执行下去。
发现客户端被激活了。
但是可以看到这时候客户端的length值是-1
可见read为-1的情况是连接断开或其他原因,造成两边无法传递数据的情况下。
由于我没有看过TCP/IP协议的完整资料。所以以上只是个人测试的结果,我无法提供TCP/IP的资料加以确认。

- 大小: 7 KB

- 大小: 7.3 KB

- 大小: 20.1 KB

- 大小: 6.2 KB

- 大小: 8.8 KB

- 大小: 1 KB

- 大小: 5.2 KB
分享到:
相关推荐
"建设工程造价管理基础知识电子书版借鉴.pdf" 本资源为建设工程造价管理基础知识电子书版借鉴,旨在为建设工程项目管理和造价管理人员提供相关知识和信息。本资源涵盖了建设工程造价管理的基础知识,包括相关法规与...
"建设工程造价管理基础知识" 本资源摘要信息涵盖了建设工程造价管理的基础知识,包括相关法规与制度、项目管理、合同管理、造价构成、计价依据、决策和设计阶段工程造价的确定与控制、招投标与合同价款的确定、施工...
ERP基础知识教程,ERP基础知识教程ERP基础知识教程ERP基础知识教程ERP基础知识教程ERP基础知识教程
JAVA2核心技术第1卷:基础知识(原书第7版)(PDF中文版)part1(压缩包名:JAVA2核心技术第1卷:基础知识(原书第7版).part1); JAVA2核心技术第1卷:基础知识(原书第7版)(PDF中文版)part2(压缩包名:JAVA2核心技术第1...
计算机专业基础知识点是每个IT从业者或学习者都必须掌握的核心内容。这涵盖了多个领域,包括计算机体系结构、数据结构、算法、操作系统、网络和数据库等。408计算机基础标签表明了这些知识点主要针对计算机科学与...
网络管理员基础知识.pdf网络管理员基础知识.pdf网络管理员基础知识.pdf网络管理员基础知识.pdf网络管理员基础知识.pdf网络管理员基础知识.pdf
本人用于公司内部网络基础知识培训的PPT,供大家分享。
电力系统基础知识,对于初步涉入电力行业的人员学习使用
plc基础知识入门.ppt
计量基础知识考试题库及答案 本资源摘要信息是关于2021年计量基础知识考试题库及答案的详细知识点总结。计量基础知识考试题库及答案是计量基础知识的重要组成部分,对于计量基础知识的学习和应用具有重要的参考价值...
关于存储系统的基础知识,包括第一部分:存储相关基础知识、第二部分:存储中常用的术语、第三部分:DAS、NAS、SAN、iSCSI
文件中包括计算机公共基础考试中的知识要点,考点总结,以及几套公共基础知识120道题,覆盖面全,内容详细
PLC 基础知识大全 PLC 基础知识大全 PLC 基础知识大全
2023年计算机基础知识试题及答案.pdf
数据中心的基础知识(40页)
全面认识大数据基础知识培训课件(60页)
ERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.doc
这是我学习过程中整理的oracle数据库基础知识,里面包含了DML、DDL等相关语句。还解释了什么情况下该用什么样的SQL。包含了很多基础知识。欢迎大家收藏。
医疗卫生基础知识考试试题及答案.pdf