设为首页 加入收藏

TOP

Socket网络编程中的1448问题(一)
2014-11-24 02:50:53 来源: 作者: 【 】 浏览:3
Tags:Socket 网络编程 1448 问题

关于Socket网络编程中的1448问题,下面写一个客户端一个服务端来说明一下。


推荐阅读:


这是服务端MyServer.java


package com.jadyer.server;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;


/**
* Socket网络编程中的1448问题
* @see ---------------------------------------------------------------------------------------------------------
* @see java.io.InputStream.available()
* @see 该方法返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
* @see 它没有保证返回的是绝对的字节数,并且有的InputStream实现返回的就不是流中的字节总数,所以不能用它来new byte[count]
* @see 另外要注意的是,用这个方法从本地文件读取数据时,一般不会遇到问题,但在用于网络操作时,就很有可能会发生非预期的结果
* @see 比如说对方发来了1000个字节,但available()却只得到了600,或者200个,甚至0个
* @see 这是因为网络通讯是间断性的,一串字节往往会分几批进行发送,所以available()得到的只是估计字节数
* @see ---------------------------------------------------------------------------------------------------------
* @see java.io.InputStream.read(byte[] b, int off, int len)
* @see 它并不是一定会读取len个字节,它只保证最少读一个字节,最多读len个字节,可参考下方第81行代码的写法读取指定个数的字节
* @see ---------------------------------------------------------------------------------------------------------
* @see 1448问题
* @see 用Socket开发"网络应用"时,有时会遇到这种情况,byte[]中收到的字节中前1448个是有值的,从1449开始竟然都是0x00
* @see 这是因为InputStream().read()每次最多只能获得1448个字节的数据,所以就要考虑多次接收数据(详见下方第90行代码)
* @see ---------------------------------------------------------------------------------------------------------
* @create Jul 27, 2013 12:16:35 PM
* @author 玄玉<http://blog.csdn.net/jadyer>
*/
public class MyServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
//ServerSocket的默认参数空的构造方法用途是,允许服务器在绑定到特定端口之前,先设置一些ServerSocket选项
//否则一旦服务器与特定端口绑定,有些选项就不能在改变了,比如SO_REUSEADDR选项
try {
serverSocket = new ServerSocket();
//设定允许端口重用,无论Socket还是ServetSocket都要在绑定端口之前设定此属性,否则端口绑定后再设置此属性是徒劳的
serverSocket.setReuseAddress(true);
//服务器绑定端口
serverSocket.bind(new InetSocketAddress(8060));
//从连接请求队列中(backlog)取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回
//如果队列中没有连接请求,accept()就会一直等待,直到接收到了连接请求才返回
//Socket socket = serverSocket.accept();
} catch (Exception e) {
System.out.println("服务器启动失败,堆栈轨迹如下");
e.printStackTrace();
//isBound()---判断是否已与一个端口绑定,只要ServerSocket已经与一个端口绑定,即使它已被关闭,isBound()也会返回true
//isClosed()--判断ServerSocket是否关闭,只有执行了close()方法,isClosed()才返回true
//isClosed()--否则即使ServerSocket还没有和特定端口绑定,isClosed()也会返回false
//下面的判断就是要确定一个有引用的,已经与特定端口绑定,并且还没有被关闭的ServerSocket
if(null!=serverSocket && serverSocket.isBound() && !serverSocket.isClosed()){
try {
//serverSocket.close()可以使服务器释放占用的端口,并断开与所有客户机的连接
//当服务器程序运行结束时,即使没有执行serverSocket.close()方法,操作系统也会释放此服务器占用的端口
//因此服务器程序并不一定要在结束前执行serverSocket.close()方法
//但某些情景下若希望及时释放服务器端口,以便其它程序能够占用该端口,则可显式调用serverSocket.close()
serverSocket.close();
System.out.println("服务器已关闭");
} catch (IOException ioe) {
//ignore the exception
}
}
}
System.out.println("服务器启动成功,开始监听" + serverSocket.getLocalSocketAddress());
//服务器开始监听
run(serverSocket);
}

private static void run(ServerSocket serverSocket){
while(true){
Socket socket = null;
try {
socket = serverSocket.accept();
System.out.println("New connection accepted " + socket.getRemoteSocketAddress());
Inpu

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇运用Spring注解实现Netty服务器端.. 下一篇关于C++中的#define

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: