Java零基础教程(十一.网络编程)
2021-08-22 1169 words
6 minutes
views
1. 网络编程概述
2. 网络通信要素概述
3. 通信要素1:IP和端口号
4. 通信要素2:网络协议
5. TCP网络编程
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.atguigu.java1 ;
import org.junit.Test ;
import java.io.ByteArrayOutputStream ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.OutputStream ;
import java.net.InetAddress ;
import java.net.ServerSocket ;
import java.net.Socket ;
/*
实现TCP的网络编程
例子1:客户端
*/
public class TCPTest1 {
// 客户端
@Test
public void client () {
Socket socket = null ;
OutputStream os = null ;
try {
// 1. 创建Socket对象,指明服务器端的ip和端口号
InetAddress inet = InetAddress . getByName ( "192.168.1.66" ); //127.0.0.1或局域网ip
socket = new Socket ( inet , 8899 );
// 2. 获取一个输出流,用于输出数据
os = socket . getOutputStream ();
// 3. 写出数据的操作
os . write ( "你好,我是客户端mm" . getBytes ());
} catch ( IOException e ) {
e . printStackTrace ();
} finally {
// 4. 资源的关闭
if ( os != null ) {
try {
os . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( socket != null ) {
try {
socket . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
}
}
// 服务端
@Test
public void server () {
ServerSocket ss = null ;
Socket socket = null ;
InputStream is = null ;
ByteArrayOutputStream baos = null ;
try {
// 1. 创建服务器端的ServerSocket,指明自己的端口号
ss = new ServerSocket ( 8899 );
// 2. 调用accept()表示接收来自于客户端的socket
socket = ss . accept ();
// 3. 获取输入流
is = socket . getInputStream ();
// 4. 读取输入流中的数据
baos = new ByteArrayOutputStream ();
byte [] buffer = new byte [ 5 ];
int len ;
while (( len = is . read ( buffer )) != - 1 ) {
baos . write ( buffer , 0 , len );
}
System . out . println ( baos . toString ());
System . out . println ( "收到了来自于:" + socket . getInetAddress () + "的数据" );
} catch ( IOException e ) {
e . printStackTrace ();
} finally {
if ( baos != null ) {
// 5. 关闭资源
try {
baos . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( is != null ) {
try {
is . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( socket != null ) {
try {
socket . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( ss != null ) {
try {
ss . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
}
}
}
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
package com.atguigu.java1 ;
import org.junit.Test ;
import java.io.* ;
import java.net.InetAddress ;
import java.net.ServerSocket ;
import java.net.Socket ;
import java.net.UnknownHostException ;
/*
例题2:客户端发送文件给服务端,服务端将文件保存在本地
*/
public class TCPTest2 {
/*
这里涉及的异常还是需要try-catch,这里throws偷懒
*/
@Test
public void client () throws IOException {
Socket socket = new Socket ( InetAddress . getByName ( "127.0.0.1" ), 9090 );
OutputStream os = socket . getOutputStream ();
FileInputStream fis = new FileInputStream ( new File ( "disney.jpeg" ));
byte [] buffer = new byte [ 1024 ];
int len ;
while (( len = fis . read ( buffer )) != - 1 ) {
os . write ( buffer , 0 , len );
}
fis . close ();
os . close ();
socket . close ();
}
@Test
public void server () throws IOException {
ServerSocket ss = new ServerSocket ( 9090 );
Socket socket = ss . accept ();
InputStream is = socket . getInputStream ();
FileOutputStream fos = new FileOutputStream ( new File ( "disney1.jpeg" ));
byte [] buffer = new byte [ 1024 ];
int len ;
while (( len = is . read ( buffer )) != - 1 ) {
fos . write ( buffer , 0 , len );
}
fos . close ();
is . close ();
socket . close ();
ss . close ();
}
}
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
60
61
62
63
64
65
66
67
68
69
70
package com.atguigu.java1 ;
import org.junit.Test ;
import java.io.* ;
import java.net.InetAddress ;
import java.net.ServerSocket ;
import java.net.Socket ;
/*
实现TCP的网络编程
*/
public class TCPTest3 {
/*
这里涉及的异常还是需要try-catch,这里throws偷懒
*/
@Test
public void client () throws IOException {
Socket socket = new Socket ( InetAddress . getByName ( "127.0.0.1" ), 9090 );
OutputStream os = socket . getOutputStream ();
FileInputStream fis = new FileInputStream ( new File ( "disney.jpeg" ));
byte [] buffer = new byte [ 1024 ];
int len ;
while (( len = fis . read ( buffer )) != - 1 ) {
os . write ( buffer , 0 , len );
}
// 关闭数据输出,告知服务器端数据传完了
socket . shutdownOutput ();
// 接受来自于服务器端的数据,并显示到控制台上
InputStream is = socket . getInputStream ();
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
byte [] buffer1 = new byte [ 20 ];
int len1 ;
while (( len1 = is . read ( buffer1 )) != - 1 ) {
baos . write ( buffer1 , 0 , len1 );
}
System . out . println ( baos . toString ());
fis . close ();
os . close ();
socket . close ();
baos . close ();
}
@Test
public void server () throws IOException {
ServerSocket ss = new ServerSocket ( 9090 );
Socket socket = ss . accept ();
InputStream is = socket . getInputStream ();
FileOutputStream fos = new FileOutputStream ( new File ( "disney2.jpeg" ));
byte [] buffer = new byte [ 1024 ];
int len ;
while (( len = is . read ( buffer )) != - 1 ) {
fos . write ( buffer , 0 , len );
}
System . out . println ( "图片传输完成" );
// 服务器端给予客户端反馈
OutputStream os = socket . getOutputStream ();
os . write ( "Disney is so beautiful!" . getBytes ());
os . close ();
fos . close ();
is . close ();
socket . close ();
ss . close ();
}
}
6. 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
package com.atguigu.java1 ;
import org.junit.Test ;
import java.io.IOException ;
import java.net.* ;
/*
UDP协议的网络编程
*/
public class UDPTest {
@Test
public void sender () throws IOException {
DatagramSocket socket = new DatagramSocket ();
String str = "this is a UDP message" ;
byte [] data = str . getBytes ();
InetAddress inet = InetAddress . getLocalHost ();
DatagramPacket packet = new DatagramPacket ( data , 0 , data . length , inet , 9090 );
socket . send ( packet );
socket . close ();
}
@Test
public void receiver () throws IOException {
DatagramSocket socket = new DatagramSocket ( 9090 );
byte [] buffer = new byte [ 100 ];
DatagramPacket packet = new DatagramPacket ( buffer , 0 , buffer . length );
socket . receive ( packet );
System . out . println ( new String ( packet . getData (), 0 , packet . getLength ()));
}
}
7. URL编程
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
package com.atguigu.java1 ;
import java.net.MalformedURLException ;
import java.net.URL ;
/*
URL网络编程
1. URL: 统一资源定位符,对应着互联网的某一资源地址
2. 格式:
http://localhost:8080/examples/disney.jpeg?username=Tom
协议 主机名 端口号 资源地址 参数列表
*/
public class URLTest {
public static void main ( String [] args ) {
URL url = null ;
try {
url = new URL ( "http://localhost:8080/examples/disney.jpeg?username=Tom" );
System . out . println ( url . getProtocol ());
System . out . println ( url . getHost ());
System . out . println ( url . getPort ());
System . out . println ( url . getPath ());
System . out . println ( url . getFile ());
System . out . println ( url . getQuery ());
} catch ( MalformedURLException e ) {
e . printStackTrace ();
}
}
}
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
package com.atguigu.java1 ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.io.InputStream ;
import java.net.HttpURLConnection ;
import java.net.MalformedURLException ;
import java.net.URL ;
public class URLTest1 {
public static void main ( String [] args ) {
HttpURLConnection urlConnection = null ;
InputStream is = null ;
FileOutputStream fos = null ;
try {
URL url = new URL ( "https://s3.amazonaws.com/cms.ipressroom.com/219/files/20149/544a6120f6091d588d000048_NVLogo_2D_H/NVLogo_2D_H_thmb.jpg" );
urlConnection = ( HttpURLConnection ) url . openConnection ();
urlConnection . connect ();
is = urlConnection . getInputStream ();
fos = new FileOutputStream ( "day10/nvidia_logo.jpg" );
byte [] buffer = new byte [ 1024 ];
int len ;
while (( len = is . read ( buffer )) != - 1 ) {
fos . write ( buffer , 0 , len );
}
} catch ( IOException e ) {
e . printStackTrace ();
} finally {
if ( fos != null ) {
//关闭资源
try {
fos . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( is != null ) {
try {
is . close ();
} catch ( IOException e ) {
e . printStackTrace ();
}
}
if ( urlConnection != null ) {
urlConnection . disconnect ();
}
}
}
}