网络编程

网络编程

InetAdress

描述IP地址的类

没有构造函数

static InetAddress getLocalHost()           返回本地主机 
static InetAddress getByName(String host)   在给定主机名的情况下确定主机的 IP 地址。 
String getHostName()                        获取此 IP 地址的主机名。 
String getHostAddress()                     返回 IP 地址字符串(以文本表现形式)。

InetAddress byName = null;
try {
    byName = InetAddress.getByName("www.baidu.com");
} catch (UnknownHostException e) {
    e.printStackTrace();
}
String hostName = byName.getHostName();
String hostAddress = byName.getHostAddress();
System.out.println(hostName+"--------------"+hostAddress);

//www.baidu.com--------------180.97.33.107

static InetAddress[] getAllByName(String host)      在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 

InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : allByName) {
    System.out.println(inetAddress.getHostName()+"---------"+inetAddress.getHostAddress());
}

//www.baidu.com---------180.97.33.108
//www.baidu.com---------180.97.33.107

UDP连接

  1. 将数据极其源和目的封装为数据包,不需要建立连接
  2. 每个数据包大小限制在64K内
  3. 因为无连接,所以不可靠(会出出现数据丢失)
  4. 因为不需要建立连接,所以速度快
  5. udp协议是不分客户端与服务端的,只分发送端与接收端。

DatagramSocket

用来发送和接收数据报包的套接字。

构造方法

DatagramSocket() 
          构造数据报套接字并将其绑定到本地主机上任何可用的端口。 
protected  DatagramSocket(DatagramSocketImpl impl) 
          创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。 
DatagramSocket(int port) 
          创建数据报套接字并将其绑定到本地主机上的指定端口。 
DatagramSocket(int port, InetAddress laddr) 
          创建数据报套接字,将其绑定到指定的本地地址。 
DatagramSocket(SocketAddress bindaddr) 
          创建数据报套接字,将其绑定到指定的本地套接字地址。 

一些方法

void receive(DatagramPacket p) 
      从此套接字接收数据报包。 当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 
void send(DatagramPacket p) 
      从此套接字发送数据报包。 
void close() 
      关闭此数据报套接字。 

DatagramPacket

此类表示数据报包。

DatagramPacket(byte[] buf, int length) 
    构造 DatagramPacket,用来接收长度为 length 的数据包。 
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
    构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 
DatagramPacket(byte[] buf, int offset, int length) 
    构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。 
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
    构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 
    构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 
DatagramPacket(byte[] buf, int length, SocketAddress address) 
    构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 

UDP连接实例

public class SendDome {
    public static void main(String[] args) throws IOException {
        //创建UDP服务对象
        DatagramSocket ds = new DatagramSocket();
        
        Scanner sc = new Scanner(System.in);
        String str = null;
        do {
            //准备数据
            str = sc.next();
            //创建发送数据包
            DatagramPacket p = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("127.0.0.1"),9999);
            //发送
            ds.send(p);
            //创建接收缓存
            byte[] buf=new byte[1024];
            //创建接收数据包
            DatagramPacket packet=new DatagramPacket(buf, buf.length);
            //接收
            ds.receive(packet);
            System.out.println(new String(buf));
        }while(!"exit".equals(str));
        //释放资源
        ds.close();
    }
}

public class ReceiveDome {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(9999);
        
        Scanner sc = new Scanner(System.in);
        String str = null;
        do {
            byte[] buf=new byte[1024];
            DatagramPacket packet=new DatagramPacket(buf, buf.length);
            ds.receive(packet);
            System.out.println(new String(buf));
            
            str = sc.next();
            //根据receive接收的包得到发送方的地址和端口
            DatagramPacket p = new DatagramPacket(str.getBytes(), str.getBytes().length,packet.getAddress(),packet.getPort());
            ds.send(p);
        }while(!"exit".equals(str));
        ds.close();
    }
}

TCP

tcp的特点:

  1. tcp协议通讯是面向连接的,tcp的客户端一旦建立,马上要与服务端建立连接。

  2. tcp协议在连接中传输大数据量,tcp是基于IO流进行数据传输。

  3. 通过三次握手机制连接,可靠协议(保证数据传输的完整性)

  4. 因为tcp是面向连接的,所以效率稍低.

  5. tcp协议是分客户端与服务端

    比如:QQ文件传输、 飞Q文件传输
    tcp协议下的Socket:
    Socket(客户端类)
    ServerSocket(服务端)

Socket

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

Socket() 
      通过系统默认类型的 SocketImpl 创建未连接套接字 
Socket(InetAddress address, int port) 
      创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 
Socket(String host, int port) 
      创建一个流套接字并将其连接到指定主机上的指定端口号。
void close() 
      关闭此套接字。
InetAddress getInetAddress() 
      返回套接字连接的地址。 
InputStream getInputStream() 
      返回此套接字的输入流。 
OutputStream getOutputStream() 
      返回此套接字的输出流。 

ServerSocket

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

ServerSocket(int port) 
      创建绑定到特定端口的服务器套接字。
Socket accept() 
      侦听并接受到此套接字的连接。 

多线程下载

/**
 * 服务端
 * @author leex
 *
 */
public class MyService {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket accept = null;
        while(true) {
            try {
                //获取服务端套接字
                ss = new ServerSocket(10112);
                //三次握手
                accept = ss.accept();
                //开启一条下载线程,将客户端信息传入
                new Thread(new getFile(accept)).start();;
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    //释放资源
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }   
        }
    }
}

/**
 * 多线程下载类
 * @author leex
 *
 */
public class getFile implements Runnable{
    Socket accept;
    
    /**
     * 构造接收客户端信息
     * @param accept
     */
    public getFile(Socket accept) {
        this.accept = accept;
    }
    
    @Override
    public void run() {
        //声明
        OutputStream out = null;
        FileInputStream in = null;
        try {
            //获取TCP输出流
            out = accept.getOutputStream();
            //创建文件输入流
            in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JDK_API_1.6_zh_中文.CHM");
            //循环读入写出
            System.out.println(Thread.currentThread().getName()+"下载开始");
            byte[] b = new byte[1024];
            int len = 0;
            while((len = in.read(b)) != -1) {
                out.write(b,0,len);
            }
            //打印线程名
            System.out.println(Thread.currentThread().getName()+"下载结束");
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //释放资源
                in.close();
                out.flush();
                out.close();
                accept.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

/**
 * 客户端    模拟下载
 * @author leex
 *
 */
public class MyCliect {
    
    /**
     * 循环十次模拟多线程
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            getFile();
        }
    }

    private static void getFile() {
        FileOutputStream out = null;
        Socket s = null;
        FileInputStream in = null;
        try {
            //文件输出流。随机名字
            out = new FileOutputStream(UUID.randomUUID().toString()+".CHM");
            //获取套接字
            s = new Socket("127.0.0.2", 10112);
            //TCP输入流
            in = (FileInputStream) s.getInputStream();
            //循环下载,写出
            byte[] b = new byte[1024];
            int len = 0;
            while((len = in.read(b)) != -1) {
                out.write(b,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //释放资源
                out.flush();
                out.close();
                in.close();
                s.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • iOS网络HTTP、TCP、UDP、Socket 知识总结OSI 七层模型我们一般使用的网络数据传输由下而上共有七...
    蜗牛也有梦想阅读 2,406评论 0 3
  • 1. 网络编程概述 1.1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接...
    JackChen1024阅读 1,037评论 0 3
  • 最近在看《UNIX网络编程 卷1》和《FREEBSD操作系统设计与实现》这两本书,我重点关注了TCP协议相关的内容...
    腩啵兔子阅读 1,169评论 0 7
  • 作者:苏宁易购饶平直营店 余晓明 最近您家的创维电视是否出现了无法进入系统主页,画面显示无信号的情况呢?什么...
    慢悠悠的明爷爷阅读 45,412评论 0 0
  • 来福对自己的工作很满意,正式工们都说这活又脏又累不是人干的,来福却觉得是小菜一碟。一天十块钱,一月就是三百块...
    春鸣阅读 1,293评论 6 8