JAVA学习笔记之(Socket)

Java中的网络支持,提供的网络功能的四大类:
1 InetAddress: 用于标识网络上的硬件资源。
2 URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据。
3 Sockets:使用TCP协议实现网络通信的Socket相关的类。
4 Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信。

InetAddress类

1.InetAddress类没有构造方法,所以不能直接new出一个对象;
可以通过InetAddress类的静态方法获得InetAddress的对象;
InetAddress.getLocalHost();
InetAddress.getByName("");
2.类主要方法:
String - address.getHostName();
String - address.getHostAddress();
public static InetAddress getByName(String host) throws UnknownHostException
在给定主机名的情况下确定主机的 IP 地址。
主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式

URL类

url:统一资源定位符:表示internet上的网络资源  协议+资源名称
url常用方法:
存在java.net包中,提供创建url/子url,获取url等方法<br>
第一步:创建实例<br>
URL imooc=new URL("http://www.?");
//在原有url下再创建url
URL url=new URL(imooc,"/index.html?username=tom#test")<
//获取url的信息
url.getProtocol();//获取协议http
url.getHost();//获取主机www.imooc.com
url.getPort();//获取端口号:-1
url.getPath();//获取文件路径/index.html
url.getFile();//获取文件名/index.html?username=tom
url.getRef();//获取相对路径test
url.getQuery();//查询字符串username=tom
注:创建url时没有指定端口号则getPort方法返回-1,协议不同会使用默认端口

2url读取网页内容:
URL url=new URL("http://www.baidu.com");<
//获取输入流通过openStream方法
InputStream is=url.openStream();
//转化成字符输入流
InputStream isr=new InputStreamReader(is);
//加缓冲提高读取效率
BufferedReader br=new BufferedReader();
String date=br.teadline();
while(date.next()){System.out.print(date);
date=br.readLine();
}
完成后要关闭资源相关资源:br,isr字符输入流,is字节输入流
注:如果输出是乱码则要在is字节输入流中规定编码为
InputStream isr=new InputStreamReader(is,"utf8");

使用TCP协议实现网络通信(Socket通信模型):
1、在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接。
2、当客户端创建连接Socket并且向服务端发送请求。
3、服务器收到请求,并且接受客户端的请求信息。一旦接收到客户端的连接请求后,会创建一个链接socket,用来与客户端的socket进行通信。
通过相应的输入/输出流进行数据的交换,数据的发送接收以及数据的响应等等。
4、当客户端和服务端通信完毕后,需要分别关闭socket,结束通信。
ServerSocket常用方法:
ServerSocket(int port)——创建并绑定到特定端口的服务器套接字
accept()——侦听并接受到此套接字的连接
close()——关闭此套接字
getInetAddress()——得到ServerSocket对象绑定的IP地址。如果ServerSocket对象未绑定IP地址,返回0.0.0.0。
getLocalPort()——返回此套接字在其上侦听的端口

Socket常用方法:
Socket(InetAddress address, int port)——创建一个套接字并将其连接到指定ip地址的指定端口号
Socket(String host, int port)——创建一个套接字并将其连接到指定主机上的指定端口号
close()——关闭此套接字
getInetAddress()——返回套接字连接的地址
getInputStream()——返回此套接字的输入流
getOutputStream——返回此套接字的输出流


Socket通信实现步骤
1.创建ServerSocket和Socket
2.打开连接到Socket的输入/输出流
3.按照协议对Socket进行读/写操作
4.关闭输入输出流、关闭Socket


TCP协议是面向连接、可靠的、有序的、以字节流的方式发送数据,基于TCP协议实现网络通信的类:
客户端的Socket类
服务器端的ServerSocket类
服务器端:
1.创建ServerSocket对象,绑定监听端口
2.accept()方法监听客户端请求
3.建立连接后,通过输入流读取客户端发送信息
4.通过输出流向客户端发送响应信息
5.关闭相关资源


客户端:
1.创建Socket对象,指明需要连接的服务器的地址和端口号
2.连接建立后,通过输出流 服务器端发送请求信息
3.通过输入流获取服务器响应的信息
4.关闭相关资源
多线程服务器:
应用多线程来实现服务器与多客户端之间的通信
基本步骤:
1、服务器端创建ServerSocket,循环调用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端连接
3、服务器端接受客户端的请求,创建socket与客户端建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务器端继续等待新的连接

UDP 编程:
特点:udp协议是无连接,无状态,无序的、不可靠的。
优点:速度快。
原理:将需要发送的信息封装在数据报(Datagram),在数据报里指明Socket主机和端口号。然后发送出去。
使用的操作类: 
DatagramPacket 表示数据报包 

DataSocket 用来发送和接收数据报包的套接字服务器端实现步骤:
1、创建DatagramSocket,指定端口号
2、创建DatagramPacket
3、接收客户端发送的数据信息
4、读取数据

客户端:
1、定义发送信息
2、创建DatagramPacket:包含将要发送信息
3、创建DatagramSocket
4、发送数据
服务端具体代码:
1、创建服务器端DatagramSocket
DatagramSocket socket=DatagramSocket(8800);
2、创建数据报,用户接收客户端发送的数据
byte[] data=new byte[1024];
DatagramPacket packet=new datagramPacket(data,data.length);
3、接收客户端发送的数据
socket.receive(packet);//会处于阻塞,直到接收到数据报
4、读取数据
String info=new String(data,0,packet.getLength());
System.out.println("客户端说"+info)
Soket总结
1、多线程的优先级(死循环中注意设置优先级问题。)建议降低优先级。 
2、关闭socket流,而不提倡关闭输入输出流。
3、使用tcp通信传输对象更符合面向对象编程的思想。
4、通过socket编程传输文件的功能模块是:通过io流读取文件字符流进行传输。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值