Java网络编程
1、计算机网络
①定义—计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统(来源百度百科)
②网络编程的目的—数据交换和通信
③达到该目的需要什么
1.如何准确的定位网络上的一台主机,定位到计算机上的某个资源
2.找到了这个主机,如何传输数据呢
2、网络通信的两个要素
如何实现通信?
①通信双方地址:ip+端口号
②规则:网络通信的协议

3、IP
①对IP进行操作的常用类是InetAddress
②IP地址作用是唯一定位一台网络上的计算机
127.0.0.1:本机localhost
IP地址分类:ipv4/ipv6、公网(互联网)/私网(局域网)
③域名:记忆IP问题
4、端口
①端口—表示计算机上的一个程序的进程
不同的进程有不同的端口号,用来区分软件
规定0-65535
单个协议下,端口号不能冲突
②端口分类
1.公有端口0-1023
HTTP:80;HTTPS:443;FTP:21;Telent:23
2.程序注册端口1024-49151
Tomcat:8080;MySQL:3306;Oracle:1521
3.动态、私有49152-65535
5、通信协议
①网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言。
②常见的网络通信协议是TCP/IP协议簇
TCP:用户传输协议
UDP:用户数据报协议
③TCP和UDP对比
TCP:打电话
连接、稳定
三次握手、四次挥手
客户端、服务端
传输完成、释放连接、效率低
UDP:发短信
不连接、不稳定
客户端、服务端:没有明确的界限
不管有没有准备好, 都可以发送
6、TCP
①客户端
1.连接服务器Socket
2.发送消息
1 public class TcpClientDemo1 {
2 public static void main(String[] args) throws IOException {
3 Socket socket=null;
4 OutputStream os=null;
5 try {
6 //1.知道服务器的地址和端口号
7 InetAddress serverIp=InetAddress.getByName("127.0.0.1");
8 int port=9999;
9 //2.建立socket连接
10 socket=new Socket(serverIp,port);
11 //3.发送消息 IO流
12 os=socket.getOutputStream();
13 os.write("你好,欢迎你的到来".getBytes(StandardCharsets.UTF_8));
14 } catch (UnknownHostException e) {
15 e.printStackTrace();
16 } catch (IOException e) {
17 e.printStackTrace();
18 }finally {
19 os.close();
20 socket.close();
21 }
22 }
23 }
②服务器
1.建立服务的端口ServerSocket
2.等待用户的连接accept
3.接收用户的消息
1 public class TcpServerDemo1 {
2 public static void main(String[] args) throws IOException {
3 ServerSocket serverSocket=null;
4 Socket socket=null;
5 InputStream is=null;
6 ByteArrayOutputStream baops=null;
7 try {
8 //1.需要设置地址
9 serverSocket=new ServerSocket(9999);
10 //2.等待客户端连接过来
11 socket=serverSocket.accept();
12 //3.读取客户端的消息
13 is=socket.getInputStream();
14
15 //管道流
16 baops=new ByteArrayOutputStream();
17 int len;
18 byte[] buffer=new byte[1024];
19 while((len=is.read(buffer))!=-1){
20 baops.write(buffer,0,len);
21 }
22 System.out.println(baops.toString());
23 } catch (IOException e) {
24 e.printStackTrace();
25 }finally{
26 baops.close();
27 is.close();
28 socket.close();
29 serverSocket.close();
30 }
31 }
32 }
7、UDP
①类似于发短信,不用连接,需要知道对方的地址
②设计两个类—DatagramPacket和DatagramSocket
1 //发送端
2 public class UdpClientDemo1 {
3 public static void main(String[] args) throws Exception {
4 //1.建立一个socket
5 DatagramSocket socket=new DatagramSocket();
6 //2.建立包
7 String msg="你好,服务器";
8 InetAddress localhost=InetAddress.getByName("localhost");
9 int port=9090;
10 DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
11 //3.发送包
12 socket.send(packet);
13 //4.关闭流
14 socket.close();
15 }
16 }
17
18 //接收端
19 public class UdpServerDemo1 {
20 public static void main(String[] args) throws Exception {
21 //1.开放端口
22 DatagramSocket socket=new DatagramSocket(9090);
23 //2.接受数据包
24 byte[] buffer=new byte[1024];
25 DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
26 socket.receive(packet);
27 System.out.println(packet.getAddress().getHostName());
28 System.out.println(new String(packet.getData(),0,packet.getLength()));
29 //3.关闭连接
30 socket.close();
31 }
32 }
③循环发送消息
1 //发送端
2 public class UdpSenderDemo1 {
3 public static void main(String[] args) throws Exception {
4 DatagramSocket socket=new DatagramSocket(8888);
5 //1.准备相应数据
6 BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
7 while (true){
8 String data=reader.readLine();
9 byte[] datas=data.getBytes();
10 DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
11 socket.send(packet);
12 if(data.equals("bye")){
13 break;
14 }
15 }
16 socket.close();
17 }
18 }
19
20 //接收端
21 public class UdpReceiveDemo1 {
22 public static void main(String[] args) throws Exception {
23 DatagramSocket socket=new DatagramSocket(6666);
24 //1.准备接收包裹
25 while (true){
26 byte[] container=new byte[1024];
27 DatagramPacket packet=new DatagramPacket(container,0,container.length);
28 socket.receive(packet);
29 byte[] data=packet.getData();
30 String receiveData=new String(data,0,data.length);
31 System.out.println(receiveData);
32 if(receiveData.equals("bye")){
33 break;
34 }
35 }
36 socket.close();
37 }
38 }
④多线程在线咨询
1 //发送端
2 public class TalkSend implements Runnable{
3
4 DatagramSocket socket=null;
5 BufferedReader reader=null;
6 private int fromPort;
7 private String toIP;
8 private int toPort;
9
10 public TalkSend(int fromPort, String toIP, int toPort) {
11 this.fromPort = fromPort;
12 this.toIP = toIP;
13 this.toPort = toPort;
14 try {
15 socket=new DatagramSocket(fromPort);
16 reader=new BufferedReader(new InputStreamReader(System.in));
17 } catch (SocketException e) {
18 e.printStackTrace();
19 }
20 }
21
22 @Override
23 public void run() {
24
25 while (true){
26 try {
27 String data=reader.readLine();
28 byte[] datas=data.getBytes();
29 DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
30 socket.send(packet);
31 if(data.equals("bye")){
32 break;
33 }
34 } catch (IOException e) {
35 e.printStackTrace();
36 }
37 }
38 socket.close();
39 }
40 }
41
42 //接收端
43 public class TalkReceive implements Runnable{
44
45 DatagramSocket socket=null;
46 private int port;
47 private String msgFrom;
48
49 public TalkReceive(int port,String msgFrom) {
50 this.port = port;
51 this.msgFrom=msgFrom;
52 try {
53 socket=new DatagramSocket(port);
54 } catch (SocketException e) {
55 e.printStackTrace();
56 }
57 }
58
59 @Override
60 public void run() {
61 //1.准备接收包裹
62 while (true){
63 try {
64 byte[] container=new byte[1024];
65 DatagramPacket packet=new DatagramPacket(container,0,container.length);
66 socket.receive(packet);
67 byte[] data=packet.getData();
68 String receiveData=new String(data,0,data.length);
69 System.out.println(msgFrom+":"+receiveData);
70 if(receiveData.equals("bye")){
71 break;
72 }
73 } catch (IOException e) {
74 e.printStackTrace();
75 }
76 }
77 socket.close();
78 }
79 }
80
81 public class TalkStudent {
82 public static void main(String[] args) {
83 new Thread(new TalkSend(7777,"localhost",9999)).start();
84 new Thread(new TalkReceive(8888,"老师")).start();
85 }
86 }
87
88 public class TalkTeacher {
89 public static void main(String[] args) {
90 new Thread(new TalkSend(6666,"localhost",8888)).start();
91 new Thread(new TalkReceive(9999,"学生")).start();
92 }
93 }
8、URL
统一资源定位符:定位资源的,定位互联网上的某一个资源
组成:协议/IP地址:端口/项目名/资源
1 public class UrlDemo1 {
2 public static void main(String[] args) throws Exception {
3 //1.下载地址
4 URL url=new URL("http://localhost:8080/yq/secrecy.txt");
5 //2.连接到这个资源 Http
6 HttpURLConnection connection=(HttpURLConnection) url.openConnection();
7 InputStream is=connection.getInputStream();
8 FileOutputStream fos=new FileOutputStream("secrecy.txt");
9 byte[] buffer=new byte[1024];
10 int len;
11 while((len=is.read(buffer))!=-1){
12 fos.write(buffer,0,len);
13 }
14
15 fos.close();
16 is.close();
17 connection.disconnect();
18 }
19 }

浙公网安备 33010602011771号