在基础网络协议上,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" 本资源为建设工程造价管理基础知识电子书版借鉴,旨在为建设工程项目管理和造价管理人员提供相关知识和信息。本资源涵盖了建设工程造价管理的基础知识,包括相关法规与...
"建设工程造价管理基础知识" 本资源摘要信息涵盖了建设工程造价管理的基础知识,包括相关法规与制度、项目管理、合同管理、造价构成、计价依据、决策和设计阶段工程造价的确定与控制、招投标与合同价款的确定、施工...
电工基础知识是电子电路和电气工程领域的基础,对于任何涉及电能使用和电路设计的技术宅来说,这些知识是必不可少的。在家用电方面,理解电工的基础知识可以帮助我们解决日常生活中常见的电气问题,避免不必要的安全...
专项债基础知识手册
计算机专业基础知识点是每个IT从业者或学习者都必须掌握的核心内容。这涵盖了多个领域,包括计算机体系结构、数据结构、算法、操作系统、网络和数据库等。408计算机基础标签表明了这些知识点主要针对计算机科学与...
本人用于公司内部网络基础知识培训的PPT,供大家分享。
汽车电子基础知识大全268页
电力系统基础知识,对于初步涉入电力行业的人员学习使用
开关电源设计DCDC电源设计硬件物料基础知识大全: PCB板簡介.doc 中美德英线规对照表.doc 二极管 三极管 MOS器件基本原理.doc 元件技术.doc 公母座.doc 助焊剂.doc 包装材料.doc 半导体器件.doc 压敏电阻型号及电感...
plc基础知识入门.ppt
关于存储系统的基础知识,包括第一部分:存储相关基础知识、第二部分:存储中常用的术语、第三部分:DAS、NAS、SAN、iSCSI
数据库基础知识数据库基础知识
文件中包括计算机公共基础考试中的知识要点,考点总结,以及几套公共基础知识120道题,覆盖面全,内容详细
模拟电路基础知识教程.pdf模拟电路基础知识教程.pdf模拟电路基础知识教程.pdf模拟电路基础知识教程.pdf模拟电路基础知识教程.pdf
服务器基础知识全解,高清汇总版PPT
证券从业资格考试金融市场基础知识.pdf
适合没任何语言开发者 软件开发基础知识 软件开发基础知识
2023年计算机基础知识试题及答案.pdf
ERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.docERP基础知识.doc