什么是Socket?
“一切皆Socket“
话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。
网络地址分类(32位网络地址)
A类地址:第一个字节为网络地址,其他3个字节主机地址,第一字节的最高位固定为0
从1.0.0.1------126.255.255.255
B类地址:第一字节和第二字节为网络地址,其他2个字节为主机地址,第一字节前两位固定为10
从128.0.0.1---191.255.255.255
C类地址:前三个字节为网络地址,最后一个字节是主机地址,第一字节的前三位固定为110
从192.0.0.1----223.255.255.255
D类地址:组播地址
不分网络地址和主机地址,第一字节的前四位固定为1110
224.0.0.1-----239.255.255.255
注意几点:
1、192.168.1.255为广播地址,任何主机都是不能使用的。
2、每一个网络地址都能组成一个小型的局域网。
3、127.0.0.1测试tcp,udp网络时使用的内部回环网络
在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:
(1) DatagramSocket
DatagramSocket类实现“网络连接”,包括客户端网络连接和服务器端网络连接。实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。
该类既可以用于实现客户端连接,也可以用于实现服务器端连接。
(2) DatagramPacket
DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,
都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。
DatagramPacket类的作用类似于现实中的信件。
UDP客户端有三个步骤:建立连接、发送数据\接收数据和关闭连接。
基于UDP协议的Socket编程步骤
利用DatagramPacket对象封装数据包
利用DatagramSocket发送数据包
利用DatagramScoket接受数据包
利用DatagramPacket处理数据包
TCP客户端
package cn.TCP;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.OutputStream;
7 import java.net.ServerSocket;
8 import java.net.Socket;
9
10 public class TCP_Clicent {
11 public static void main(String[] args) throws Exception {
12 //1.创建对象
13 ServerSocket sk=new ServerSocket(1122111);
14 //2.监听
15 Socket s=sk.accept();
16 //打包数据
17 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
18 BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
19 OutputStream os=s.getOutputStream();
20 String line=null;
21 while((line=br.readLine())!=null){
22 System.out.println("Client \t"+line);
23 os.write(bw.readLine().getBytes());
24 }
25 //释放资源
26 s.close();
27 //sk.close();
28 }
29 }
TCP服务端
import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStreamWriter; 7 import java.net.Socket; 8 import java.net.UnknownHostException; 9 10 public class TCP_Service { 11 public static void main(String[] args) throws Exception { 12 Socket sk=new Socket("192.168.60.127",1122111); 13 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 14 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); 15 String line=null; 16 while((line=br.readLine())!=null){ 17 bw.write(line); 18 bw.newLine(); 19 bw.flush(); 20 21 InputStream is=sk.getInputStream(); 22 byte [] by=new byte[1024]; 23 int num=is.read(by); 24 String h=new String(by, 0, num); 25 System.out.println("Service:\t"+h); 26 } 27 //br.close(); 28 //bw.close(); 29 sk.close(); 30 31 32 } 33 }
UDP:
客户端:
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 import java.net.DatagramPacket; 4 import java.net.DatagramSocket; 5 import java.net.InetAddress; 6 import java.net.SocketException; 7 8 public class UDP_Clicent { 9 public static void main(String[] args) throws Exception { 10 DatagramSocket l=new DatagramSocket(); 11 DatagramSocket ds=new DatagramSocket(); 12 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 13 String line=null; 14 byte [] bys=line.getBytes(); 15 int num=bys.length; 16 InetAddress address=InetAddress.getByName("192.168.60.127"); 17 int port=101236; 18 DatagramPacket dp=new DatagramPacket(bys,num, address,port); 19 ds.send(dp); 20 ds.close(); 21 } 22 }
服务器:
1 import java.net.DatagramPacket; 2 import java.net.DatagramSocket; 3 import java.net.InetAddress; 4 import java.net.SocketException; 5 6 public class UDP_Service { 7 8 public static void main(String[] args) throws Exception { 9 DatagramSocket ds=new DatagramSocket(101236); 10 byte[] bys = new byte[1024]; 11 int len = bys.length; 12 DatagramPacket dp = new DatagramPacket(bys, len); 13 ds.receive(dp); 14 byte[] by = dp.getData(); 15 int length = dp.getLength(); 16 InetAddress address = dp.getAddress(); 17 String ip = address.getHostAddress(); 18 String s = new String(by, 0, length); 19 System.out.println(ip + "---" + s); 20 ds.close(); 21 22 } 23 24 }