- 浏览: 961858 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
在基础网络协议上,java 支持TCP/IP 和UDP/IP。在网络操作上java支持BIO和NIO(新I/O可以查看http://tech.ccidnet.com/art/322/20030903/62354_1.html)。因此java拥有四种方法实现基于消息的系统间通讯。
TCP/IP+BIO[/b]
java对于TCP/IP方式的网络传输提供了socket机制,这也是传统unix网络通讯的抽象机制。
而TCP/IP+BIO方式,java提供了Socket和ServerSocket两个关键类来实现。网络操作是通过java中的流对象进行的。包括:
服务端:
new ServerSocket(int port)端口(unix中1024以下端口需要root权限开启)
Socket socket = serverSocket.accept()
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的资料加以确认。
TCP/IP+BIO[/b]
java对于TCP/IP方式的网络传输提供了socket机制,这也是传统unix网络通讯的抽象机制。
而TCP/IP+BIO方式,java提供了Socket和ServerSocket两个关键类来实现。网络操作是通过java中的流对象进行的。包括:
服务端:
new ServerSocket(int port)端口(unix中1024以下端口需要root权限开启)
Socket socket = serverSocket.accept()
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的资料加以确认。
发表评论
-
java实现socks5
2019-07-16 23:05 1727socks5的基础知识 关于socks5的定义]https: ... -
java Runtime.exec方法详解
2019-07-11 14:11 21561.关于CMD(为了让exec ... -
Spring 定时任务,cron表达式,@Scheduled cron表达式
2016-04-25 15:48 5303一个cron表达式有至少6 ... -
xulrunner
2016-01-13 13:07 669http://ftp.mozilla.org/pub/xulr ... -
谈一谈自己对依赖、关联、聚合和组合之间区别的理解
2015-11-17 16:05 780在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系 ... -
java apache common unicode处理
2015-09-19 15:17 1567if (UnicodeConvertType.中文转unico ... -
jdbc ssh通道
2015-09-17 14:40 1866java通过ssh链接数据库,需要用到 JSCH是一个纯粹的用 ... -
swt 窗口 最大化最小化按钮设置等
2015-09-14 17:53 4332窗体顶部菜可以在实例化的时候设置,也可以单独设置:Shell ... -
java.lang.Process调用程序阻塞问题解决
2015-08-14 10:56 4264这两天一直在处理flv视频环境的搭建工作,包括服务器的安 ... -
java html解析
2015-07-31 17:31 1214dom解析是常用dom4j。 android中我们常用的是sa ... -
slf4j门面模式实现原理
2015-07-16 10:08 2987在使用slf4j的时候,只 ... -
java - 比较时间-相差月数
2015-06-15 09:57 1471Date经常会出现比较两个Date相差的月数,实际上可以做一个 ... -
log4jdbc
2014-12-25 13:55 3054该框架目前支持到jdbc3.和jdbc4的版本。 提供了多种 ... -
jdbc规范 jdbc1 jdbc2 jdbc3 jdbc4
2014-12-25 13:49 5076目前jdbc规范已经升级到 ... -
反射,代理,动态java原理
2014-12-22 16:44 1124需要两个类,用于下面的测试 package test; ... -
Bean Validation 1.0(JSR-303)
2014-11-18 16:15 1097http://jinnianshilongnian.iteye ... -
JRE最小化原理
2014-10-15 20:19 1309比如我们一个程序只用到了很少的类,像String,Intege ... -
时间重叠的判断
2014-02-14 11:16 1652如上图,粗线是时间1 细线是时间2 时间重叠,只可能是以上四 ... -
java获取当前类的绝对路径
2013-12-14 00:37 9001.如何获得当前文件路径 常用: (1).Test.class ... -
枚举 enum
2013-12-13 16:52 5236java的enum其实是一个类。编译器根据你enum的定义会为 ...
相关推荐
在Java编程语言中,Socket是网络通信的基本组件,它提供了进程间网络通信的能力。而NIO(Non-blocking Input/Output,非阻塞I/O)是Java提供的一个高性能的I/O模型,与传统的阻塞I/O相比,NIO具有更高的并发性能。本...
Java Socket通信是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的双向通信。在这个"Java仿QQ聊天"项目中,我们利用TCP协议建立可靠的连接,通过Java Socket API来模拟QQ聊天的功能,包括视频聊天和...
Java Socket是Java提供的网络通信接口,它允许两个网络应用程序之间建立全双工的数据通信。在Java聊天室中,Socket用于连接客户端和服务器,使得它们之间可以交换数据。客户端通过创建Socket对象,连接到服务器的...
Java Socket是Java编程语言中实现网络通信的基础组件,它提供了应用程序与网络协议的接口,使得开发者可以构建基于TCP(传输控制协议)或UDP(用户数据报协议)的应用程序。本教程将深入探讨Java Socket编程的核心...
Java Socket是Java编程语言中用于网络通信的核心API,它提供了低级别的、面向连接的、基于TCP/IP的通信机制。在Java Socket编程中,我们可以创建服务器端(ServerSocket)来监听客户端(Socket)的连接请求,然后...
Java版的Socket编程是网络通信的核心技术之一,尤其在构建局域网聊天工具时尤为重要。本项目通过Java实现了一个功能丰富的即时通讯应用,包括全新界面风格、文字聊天、文件传输、窗口抖动以及语音聊天等功能。 1. *...
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
java socket client 断线重连的简单实现 有什么意见可以提哦
Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个基于Java Socket实现的简单模拟QQ聊天程序中,我们主要探讨以下几个核心知识点: 1. **Socket原理**...
Java网络编程是构建分布式应用程序的关键技术,而Java Socket编程则是其核心部分,允许两台计算机通过网络进行双向通信。在Java中,Socket是基于TCP/IP协议的,提供了可靠的、面向连接的数据传输服务。 首先,理解...
java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。
通过阅读《Java网络编程文档教材》和《Java基础三步学会JavaSocket编程》,你可以更深入地了解Java Socket编程的细节和实践技巧。理论结合实践,才能真正掌握这一技术。在实际开发中,不断优化和调试,才能编写出...
Java的Socket实现的多人聊天程序是一个基于网络通信的项目,主要利用了Java的Socket类来构建客户端和服务端的通信桥梁。Socket是TCP/IP协议的一部分,它提供了两台计算机之间进行数据传输的基础。在这个项目中,...
Java TCP/IP Socket编程是网络通信领域中的核心技术,尤其在Java平台中,Socket是实现客户端与服务器之间通信的基础。原书第二版深入浅出地讲解了Java Socket编程的各个方面,为开发者提供了全面的学习资源。以下是...
Java网络课程设计-Socket聊天室项目案例源码.rar Java网络课程设计-Socket聊天室项目案例源码.rar Java网络课程设计-Socket聊天室项目案例源码.rar JavaSocket聊天室 用Java图形用户界面编写聊天室服务器端和客户端...
下面将详细介绍Java Socket的好处以及如何进行Socket网络编程。 一、Java Socket的优点 1. **稳定可靠**:Java Socket建立在TCP协议之上,TCP是一种面向连接的、可靠的传输协议,可以确保数据的完整性和顺序性,...
利用Socket原理java实现双方实时通信。只要将代码中客户端的回环地址更改成通信的另一方的IP地址,再把服务器端程序在此IP地址上编译运行即可。在服务端开启后,再使本机的客户端程序运行即可实现双方通信。
Java网络编程是使用Java语言编写网络应用程序的过程,而Socket编程是实现Java网络编程的一种重要手段。本篇将详细解析Java网络编程中Socket编程的关键知识点,包括TCP实现、多线程在Socket编程中的应用、UDP程序的...
JavaSocket编程与网络组建实验报告 在计算机科学与技术专业的学习过程中,网络编程和组建实验是不可或缺的一部分。本报告将详细介绍JavaSocket编程和网络组建实验的实施过程和结果。 实验一:Socket编程(E-Mail)...