网路编程


网络编程

l  网络模型

•    OSI参考模型

•    TCP/IP参考模型

l  网络通讯要素

•    IP地址

•    端口号

•    传输协议


网络通讯要素

l  IP地址:InetAddress

•    网络中设备的标识

•    不易记忆,可用主机名

•    本地回环地址:127.0.0.1  主机名:localhost  本机配置的

l  端口号

•    用于标识进程的逻辑地址,不同进程的标识

•    有效端口:0~65535,其中0~1024系统使用或保留端口。

l  传输协议

•    通讯的规则

•    常见协议:TCP,UDP

 

类InetAddress

IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。

常用方法

static InetAddress getLocalHost()           返回本地主机。

staticInetAddress getByAddress(byte[]addr)

在给定原始 IP 地址的情况下,返回 InetAddress 对象。

staticInetAddressgetByName(String host) 在给定主机名的情况下确定主机的 IP地址。

staticInetAddress[] getAllByName(Stringhost)

          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

String getHostAddress()           返回 IP 地址字符串(以文本表现形式)。

String getHostName()           获取此 IP 地址的主机名。

static InetAddress getLocalHost()           返回本地主机。


TCP和UDP

 UDP    桌面共享,视频会议

•    将数据及源和目的封装成数据包中,不需要建立连接

•    每个数据报的大小在限制在64k内

•    因无连接,是不可靠协议

•    不需要建立连接,速度快

 TCP    打电话

•    建立连接,形成传输数据的通道。

•    在连接中进行大数据量传输

•    通过三次握手完成连接,是可靠协议

•    必须建立连接,效率会稍低

Socket

l  Socket就是为网络服务提供的一种机制。

l  通信的两端都有Socket。

l  网络通信其实就是Socket间的通信。

l  数据在两个Socket间通过IO传输。

构造方法

Socket()           通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddress address, int port)

          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

常用方法

InputStream getInputStream()           返回此套接字的输入流。

OutputStream getOutputStream()           返回此套接字的输出流。

int getPort()          返回此套接字连接到的远程端口

public void shutdownOutput()         throws IOException

禁用此套接字的输出流。对于 TCP套接字,任何以前写入的数据都将被发送,并且后跟 TCP的正常连接终止序列。

InetAddress getInetAddress()     返回此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。InetAddressgetLocalAddress()           获取套接字绑定的本地地址。

void connect(SocketAddress endpoint)         将此套接字连接到服务器。

void close()           关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字。关闭此套接字也将会关闭该套接字的InputStream OutputStream 如果此套接字有一个与之关联的通道,则关闭该通道。

==============================================================================

UDP传输

只有当接收端打开的时候发送端发送数据才有意义

DatagramSocket用来发送和接收数据报包的套接字。DatagramPacket(数据报包)

l  建立发送端,接收端。

l  建立数据包。

l  调用Socket的发送接收方法。

l  关闭Socket。

发送端与接收端是两个独立的运行程序。   要先打开接收端发送端发送数据才有意义不然发送没人接

A.      发送端

l  在发送端,要在数据包对象中明确目的地IP及端口。

DatagramSocketds = new DatagramSocket();用来发送和接收数据报包的套接字。

byte[] by = “hello,udp”.getBytes();

发送端的数据报包需要封装数据发送到的IP地址,以及发送到的远程端口

DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getByName(“127.0.0.1”),10000);

ds.send(dp);通过send()方法发送数据包

ds.close();

B.      接收端

l  在接收端,要指定监听的端口。

DatagramSocketds = new DatagramSocket(10000); 用来发送和接收数据报包的套接字。需要绑定端口

byte[] by = new byte[1024];

DatagramPacket dp = newDatagramPacket(by,by.length);接收端的数据包 不同于发送端的数据包

ds.receive(dp);通过receive()接收数据到定义好的数据包

String str = newString(dp.getData(),0,dp.getLength());

System.out.println(str+"--"+dp.getAddress());

ds.close();

 

数据报包DatagramPacket的主要方法

byte[] getData()        返回数据缓冲区。     voidsetData(byte[] buf)     为此包设置数据缓冲区。

int getLength()           返回将要发送或接收到的数据的长度。

InetAddress getAddress()

          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的

int getPort()

          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

 

UDP聊天程序

l  通过键盘录入获取要发送的信息。

l  将发送和接收分别封装到两个线程中。

点击打开链接

=========================================================

TCP传输  服务端需要先打开等待接收客户端连接

Socket和ServerSocket

建立客户端和服务器端

建立连接后,通过Socket中的IO流进行数据的传输

关闭socket

同样,客户端与服务器端是两个独立的应用程序。

基本思路(客户端)

客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常

连接成功,说明客户端与服务端建立了通道,那么通过IO就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。  

   上传文件的时候需要告诉服务端关闭输出流s.shutdownOutput();能够让服务端的读取方法获取-1null结束while循环

与服务端通讯结束后,关闭Socket。

基本思路(服务端)

服务端需要明确它要处理的数据是从哪个端口进入的。绑定端口

当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。

accept()是阻塞式方法 服务端需要一直开启则需要while(true)循环 accept()等待客户端连接接收客户端对象

当该客户端访问结束,关闭该客户端。

建立服务端需要监听一个端口

ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();//会给输出流一个结束标记
ss.close();


接收 字符数据的时候 建议 使用 字符缓冲流 BufferedReader

BufferedReader bfrin =

            newBufferedReader(new InputStreamReader(s.getInputStream()));

转换流的readLine()方法需要读取到换行符号才结束行的读取否则一直阻塞在读取数据阶段程序无法往下执行

 

多客户访问服务端 问题 服务端采用多线程技术

服务端

这个服务端 有个局限性。当A客户端连接上以后。被服务器获取到,服务端执行具体流程

这时B客户端连接,只有等待

因为服务端还没有处理完A客户端的请求,还没有循环回来执行下一次accept方法。

所以获取不到B客户端对象

那么为了可以让多个客户端同时访问服务端

那么服务端最好就是将每个客户端都封装到一个单独的线程中,这样,就可以同时处理多个客户端请求

如何定义线程呢??

只要明确了每一个客户端要在服务端执行的代码即可,将该代码存入run方法中

练习:

同时上传任意文件  点击查看代码

要点,上传的文件名(类型名传送,文件名重名) 数据上传服务端开启多线程并保持等待连接状态

上传文件 需要注意:客户端读取文件完了 需要关闭Socket输出流s.shutdownOutput();//告诉服务端 文件读取完毕 让服务端的的读取方法readLine返回 null,read()返回-1结束循环while((len=in.read(buf))!=-1)

*****************************************************************************************************

类URL

代表一个统一资源定位符,它是指向互联网“资源”的指针。

资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

 String getFile()           获取此 URL 的文件名。 (文件名包含路径)

 String getHost()           获取此 URL 的主机名(如果适用)。  

 String getPath()           获取此 URL 的路径部分。

 int getPort()           获取此 URL 的端口号。

 String getProtocol()           获取此 URL 的协议名称。

 String getQuery()           获取此 URL 的查询部分。

 InputStream openStream()           打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

                 此方法是左边方法的缩写:      openConnection().getInputStream()

<span style="white-space:pre">		</span>URL url = new URL("http://127.0.0.1:8080/myweb/myweb.html");
		System.out.println("getHost() "+url.getHost());
		System.out.println("getPath() "+url.getPath());
		System.out.println("getPort() "+url.getPort());
		System.out.println("getProtocol()协议名称 "+url.getProtocol());
		System.out.println("getQuery() "+url.getQuery());
		System.out.println("getFile() "+url.getFile());

 URLConnection openConnection()   返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。

//通过应用层连接到服务器内部以http协议封装了Socket

 

抽象类 URLConnection  extends Object

此类的实例可用于读取和写入此 URL 引用的资源

构造方法

protected  URLConnection(URL url)

          构造一个到指定 URL 的 URL 连接。

 

常用方法

 OutputStream getOutputStream()

          返回写入到此连接的输出流。

 InputStream getInputStream()

          返回从此打开的连接读取的输入流。

URLConnection ucc = url.openConnection();
		System.out.println(ucc);
		InputStream in = ucc.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

域名解析DNS服务器  解析域名专用

域名解析 会先查找计算机上的C:\Windows\System32\drivers\etc\host文件 不能解析 则去DNS 服务器上解析获取到IP后通过IP 访问网络资源

屏蔽网站 可以在计算机上的服务器解析文件上 将 某网站 解析成 本地的IP地址

软件更新 需要到其网址上获取跟新信息 只要把那网址的 IP在本地 设置成本地IP即可解除跟新

C:\Windows\System32\drivers\etc\host


UDP和TCP的区别特点:

UDP的特点:1)面向无连接:将数据及源和目的封装成数据包中,不需要建立连接。
        2)封包 :每个数据包的大小限制在64K内。
     3)不可靠:因为无连接,所以是不可靠协议。
     4)速度快:不需要建立连接,速度快。
 所以说UDP协议是 不需要验证,服务端直接发包,包的到达客户端的顺序也不一定是按照发包时候的顺序一样,
       相对容易丢包 
 
TCP的特点:1)面向连接:建立连接,形成传输数据的通道。
      2)大数据量传输:在连接中进行大数据量传输。
      3)可靠:通过三次握手完成连接,是可靠协议。
      4)效率低:因为必须建立连接,所以效率会降低。
 所以说TCP协议是  需要验证,有三次握手,服务端发包的时候有优化,小包会等到一起发,
       相对较安全不容易丢包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值