黑马程序员——网络编程
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、网络通信三要素:IP地址,端口号,传输协议
IP地址
它是网络中的设备标识
不易记忆,可用主机名表示,两者存在映射关系
本机回环地址:127.0.0.1,主机名为:localhost。
端口号
用于表示进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口
传输协议:通讯的规则
常见协议:TCP,UDP
UDP: 面向无连接,即将数据及源和目的封装成数据包中,不建立链接的发送
每个数据包的大小限制在64K之内
因无连接,是不可靠的协议
不建立连接,速度快。
TCP: 面向连接,在建立连接后,形成传输数据的通道
在连接中进行大数据量的传输
通过三次握手完成连接,是可靠的协议
必须建立连接,效率稍慢
二、传输协议
1.Socket
它被称之为插座,相当于港口一样,是网络服务提供的一种机制。
通信两端都要有Socket,才能建立服务。
网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
2.UDP传输
DatagramSocket与DatagramPacket
建立发送端,接受端
建立数据包
调用Socket的发送接受方法
关闭Socket
发送端与接受端是两个独立程序。
发送端实例:
1、创建UDP服务
2.将数据封装成包
3、将包通过socket发送出去
4、关闭资源
public class udp {
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
//创建udp服务
DatagramSocket ds=new DatagramSocket();
//将数据封装成包
byte[] be="sdfgfdh".getBytes();
//发送
DatagramPacket dp=
new DatagramPacket(be,be.length,InetAddress.getByName(
"192.168.1.5"),2000);
ds.send(dp);
ds.close();
接受端实例:
* 1.定义udp服务
* 2.定义一个数据包,因为储存接收到的字节数据
* 因为数据包对象中有更多功能 可以提取字节数据中的不同数据信息
* 3.通过socket中的receive方法将只收到的数据存入已定义好的数据包中
* 4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
* 5.关闭资源*/
class udp1 {
public static void main(String[] args) throws Exception {
//建立udp服务
DatagramSocket ds=new DatagramSocket(2000);
//定义一个数据包
byte[] be=new byte[1024];
DatagramPacket dp=
new DatagramPacket(be,be.length);
//存入数据包
ds.receive(dp);
//通过数据包方法获取其中的数据
String s=dp.getAddress().getHostAddress();
String st=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(s+"..."+st+"...."+port);
ds.close();
}
}
}
}
3.TCP传输
Socket和ServerSocket
建立客户端和服务端
建立连接后,通过Socket中的IO流进行数据的传输
关闭Socket。
同样,客户端与服务端是两个独立的应用程序。
客户端
*通过查阅socket对象,发现在该对象建立时,就可以去连接指定的主机
*因为tcp是面向连接的,所以在建立socket服务时
*就要有服务端存在,并连接成功,形成通路后,在通道进行数据传输
*
* 步骤
* 1、创建socket服务,并指定要连接的主机和端口
* 2、*/
public class tcp {
public static void main(String[] args) throws Exception, IOException {
// TODO 自动生成的方法存根
//创建socket服务,并指定要连接的主机和端口
Socket s=new Socket("192.168.1.5",10000);
//为了发送数据,应该获取socket流中的输出流
OutputStream os=s.getOutputStream();
os.write("wolaile ".getBytes());
s.close();
}
}
服务端
*1、建立服务端的Socket服务,
*并监听一个端口
*2、获取连接过来的客户端对象
*通过ServerSocket的accept方法,没有连接就会等,所以这个方法是阻塞
*3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,获取该客户对象的读取流
*来读取发过来的数据,并打印在控制台
*4、关闭服务(可选)
* */
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
//建立服务端socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10000);
//通过accept方法获取连接过来的客户端对象
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip);
//客户端如果发过来数据,那么服务端要使用对应的客户端对象,获取该客户对象的读取流
//来读取发过来的数据
InputStream is=s.getInputStream();
byte[] buf=new byte[1024];
int len=is.read(buf);
String str=new String(buf,0,len);
System.out.println(str);
}
}