基本套接字:输入输出流

JavaTCP套接字的基本输入输出形式是流(stream)抽象。(Java1.4加入的NIONew I/O)工具提供了另一种替代的抽象形式,我们将在第5章介绍。)流只是一个简单有序的字节序列。Java的输入流(input streams)支持读取字节,而输出流(outputstreams)则支持写出字节。在我们的TCP服务器和客户端中,每个Socket实例都维护了一InputStream实例和一个OutputStream实例。当我们向Socket的输出流写了数据后,这些字节最终将能从连接另一端的Socket的输入流中读取。

 

OutputStream类是Java中所有输出流的抽象父类。通过OutputStream我们可以向输出流写字节、刷新缓存区和关闭输出流。

 

OutputStream:操作

abstract void write(int data)

void write(byte[ ] data)

void write(byte[ ] data, int offset, int length)

void flush()

void close()

 

这些write()方法分别向输出流传输一个字节、整个字节数组,或从一个数组中offset指定偏移量开始,输出长度为length的字节。输出一个字节的write()方法只将其整型参数的8位输出。如果在一个TCP套接字关联的输出流上进行这些操作,当大量的数据已发送,而连接的另一端所关联的输入流最近没有调用read()方法时,这些方法可能会阻塞。如果不作特殊处理,这可能会产生一些不想得到的后果。(见6.2节)

 

flush()方法用来将缓存中的所有数据推送到输出流。close()方法用来关闭流,流关闭之后,再调用write()方法时将抛出异常。

 

InputStream类是所有输入流的抽象父类。可以使用InputStream从输入流中读取字节或关闭输入流。

 

InputStream:操作

abstract int read()

int read(byte[ ] data)

int read(byte[ ] data, int offset, int length)

int available()

void close()

 

前三个方法的作用是从流中获取传输的数据。第一种形式的read方法将读取的一个字节放入一个整型变量的低8位中,并将该变量返回;第二种形式的read方法从输入流中获取长度为data.length的字节序列,并将其存入data数组中,该方法的返回值是实际传输的字节数;第三种形式与第二种的功能相似,但在把数据存入data数组时,将从offset所指定的偏移量开始存放,而且最多只传输长度为length的字节序列。当没有数据可读,而又没有检测到流结束标记时,所有的read()方法都将阻塞等待,直到至少有一个字节可读。在没有数据可读,同时又检测到流结束标记时,以上所有方法都将返回-1

 

available()方法的作用是返回当前可读字节的总数。close()方法将关闭输入流,此后所有对流的读取操作都将抛出一个IOException异常。

相关下载:

Java_TCPIP_Socket编程(doc)

http://download.csdn.net/detail/undoner/4940239

 

文献来源:

UNDONER(小杰博客) :http://blog.csdn.net/undoner

LSOFT.CN(琅软中国) :http://www.lsoft.cn

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字IP网络广播系统方案 背景音乐 远程广播 网络会议 网络通信 第一部分:系统方案介绍 1. 产品简介: IPAudio 技术介绍: 数字音频的桥梁,IPAudio将模拟音频信号数字编码,通过网络传输后,再由终端解 码成音频信号。可多路、双向传输,局域网内延迟时间仅为数十毫秒,幷具有自动流量 调整、声音修补功能。符合标准IP协议(IP属于TCP/IP中的协议,有统一的数据包格式, 以消除各通信子网的差异),经过路由器也能实现音频传输, 是世界上先进的网络音频传输技术之一。IPAudio 可实现与其他以太网络的无缝兼容, 并创造性的将广播的传播范围通过网络扩大到了世界的每一个角落。 系统介绍: IP网络广播系统采用IP Audio音频处理技术, 将音频信号以标准IP包形式在局域网和广域网上进行传送,是一套纯数字传输的双向音 频扩声系统。彻底解决了传统广播系统存在的音质不佳,维护管理复杂,缺乏互动性等 问题。该系统设备使用简单,安装扩展方便,只需将音频终端接入计算机网络即可构成 功能强大的数字化广播系统,每个接入点无需单独布线,真正实现计算机网络、数字视 频监控、公共广播的多网合一。 IP网络广播系统是完全不同于传统广播系统、调频寻址广播系统和数控广播系统的产 品。因建立在通用网络平台上,并融入自有知识产权的数字音频技术,多方面体现了显 著的优越性: 稳定性方面:针对服务器的WINDOWS系统稳定性差,易受病毒和黑客的侵害等问题,业 界首创由计算机和嵌入式IP网络主控机组成双主控系统,两者可同时协调管理,也可以 独立运行,如一方故障,另一方可接管所有终端,嵌入式IP网络主控机可屏蔽目前已知 的所有电脑病毒的入侵,传送数据不受网络上病毒的干扰,完全消除病毒、黑客所可能 给广播系统所带来的影响。 功能方面:可独立控制每个终端播放不同的内容(如:局域网内300个终端同时播放 300路节目)。不仅能够完全实现传统广播系统的功能(如:定时打铃、分区播放、消防 报警等),而且还具备终端自由点播、终端间双向对讲等功能; 传输方面:音频传输距离无限延伸,可运行在跨网关的局域网和Internet网上,支持 大范围的重要型应用,从主校区到分校区集中控制广播,从公司总部到各个地区分部的 同声广播,实现快速、可靠的信息沟通; 音质方面:终端输出音质接近CD级(44.1K, 16bit), 满足对声音质量要求较高的场合,如高考、大学四六级考试听力播放,及教室里的日常 外语听力训练,每个发音都可以清晰可辨,不再为含混不清的声音所困扰; 产品应用范围: 学校 高速公路 宾馆大厦 商业连锁店 大中型企业 2、功能介绍 涵盖传统广播系统所有功能 包括自动打铃、音乐播放、领导讲话、播送通知和转播电台节目等 系统基于IP网络,遵循TCP/IP协议 一线多用,充分利用网络资源,避免重复架设线路,有以太网接口的地方就可以接数 字广播终端,真正实现广播、计算机网络的多网合一。 任意选择寻呼 通过IP网络寻呼话筒或网上的任意一台计算机,能指定全部、局部或单个终端,实现 广播寻呼。工作站软件还支持跨越Internet的远程寻呼。 自由点播 操作人员通过遥控器控制每台数字广播终端,完成对音频服务器中广播节目的任意点 播。操作简单方便。 实时采播 将外接音频(卡座、CD、收音机、话筒等)接入音频服务器实时压缩成高音质数据流 ,并通过网络发送广播数据,安装在不同位置的数字广播终端可实时接收并通过自带音 箱进行播放。 双向对讲 寻呼话筒与终端之间,终端与终端之间可以实现双向对讲功能。用于日常联络和应急 通讯。(注:部分型号终端支持对讲,客户可根据需要自由选择) 定时播音 数字广播终端具有独立IP地址,可以单独接收服务器的个性化定时播放节目。广播管 理员可将需要使用的节目资源存储在服务器硬盘上,并使用专门软件编制播放计划,系 统将按任务计划实现全自动播出。 多路分区播音 系统可设定任意多个组播放制定的音频节目,或对任意指定的区域进行广播讲话;服 务软件可远程控制每台终端的播放内容(划定区域播放)和音量等。 音频扩音 数字广播终端提供音频输入功能。在没有广播信号的时候,其他模拟节目源的音频输 出可接入语音终端,经扩音播出。终端可以根据语音信号的有无,自动切换功放音箱的 电源。 紧急消防广播 系统可接入消防报警信号,实现消防联动,并支持邻层报警。终端带强切功能,可控 制三线制音控器。 音频素材制作 实现数字素材的录制、转换和剪辑。系统服务器可存储数千小时以上的音乐节目。 其他辅助功能 节目监听,可设任意终端作为监听器,监听其他终端的节目广播内容。 3、传统广播系统存在的问题 技术落后,兼容性、扩展性不佳 现有公共广播系统基本都是采用模拟传输,人工管理的工作方式,系统易受环境干扰 ,多路广播
个 HTTP 响应消息,包括状态行,消息报头和响应正文; 6.将响应消息通过连接套接字发送回客户端(浏览器)。 下面是一个简单的Java代码实现Web服务器的基本框架: ```java import java.io.*; import java.net.*; public class SimpleWebServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8080); //创建ServerSocket,监听8080端口 System.out.println("Web server running on port 8080"); while (true) { Socket clientSocket = serverSocket.accept(); //等待客户端连接 System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //获取输入流 String request = in.readLine(); //读取HTTP请求 String[] tokens = request.split("\\s+"); //将请求按空格分割 String method = tokens[0]; //获取请求方法 String path = tokens[1]; //获取请求路径 if (method.equals("GET")) { //只处理GET请求 File file = new File("." + path); //获取请求的文件 if (file.exists()) { //如果文件存在 OutputStream out = new BufferedOutputStream(clientSocket.getOutputStream()); //获取输出流 String contentType = guessContentType(path); //猜测内容类型 byte[] data = readFile(file); //读取文件内容 sendHeader(out, "HTTP/1.1 200 OK", contentType, data.length); //发送响应头 out.write(data); //发送响应正文 out.flush(); } else { //如果文件不存在 OutputStream out = clientSocket.getOutputStream(); String errorMessage = "404 Not Found"; out.write(("HTTP/1.1 " + errorMessage + "\r\n").getBytes()); out.write(("Content-Type: text/plain\r\n").getBytes()); out.write(("Content-Length: " + errorMessage.length() + "\r\n").getBytes()); out.write(("\r\n").getBytes()); out.write(errorMessage.getBytes()); out.flush(); } } clientSocket.close(); //关闭连接 } } private static String guessContentType(String path) { //猜测内容类型 if (path.endsWith(".html") || path.endsWith(".htm")) { return "text/html"; } else if (path.endsWith(".gif")) { return "image/gif"; } else if (path.endsWith(".jpg") || path.endsWith(".jpeg")) { return "image/jpeg"; } else if (path.endsWith(".png")) { return "image/png"; } else { return "application/octet-stream"; } } private static byte[] readFile(File file) throws IOException { //读取文件内容 InputStream in = new BufferedInputStream(new FileInputStream(file)); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int n; while ((n = in.read(buffer)) != -1) { out.write(buffer, 0, n); } in.close(); return out.toByteArray(); } private static void sendHeader(OutputStream out, String statusLine, String contentType, int contentLength) throws IOException { //发送响应头 out.write((statusLine + "\r\n").getBytes()); out.write(("Content-Type: " + contentType + "\r\n").getBytes()); out.write(("Content-Length: " + contentLength + "\r\n").getBytes()); out.write(("\r\n").getBytes()); } } ``` 在浏览器中打开 http://localhost:8080/,即可访问服务器。这里的服务器只能处理静态文件,如果需要处理动态内容,需要使用其他框架或技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值