黑马程序员--java基础之网络编程(Socket编程)(一)
一、网络通讯要素
1、IP地址:1) 网络中设备的标识,通过找到对方IP地址进行访问;
2) 因为IP地址不方便记忆,所以可以用主机名访问。
比如www.baidu.com,其中baidu就是主机名,www表示该主机是万维网组织的注册用户,后面的.com代表商业用途的网站
如果是.org则代表教育方面的网站,一般是免费的。
3) 在java中提供了专门的操作IP的类InetAddress,封装在java.net包中,该类无构造方法,直接调用静态方法获取对象
2、端口:数据要发送到对方指定的应用程序上,为了分辨这些应用程序,系统会用数字标识这些应用程序,这些数字就是端口;
一个程序可以对应多个端口,有效端口:0-65535,其中0-1024是系统使用或保留端口;
3、传输协议:双方之间定义的通讯规则。国际组织定义的通用协议是TCP/IP协议;
二、网络模型
1、OSI参考模型:
1)、数据封包:应用层>会话层>网络层>物理层
2)、数据拆包:与封包相反。
2、TCP/IP参考模型:应用层>网际层-->主机至网络层。
3、各层次所用的协议: 应用层:http协议和ftp协议;
传输层:TCP协议和UDP协议;
网际层:IP协议;
三、TCP和UDP协议的特点和区别
1、UDP协议特点:1) 不需要建立连接,所以不是很可靠;
2) 数据被封装成数据包进行传输,大小被限制在64K之内;
3) 优点是速度快;
4) 具体事例:qq聊天,视频会议等;UDP好比以前在邮局寄信,将信封好后就往地址送,至于收件人能否收到则不确定
2、TCP协议:1) 必须建立连接,形成传输的通道,所以安全可靠,但是效率比较低;
2) 可以进行大数据量的传输,不需要封包,所以较豪资源。
3) 具体事例:打电话,下载东西。
四、Socket编程
1、Socket意思是"插座",每个应用程序都有个类似的插座,两台机器的应用程序间互相通信必须有Socket;
2、Socket编程是为网络服务提供的一种机制,数据在俩个Socket间通过IO传输;
五、UDP传输的Socket服务建立流程
1、UDP传输用java中提供的java.net.DatagramSocket来进行数据的接收和发送;
2、传输数据时需要将己方或对方的地址和端口都要封装到数据包中,数据包比较复杂,所以要封装到一个对象中,这个对象是DatagramPacket;
3、事例需求:通过UDP方式将一段文字数据发送到自己电脑上,然后接收并输出到控制台;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//创建发送类 class UdpSend { public static void main( String [] args) throws Exception{ //创建Socket DatagramSocket ds = new DatagramSocket(); //把要发送的数据放入数组中 byte [] bt = "Udp chuanshu" .getBytes(); //将数组以及要发送的地址和端口打包到数据包中 DatagramPacket dp = new DatagramPacket(bt,bt.length,InetAddress.getByName( "192.168.0.100" ), 10000 ); //发送 ds.send(dp); ds.close(); } } //创建接收类 class UdpReceive { public static void main( String [] args) throws Exception{ //创建Socket,并传入端口号 DatagramSocket ds = new DatagramSocket( 10000 ); //创建数组,用来存放接收到的数据包 byte [] buf = new byte[ 1024 ]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //通过receive方法将接受的信息放到数据包中 ds.receive(dp); //获取信息 String ip = dp.getAddress().getHostAddress(); String info = new String (dp.getData(), 0 ,dp.getLength()); int port = dp.getPort(); System.out.println( "IP:" +ip+ " info:" +info+ " Port:" +port ); } } |
4、事例需求:用Socket将键盘录入的信息发送到自己电脑的控制台上;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class UdpSend { public static void main( String [] args) throws Exception{ DatagramSocket ds = new DatagramSocket(); BufferedReader br = new BufferedReader( new InputStreamReader(System. in )); String line = null ; while ((line=br.readLine())!= null ){ if ( "88" .equals(line)) break ; byte [] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName( "192.168.0.100" ), 11002 ); ds.send(dp); } ds.close(); } } class UdpReceive { public static void main( String [] args) throws Exception{ DatagramSocket ds = new DatagramSocket( 11002 ); while ( true ){ byte [] buf = new byte[ 1024 ]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String info = new String (dp.getData(), 0 ,dp.getLength()); int port = dp.getPort(); System.out.println( "IP:" +ip+ " info:" +info ); } } } |
5:事例需求:模拟聊天软件,用多线程控制;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
class UdpSend extends Thread { public void run() { DatagramSocket ds = null ; BufferedReader br = null ; try { ds = new DatagramSocket(); br = new BufferedReader( new InputStreamReader(System. in )); String line = null ; while ((line=br.readLine())!= null ){ if ( "88" .equals(line)) break ; byte [] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName( "192.168.0.100" ), 11002 ); ds.send(dp); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { ds.close(); } catch (Exception e) { System.out.println(e.toString()); } } } } class UdpReceive extends Thread { public void run(){ try { DatagramSocket ds = new DatagramSocket( 11002 ); while ( true ){ byte [] buf = new byte[ 1024 ]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String info = new String (dp.getData(), 0 ,dp.getLength()); int port = dp.getPort(); System.out.println( "IP:" +ip+ " info:" +info ); } } catch (Exception e1) { System.out.println(e1.toString()); } } } |