网络编程
网络通讯三要
- IP地址(网络中设备的标识)(本地回还地址:127.0.0.1)主机和IP地址相对应。
- 端口(用于标识进程的逻辑地址,有效端口:0~65535 其0~1024系统使用或保留端口)
- 传输协议(TCP,UDP)
网络通讯基本流程
1,首先找到对方的IP地址;
2,数据发送到对方指定的应用程序上(找对对应端口)。为了标示这些应用程序,所以给这些应用程序添加了数字标识。
为了方便这些称呼着写标识,给它取了一个名字叫做“端口”。逻辑端口
3,通过通信规则。这个通讯规则称为协议。国际组织定义了通用协议(TCP/IP协议)。
InetAddress类
此类表示互联网协议 (IP) 地址。
常用方法:
static InetAddress getByName(String name);根据给定主机名返回IP地址。
static InetAddress getLocalHost();返回本地主机
String getHostName();获取IP地址主机名
String getHostAddress;获取IP地址字符串(以文本表示形式)
传输协议UDP与TCP
UDP
- 将数据即源和目的封装成数据包中,不需要建立连接
- 数据会被封包,每个包的大小限制在64K以内
- 面向无连接,是不可靠的。
- 不需要建立连接,速度快
TCP
- 建立连接,形成传输数据的通道
- 在建立连接中进行大量数据传输
- 同过三步完成连接,是可靠的协议
- 必须建立连接,效率稍低
Socket
Socket就是为网络服务提供的一种机制,用于对IP地址和端口进行描述。可以通过这些信息来实现与其他主机进行通讯。可以接收和发送数据。通讯两端都需要有Socket
DatagramSocket类
此类表示用来发送和接收数据报包的套接字。在 DatagramSocket 上总是启用 UDP 广播发送
构造方法DatagramSocket() 构造套接字,将其绑定到本地主机的任意端口上
DatagramSocket(int prot) 构造套接字,将其绑定到本地主机的指定端口上
DatagramPacket类
此类表示数据报包 通过此包把数据打包,来实现包投机服务
构造方法DatagramPacket(byte[] buf,int length,InetAddress address,int port) 构造方法数据包,用来将制定长度的数据发送到指定主机的指定端口上
"UDPSocket"传输数据的步骤:
1,建立Udpsocket服务
2,提供数据,并将数据封装到数据包中
3,通过Socket服务发送数据,将数据包发送出去;另一端通过Socket接受数据,拆包。
4,关闭资源
例如下面的代码:实实现dos版点对点聊天(UDP)
原理:找到对方IP地址,每台计算以上建立一个发送端一个接收端服务
发送端:创建发送端服务,获取键盘录入,将键盘录取的值打包同时确定对方IP地址和端口,用发送端服务,将数据包发送出去。
接收端:确定接收端的端口,用接收端服务接受数据,拆包,获取数据,打印到控制台上。
import java.net.*; import java.io.*; class IPDemo { public static void main(String[] args) throws Exception { //创建udp服务 DatagramSocket ds=new DatagramSocket(88); //准备数据,键盘录取 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=bufr.readLine())!=null) { byte[] buf=line.getBytes(); //DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.168.130"),2001); ds.send(dp); if (line.equals("over")) break; } ds.close(); bufr.close(); } } class IPDemo2 { public static void main(String[] args)throws Exception { //创建udpSocket服务 DatagramSocket ds=new DatagramSocket(2001); System.out.println(InetAddress.getLocalHost().getHostAddress()); while(true) { //定义数据包 byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); ds.receive(dp); String ip=dp.getAddress().getHostAddress(); String name=dp.getAddress().getHostName(); String data=new String(dp.getData(),0,dp.getLength()); System.out.println("name"+name+":"+ip+"\r\n"+data); if("over".equals(data)) break; //通过Socket的receieve方法将受到的数据存入包中 } //关闭资源 ds.close(); } }
TCP传输:
TCP分客户端和服务端
客户端对应的对象是Socket.服务端对应的对象的是SeverSocket.
客户端:Socket
在客户端建立Socket服务时,就可以直接连接指定主机。
因为TCP是面向连接的,只有服务端存在,才能实现数据通信。
步骤:
1,创建socket服务,并指定连接的主机和端口。创建对象可以用Socket(String host,prot)
2, 确定数据源,获取数据。
3,指定数据目的,对应的服务端,用Socket提供的方法获取输出流。s.getOutputStream();
4,读取服务端返回的数据,数据源是服务端的输入流,用s.getInputStream()获得
5,关闭资源
服务端:ServerSocket
步骤:
1,服务端的Socket服务。用到SeverSocker(int port),需要绑定端口。
2,获取连接进来的客户端对象,通过SeverSocket的accept方法获取,返回Socket
3,客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取该客户端对象的输入流来读取发过来的数据。
4,对数据进行处理
5,关闭资源(可选).
示例:
在客户端键盘录取文本数据,发送到服务端,返回大写的文本。
客户端:1,创建Socket服务,指定服务器IP地址,绑定端口,建立连接。
2,确定数据源,获取数据,键盘录取
3,确定数据目的端,为服端输出流,c.getOutputStream()
4,读取服务端返回的数据,数据源为服务端的输入流,c.getInputStream()
5,关闭资源。
1 import java.io.*; 2 import java.net.*; 3 class TransClient 4 { 5 public static void main(String[] args) throws Exception 6 { 7 //建立Tcp服务,指定服务端IP和端口 8 Socket s=new Socket("169.254.168.130",10003); 9 //指定数据源,获取键盘录取 10 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); 11 //指定目的,服务端,操作的是字符,用字符输出流 12 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 13 14 BufferedReader bufr2=new BufferedReader(new InputStreamReader(s.getInputStream())); 15 String line=null; 16 while((line=bufr.readLine())!=null) 17 { 18 bufw.write(line);//发送数据 19 20 bufw.newLine(); 21 bufw.flush(); 22 if("over".equals(line)) 23 break; 24 System.out.println("Server:---"+bufr2.readLine().toUpperCase()); 25 26 } 27 28 s.close(); 29 bufr.close(); 30 31 } 32 }
服务端:
1,创建服务端的Socket服务。用到SeverSocker(int port),需要绑定端口。
2,获取连接进来的客户端对象,通过SeverSocket的appent方法获取,返回Socket
3,客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取该客户端对象的输入流来读取发过来的数据。
4,对数据进行处理,将文本数据转换为大写。
5,关闭资源(可选).
import java.io.*; import java.net.*; class TransServer { public static void main(String[] args) throws Exception { //创建服务端Socket服务,指定端口。 ServerSocket ss=new ServerSocket(10003); //获取连接过来的客户端对象, Socket c=ss.accept(); //获取客户端发过来的数据,需要输入流 InputStream in=c.getInputStream(); BufferedReader bufr=new BufferedReader(new InputStreamReader(in)); BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(c.getOutputStream())); String line=null; while((line=bufr.readLine())!=null) { System.out.println(line); bufw.write(line.toUpperCase()); bufw.newLine(); bufw.flush(); } } }
浙公网安备 33010602011771号