`
liyixing1
  • 浏览: 961858 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

javasocket socket java网络 BIO NIO

阅读更多
在基础网络协议上,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的资料加以确认。
分享到:
评论

相关推荐

    JavaSocket学习---NIO实现非阻塞的通信

    在Java编程语言中,Socket是网络通信的基本组件,它提供了进程间网络通信的能力。而NIO(Non-blocking Input/Output,非阻塞I/O)是Java提供的一个高性能的I/O模型,与传统的阻塞I/O相比,NIO具有更高的并发性能。本...

    Socket通信_java仿qq聊天_java_javasocket_javaqq_socket视频_

    Java Socket通信是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的双向通信。在这个"Java仿QQ聊天"项目中,我们利用TCP协议建立可靠的连接,通过Java Socket API来模拟QQ聊天的功能,包括视频聊天和...

    Java聊天室_javasocket_java聊天_聊天室_

    Java Socket是Java提供的网络通信接口,它允许两个网络应用程序之间建立全双工的数据通信。在Java聊天室中,Socket用于连接客户端和服务器,使得它们之间可以交换数据。客户端通过创建Socket对象,连接到服务器的...

    JAVA Socket 经典教程

    Java Socket是Java编程语言中实现网络通信的基础组件,它提供了应用程序与网络协议的接口,使得开发者可以构建基于TCP(传输控制协议)或UDP(用户数据报协议)的应用程序。本教程将深入探讨Java Socket编程的核心...

    java socket,javasocket教程

    Java Socket是Java编程语言中用于网络通信的核心API,它提供了低级别的、面向连接的、基于TCP/IP的通信机制。在Java Socket编程中,我们可以创建服务器端(ServerSocket)来监听客户端(Socket)的连接请求,然后...

    Java版socket编程 局域网聊天工具

    Java版的Socket编程是网络通信的核心技术之一,尤其在构建局域网聊天工具时尤为重要。本项目通过Java实现了一个功能丰富的即时通讯应用,包括全新界面风格、文字聊天、文件传输、窗口抖动以及语音聊天等功能。 1. *...

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    java socket客户端断线重连

    java socket client 断线重连的简单实现 有什么意见可以提哦

    基于java socket网络编程实现的简单模拟qq聊天的程序,可实现并发聊天

    Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个基于Java Socket实现的简单模拟QQ聊天程序中,我们主要探讨以下几个核心知识点: 1. **Socket原理**...

    Java网络编程-JavaSocket编程总结

    Java网络编程是构建分布式应用程序的关键技术,而Java Socket编程则是其核心部分,允许两台计算机通过网络进行双向通信。在Java中,Socket是基于TCP/IP协议的,提供了可靠的、面向连接的数据传输服务。 首先,理解...

    java socket USB和 串口通讯源码

    java socket USB和 串口通讯,使用java程序与硬件通讯的三种方式。

    java网络编程 socket

    通过阅读《Java网络编程文档教材》和《Java基础三步学会JavaSocket编程》,你可以更深入地了解Java Socket编程的细节和实践技巧。理论结合实践,才能真正掌握这一技术。在实际开发中,不断优化和调试,才能编写出...

    java的Socket实现的多人聊天程序

    Java的Socket实现的多人聊天程序是一个基于网络通信的项目,主要利用了Java的Socket类来构建客户端和服务端的通信桥梁。Socket是TCP/IP协议的一部分,它提供了两台计算机之间进行数据传输的基础。在这个项目中,...

    Java_TCP_IP_Socket编程(原书第2版)

    Java TCP/IP Socket编程是网络通信领域中的核心技术,尤其在Java平台中,Socket是实现客户端与服务器之间通信的基础。原书第二版深入浅出地讲解了Java Socket编程的各个方面,为开发者提供了全面的学习资源。以下是...

    Java网络课程设计-Socket聊天室项目案例源码.rar

    Java网络课程设计-Socket聊天室项目案例源码.rar Java网络课程设计-Socket聊天室项目案例源码.rar Java网络课程设计-Socket聊天室项目案例源码.rar JavaSocket聊天室 用Java图形用户界面编写聊天室服务器端和客户端...

    java Socket 好处

    下面将详细介绍Java Socket的好处以及如何进行Socket网络编程。 一、Java Socket的优点 1. **稳定可靠**:Java Socket建立在TCP协议之上,TCP是一种面向连接的、可靠的传输协议,可以确保数据的完整性和顺序性,...

    利用Socket原理Java实现双方通信

    利用Socket原理java实现双方实时通信。只要将代码中客户端的回环地址更改成通信的另一方的IP地址,再把服务器端程序在此IP地址上编译运行即可。在服务端开启后,再使本机的客户端程序运行即可实现双方通信。

    Java网络编程 Socket编程

    Java网络编程是使用Java语言编写网络应用程序的过程,而Socket编程是实现Java网络编程的一种重要手段。本篇将详细解析Java网络编程中Socket编程的关键知识点,包括TCP实现、多线程在Socket编程中的应用、UDP程序的...

    华科_计算机网络实验报告_JavaSocket编程_网络组建实验.doc

    JavaSocket编程与网络组建实验报告 在计算机科学与技术专业的学习过程中,网络编程和组建实验是不可或缺的一部分。本报告将详细介绍JavaSocket编程和网络组建实验的实施过程和结果。 实验一:Socket编程(E-Mail)...

Global site tag (gtag.js) - Google Analytics