网络编程 一. 概述 1.什么是计算机网络java进阶之网络编程,学这个之前我们在这里简单讨论一下什么是计算机网络:
计算机网络是将不同的地理位置但是具有独立功能的计算机及其外部设备,通过通信线路连接起来,实现资源共享
这里我们就将实现这个功能,如何实现呢?继续往下看。
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其 外部设备,通过通信线路连接起来,在网络 *** 作系统,网络管理软 件及网络通信协议的管理和协调下,实现资源共享和信息传递的计 算机系统。2.为什么需要网络编程
简单的来说就是通过通信实现数据的交换3.这么实现网络通信
- 我们需要获取到双方的地址,这里所谓的地址就是IP+端口号,这里准确定位网络上的一台或者多台主机
- 网络通信协议
这里简单的讨论一下什么是IP
- 定位唯一一台网络上的计算机
- 127.0.0.1 代表的是本机地址,localhost
- 分类:
IPV4/IPV6 IPV4 127.0.0.1 4个字节组成 0~255 42亿 IPV6 128位 8个无符号整数 公网(互联网)-私网(局域网) 192.168.xxx.xxx,专门给组织内部使用 ABCD类地址如何通过代码获取IP呢?
这里来看获取本机IP和查询网站地址的,用代码进行讲解
1. //查询本机地址 InetAddress ip1 = InetAddress.getByName("127.0.0.1"); InetAddress ip2 = InetAddress.getByName("loaclhost"); InetAddress ip3 = InetAddress.getLocalHost(); 2. //查询网站地址 InetAddress ip4 = InetAddress.getByName("www.baiu.com"); 3. //四个get方法 ip4.getHostAddress();端口
上面说了获取计算机的地址就是获取其对应的IP+端口号,那么端口号到底是什么呢??
这里简单的来介绍一下什么是端口号:
端口号就是表示计算机上面的一个程序的进程 1、不同的进程有不同的端口号,用来区分软件 2、0~65535 3、TCP、UDP 65535*2 单个协议下,端口号不能冲突 4、分类 公有端口 0~1023 HTTP 80 HTTPS 443 FTP 21 Telent 23 程序注册端口 1024~491515 Tomcat 8080 MySQL 3306 Oracle 1521 动态、私有 49152~65535代码讲解
#查看所有端口 netstat -ano #查看具体端口 netstat -ano|findstr "5900" #查看具体端口的进程 tasklist|finstr "8696" InetSocketAddress port1 = new InetSocketAddress("127.0.0.1",8080); InetSocketAddress port2 = new InetSocketAddress("localhost"); port1.getAddress(); port1.getHostName(); port1.getPort();通信协议
我们所谓的协议就是约定的意思,这里主要看两个协议TCP和UDP
- TCP协议:用户传输的协议
TCP协议发送数据: 1、创建发送端的Socket对象 这一步一旦成功了,说明连接建立成功 2、获取输出流对象,写数据 3、释放资源 TCP编程先启动服务器端,否则报错 ConnectException: Connection refused: connect
- UDP:用户数据报协议
UDP协议发送数据: 1、创建发送端的Socket对象 2、创建数据,将数据打包 3、调用Socket对象中的一个方法,将数据包发出去 4、释放资源,关闭Socket对象TCP通信 这里是客户端
我们这里用代码来讲解一下
- 创建socket,连接服务器
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9999);
- 获取输出流对象
OutputStream os = socket.getOutputStream();
- 创建文件读取流fis
FileInputStream fis = new FileInputStream(new File("naem.file"))
当然我们这里也可以变成手动的输入数据这里也给出代码:
while (true){ sc = new Scanner(System.in); String next = sc.next(); if("886".equals(nest)){ break; } os.write(next.getBytes()); } //释放资源 s.close();
- fis读取buffer,os写出文件(管道流)
byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { os.write(buffer,0,len); }
- 通知服务器,传输完毕
socket.shutdownOutput();
- 创建js接收服务器传输内容,确认服务器接收完毕,关闭资源。
InputStream is = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[1024]; int len2; while ((len2 = is.read(buffer2)) != -1) { baos.write(buffer2,0,len2); } System.out.println(baos.toString()); baos.close(); is.close(); fis.close(); os.close(); socket.close();这里是服务器端
- 创建ServerSocket服务端口
ServerSocket serversocket = new ServerSocket(9999);
- 创建Socket,等待(监听)用户连接Accept
Socket socket = serverSocket.accept();
- 创建输入流,获取客户端的文件
InputStream is = socket.getInputStream;
- 创建文件输出流
FileOutputStream fos = new FileOutputStream(new File("Receive.png")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer,0,len); }
- 接收完毕关闭客户端可以关闭资源
OutputStream os = socket.getOutputStream(); os.write("接收完毕,可关闭连接.".getBytes()); os.close(); fos.close(); is.close(); socket.close(); serverSocket.close();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)