网络编程笔记
作者:@冰山醉酒
本文为作者原创,转载请注明出处:https://www.cnblogs.com/douFrank/p/16118029.html
1|0网络编程
如何实现网络的通信?
通信双方地址:
-
ip
-
端口号
-
192.168.0.124
:5900
规则:网络通信的协议
小结:
-
网络编程中有两个主要的问题
-
如何准确的定位到网络上的一台主机
-
找到主机之后如何进行通信
-
-
网络编程中的要素
-
IP和端口号 IP
-
网络通信协议 udp ,tcp
-
-
万物皆对象
2|0IP
ip地址:InetAddress
-
唯一定位一台网络上的计算机
-
127.0.0.1:本机localhost
-
ip地址的分类
-
ipv4/ipv6
-
IPV4
-
IPV6
-
-
公网/私网
ABCD类
-
3|0端口
端口表示计算机上的一个程序的进程;
-
不同的进程有不同的端口号!用来区别软件
-
被规定0~65535
-
TCP,UDP:65535*2 单个协议下,端口号不能冲突
-
端口分类
-
公有端口:0~1023
-
HTTP:80
-
HTTPS:443
-
FTP:21
-
Telent:23
-
-
程序注册端口:1024~49151,分配用户或者程序
-
Tomcat:8080
-
MySQL:3306
-
Oracle:1521
-
-
动态、私有:49152~65535
netstat -ano #查看所有端口 netstat -ano|findstr "XXX" #查看指定的端口 tasklist|findstr "XXX" #查看指定端口的进程
-
4|0通讯协议
TCP UDP对比
TCP:打电话
-
连接,稳定
-
三次握手,四次挥手
-
客户端,服务端
-
传输完成,释放连接,效率低
UDP:发信息
-
不连接,不稳定
-
客户端、服务端:没有明确的界限
-
不管有没有准备好,都可以发给你
5|0TCP
客户端
-
连接服务器socket
-
发送消息
1 package com.study.demo02; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.net.InetAddress; 6 import java.net.Socket; 7 import java.net.UnknownHostException; 8 import java.nio.charset.StandardCharsets; 9 10 //客户端 11 public class TcpClientDemo01 { 12 public static void main(String[] args){ 13 Socket socket = null; 14 OutputStream os = null; 15 try { 16 //1,要知道服务器的地址,端口号 17 InetAddress serverIP = InetAddress.getByName("127.0.0.1"); 18 int port = 8090; 19 //2,创建一个socket连接 20 socket = new Socket(serverIP,port); 21 //3,发送消息IO流 22 os = socket.getOutputStream(); 23 os.write("你好,吃了吗?".getBytes()); 24 } catch (Exception e) { 25 e.printStackTrace(); 26 }finally { 27 //关闭资源 28 if(os!=null){ 29 try { 30 os.close(); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35 if(socket!=null){ 36 try { 37 socket.close(); 38 } catch (IOException e) { 39 e.printStackTrace(); 40 } 41 } 42 } 43 44 } 45 46 }
服务器
-
建立服务的端口ServerSocket
-
等待用户的连接accept
-
接收用户的消息
1 package com.study.demo02; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9 //服务端 10 public class TcpServerDemo02 { 11 public static void main(String[] args){ 12 ServerSocket serverSocket = null; 13 Socket socket = null; 14 InputStream is = null; 15 ByteArrayOutputStream baos = null; 16 try { 17 //1,我得有一个地址 18 serverSocket = new ServerSocket(8090); 19 //循环监听 20 while (true){ 21 //2,等待用户的连接过来 22 socket = serverSocket.accept(); 23 //3,接受客户端的消息 24 is = socket.getInputStream(); 25 //管道流 26 baos = new ByteArrayOutputStream(); 27 byte[] buf = new byte[1024]; 28 int len; 29 while((len=is.read(buf))!=-1){ 30 baos.write(buf,0,len); 31 } 32 System.out.println(baos.toString()); 33 } 34 35 /* 36 太low了 37 byte[] buf = new byte[1024]; 38 int len; 39 while((len=is.read(buf))!=-1){ 40 String msg = new String(buf,0,len); 41 System.out.println(msg); 42 } 43 */ 44 45 } catch (IOException e) { 46 e.printStackTrace(); 47 }finally { 48 //关闭资源 49 if (baos!=null){ 50 try { 51 baos.close(); 52 } catch (IOException e) { 53 e.printStackTrace(); 54 } 55 } 56 if (is!=null){ 57 try { 58 is.close(); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 } 63 if (socket!=null){ 64 try { 65 socket.close(); 66 } catch (IOException e) { 67 e.printStackTrace(); 68 } 69 } 70 if (serverSocket!=null){ 71 try { 72 serverSocket.close(); 73 } catch (IOException e) { 74 e.printStackTrace(); 75 } 76 } 77 78 79 80 } 81 } 82 }
6|0文件上传
服务器端:
1 package com.study.demo02.TcpPCDemo02; 2 3 import java.io.*; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class TcpServerDemo02 { 8 public static void main(String[] args) throws IOException { 9 //创建出服务 10 ServerSocket serverSocket = new ServerSocket(8000); 11 //等待客户端连接 12 Socket socket = serverSocket.accept();//阻塞式监听 13 //创建一个输入流 14 InputStream is = socket.getInputStream(); 15 //接收文件 16 FileOutputStream fos = new FileOutputStream(new File("receive.jpg")); 17 byte[] buffer = new byte[1024]; 18 int len; 19 while ((len=is.read(buffer))!=-1){ 20 fos.write(buffer,0,len); 21 } 22 23 //通知客户端,我已经接收完毕了 24 OutputStream os = socket.getOutputStream(); 25 os.write("我已经接收完毕了,你可以断开了!".getBytes()); 26 27 //关闭资源 28 os.close(); 29 fos.close(); 30 is.close(); 31 socket.close(); 32 serverSocket.close(); 33 34 35 36 } 37 }
客户端
1 package com.study.demo02.TcpPCDemo02; 2 3 import java.io.*; 4 import java.net.InetAddress; 5 import java.net.Socket; 6 7 public class TcpClientDemo02 { 8 public static void main(String[] args) throws IOException { 9 //1,建立连接 10 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8000); 11 //创建一个输出流 12 OutputStream os = socket.getOutputStream(); 13 //读取文件 14 FileInputStream fis = new FileInputStream(new File("TestFile.jpg")); 15 //发送文件 16 byte[] buffer = new byte[1024]; 17 int len; 18 while((len=fis.read(buffer))!=-1){ 19 os.write(buffer,0,len); 20 } 21 22 //告诉服务端我发送完毕了 23 socket.shutdownOutput(); 24 25 //确认服务端接收完毕,才能断开连接 26 InputStream is = socket.getInputStream(); 27 //管道流 28 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 29 byte[] buffer2 = new byte[1024]; 30 int len2; 31 while ((len2= is.read(buffer2))!=-1){ 32 baos.write(buffer2,0,len2); 33 } 34 System.out.println(baos.toString()); 35 //关闭资源 36 baos.close(); 37 fis.close(); 38 os.close(); 39 socket.close(); 40 } 41 }
7|0Tomcat
服务器
-
自定义 S
-
Tomcat服务器S
客户端
-
自定义C
-
浏览器B
8|0UDP
发短息,不需要连接
发送端
1 package com.study.demo02.UDPDemo01; 2 3 import java.net.DatagramPacket; 4 import java.net.DatagramSocket; 5 import java.net.InetAddress; 6 import java.net.SocketException; 7 8 public class UdpClientDemo01 { 9 public static void main(String[] args) throws Exception { 10 //建立一个socket 11 DatagramSocket socket = new DatagramSocket(); 12 //建个包 13 String msg = "你好呀,服务器"; 14 InetAddress localhost = InetAddress.getByName("localhost"); 15 int port = 9090; 16 DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port); 17 //发送包 18 socket.send(packet); 19 20 //关闭资源 21 socket.close(); 22 } 23 }
接收端
package com.study.demo02.UDPDemo01; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //还是要等待客户端的连接 public class UdpServerDemo01 { public static void main(String[] args) throws Exception { //开放端口 DatagramSocket socket = new DatagramSocket(9090); //接收数据 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); socket.receive(packet);//阻塞接收 System.out.println(packet.getAddress().getHostAddress()); System.out.println(new String(packet.getData(),0,packet.getLength())); //关闭连接 socket.close(); } }
8|1聊天实现
发送端
1 package com.study.demo02.UdpDemo02; 2 3 4 import java.io.BufferedReader; 5 import java.io.InputStreamReader; 6 import java.net.DatagramPacket; 7 import java.net.DatagramSocket; 8 import java.net.InetSocketAddress; 9 import java.net.SocketException; 10 11 public class UdpSenderDemo01 { 12 public static void main(String[] args) throws Exception { 13 DatagramSocket socket = new DatagramSocket(8000); 14 15 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 16 17 while (true){ 18 String data = reader.readLine(); 19 byte[] datas = data.getBytes(); 20 DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6000)); 21 22 socket.send(packet); 23 if (data.equals("bye")){ 24 break; 25 } 26 } 27 28 29 socket.close(); 30 } 31 }
接收端
1 package com.study.demo02.UdpDemo02; 2 3 import java.net.DatagramPacket; 4 import java.net.DatagramSocket; 5 import java.net.SocketException; 6 7 public class UdpReceiverDemo01 { 8 public static void main(String[] args) throws Exception { 9 DatagramSocket socket = new DatagramSocket(6000); 10 11 while (true){ 12 byte[] container = new byte[1024]; 13 DatagramPacket packet = new DatagramPacket(container,0,container.length); 14 socket.receive(packet); 15 16 byte[] data = packet.getData(); 17 String receiveDatas = new String(data,0,packet.getLength()); 18 //注意String receiveDatas = new String(data,0,data.length());是不行的,是一个坑。 19 //packet.getLength==实际长度,而data.length==1024! 20 /*DatagramPacket的两个方法getData()和getLength()是不对应的。 21 getLength()反映了刚刚接收到的数据的长度,而getData()反映了DatagramPacket对应缓冲区中的新接收到的数据和未被覆盖的旧数据, 22 当我们使用DatagramPacket来处理新接收到的数据时,就容易同时触及到旧数据导致混乱。 23 */ 24 System.out.println(receiveDatas); 25 26 if (receiveDatas.equals("bye")){ 27 break; 28 } 29 } 30 sorket.close; 31 } 32 }
__EOF__

本文作者:冰山醉酒
本文链接:https://www.cnblogs.com/douFrank/p/16118029.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/douFrank/p/16118029.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义