网站建设支付,赣州网站优化,html视频网站源码,漳州市城乡住房建设局网站1.网络编程三要素
1.IP地址#xff1a;网络中设备的唯一标识IPv4: 由4个字节组成#xff0c;点分十进制表示法IPv6: 由16个字节组成#xff0c;冒分十六进制表示法127.0.0.1本地主机网络地址【用于测试】相关命令#xff1a;ipconfig: 查看本机在当前网络环境…1.网络编程三要素
1.IP地址网络中设备的唯一标识IPv4: 由4个字节组成点分十进制表示法IPv6: 由16个字节组成冒分十六进制表示法127.0.0.1本地主机网络地址【用于测试】相关命令ipconfig: 查看本机在当前网络环境下的ip地址ping: 查看当前主机和指定的ip地址是否连通2.端口号在网络设备中应用程序的标识用一个整数表示。范围[0~65535][0-1023]可能被操作系统占用,建议使用1024以后的端口号80: 浏览器中访问服务器的默认端口号8080: Tomcat服务器默认的端口号3306: MySQL数据库的端口号3.网络协议网络中数据传输的规则UDP: 面向无连接的不可靠的协议一次只能传输64K的数据TCP: 面向有链接的可靠的协议对数据大小没有限制 对当前网络通讯质量要求不高的时候要求网络通讯速度尽量的快这时就使用UDP1.QQ语音 2.QQ视频 3.TFTP当对网络通信质量有要求时比如整个数据要准确无误的传递给对方这往往对于一些要求可靠的应用1.浏览器使用的HTTP 2.FlashFXP:FTP3.Outlook:POPSMTP 4.QQ文件传输
2.InetAddress类【ip相关】
//InetAddress类
public class Demo1 {public static void main(String[] args) throws UnknownHostException {//确定主机名称的IP地址。主机名称可以是机器名称也可以是IP地址//static InetAddress getByName (string host)InetAddress inetAddress InetAddress.getByName(192.168.83.152);//获取此IP地址的主机名//string getHostName ()如果主机名[安全问题]隐藏,则返回ip地址System.out.println(主机名为 inetAddress.getHostName());//string getHostAddress ()返回文本显示中的IP地址字符串System.out.println(ip为 inetAddress.getHostAddress());//局域网为192.168.83.113//外网为10.254.3.213}
}打印结果
------------------------------------------------------------------------
主机名为 192.168.83.152
ip为 192.168.83.1523.UDP通信【协议】
【过程与码头送包裹类似】
//发送端
public class ClientDemo {public static void main(String[] args) throws IOException {//创建码头DatagramSocket ds new DatagramSocket();//打包数据Scanner sc new Scanner(System.in);String s sc.nextLine();byte[] bytes s.getBytes();InetAddress address InetAddress.getByName(127.0.0.1);DatagramPacket dp new DatagramPacket(bytes,bytes.length,address,10001);//发送包裹【sent方法发送并将包裹传入】ds.send(dp);//释放资源ds.close();}
}打印结果
----------------------------------------------------------------------------------------------------
你好【注需要先打开接收端再打开发送端才可测试】
//接收端[码头需要释放资源]
//注意点
//1.要先运行接收端,再运行发送端
//2.如果接收端再启动之后,没有接收到数据,那么会死等(阻塞).
//3.在接收数据的时候,需要调用一个getLength方法,表示接收到了多少字节
public class ServerDemo {public static void main(String[] args) throws IOException {//找到码头DatagramSocket ds new DatagramSocket(10001);//创建新包//DatagramPacket (byte[] buf, int length)byte[] bytes new byte[1024];DatagramPacket dp new DatagramPacket(bytes,bytes.length);//将客户端发送的包裹放进新包里ds.receive(dp);//拆包展示//DatagramPacket getData(获取字节数组) getLength(获取数据的长度)byte[] data dp.getData();int length dp.getLength();System.out.println(new String(data, 0, length));//释放资源ds.close();}
}打印结果
----------------------------------------------------------------------------------------------------
/127.0.0.1 来信息
你好4.UDP中的组播和广播
组播代码实现 组播地址:224.0.0.0~239.255.255.255 其中224.0.0.0~224.0.0.255为预留的组播地址
//UDP组播
//发送端
public class ClientDemo {public static void main(String[] args) throws IOException {//1.创建码头DatagramSocket ds new DatagramSocket();//2.打包byte[] bytes hello组播.getBytes();//netsh interface ipv4 show joins查看组播地址InetAddress address InetAddress.getByName(224.0.0.1);//int ip 10000;DatagramPacket dp new DatagramPacket(bytes,bytes.length,address,10000);//发送ds.send(dp);//释放资源ds.close();}
}
打印结果
----------------
你好组播public class ServerDemo {public static void main(String[] args) throws IOException {//找码头的组MulticastSocket ms new MulticastSocket(10000);//准备新箱子DatagramPacket dp new DatagramPacket(new byte[1024],1024);//放包把当前计算机绑定一个组播地址表示添加到这一组中ms.joinGroup(InetAddress.getByName(224.0.0.1));ms.receive(dp);//拆包System.out.println(new String(dp.getData(), 0, dp.getLength()));ms.close();}
}广播代码实现 广播地址255.255.255.255
//UDP广播[广播地址不一定全部写成255,可以网段255]
//发送端
public class ClientDemo {public static void main(String[] args) throws IOException {//1.创建码头DatagramSocket ds new DatagramSocket();//2.打包byte[] bytes hello广播.getBytes();//255.255.255.255或者自己的网段255InetAddress address InetAddress.getByName(192.168.83.255);//int ip 10000;DatagramPacket dp new DatagramPacket(bytes,bytes.length,address,10000);//发送ds.send(dp);//释放资源ds.close();}
}
打印结果
----------------------------
你好广播//接收端
public class ServerDemo {public static void main(String[] args) throws IOException {//找码头的组DatagramSocket ds new DatagramSocket(10000);//准备新箱子DatagramPacket dp new DatagramPacket(new byte[1024],1024);//放包把当前计算机绑定一个组播地址表示添加到这一组中ds.receive(dp);//拆包System.out.println(new String(dp.getData(), 0, dp.getLength()));ds.close();}
}5.TCP通信【协议】
【使用Socket和ServerSocket发送一张图片】 测试也是先开启服务端再开启客户端发送
客户端
public class ClientDemo {public static void main(String[] args) throws IOException {//1.创建客户端Socket对象Socket socket new Socket(192.168.83.113, 10002);//2.本地输入流读取文件BufferedInputStream bis new BufferedInputStream(new FileInputStream(C:\\Users\\Inuyasha\\Desktop\\2.jpg));//网络输出流输出文件BufferedOutputStream bos new BufferedOutputStream(socket.getOutputStream());//边读边写byte[] bytes new byte[1024];int len bis.read(bytes);while (len ! -1) {bos.write(bytes, 0, len);len bis.read(bytes);}//给服务端读取结束符号socket.shutdownOutput();//关闭本地流bis.close();//3.等待服务器响应并读取//使用网络输入流对取并打印BufferedReader br new BufferedReader(new InputStreamReader(socket.getInputStream()));String s br.readLine();System.out.println(s);//4.释放资源socket.close();}
}服务端
public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建客户端ServerSocket对象ServerSocket serverSocket new ServerSocket(10002);//2.监视客户端等待请求Socket socket serverSocket.accept();//3.网络输入流读取客户端信息BufferedInputStream bis new BufferedInputStream(socket.getInputStream());//本地输出流将文件写入硬盘BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(day15_mySocket\\a.jpg));//边读边写byte[] bytes new byte[1024];int len bis.read(bytes);while (len ! -1) {bos.write(bytes, 0, len);len bis.read(bytes);}//关闭本地流bos.close();//4.读写完毕传递客户端//网络输出流BufferedWriter bw new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(上传成功);bw.newLine();bw.flush();//释放资源serverSocket.close();socket.close();}
}服务端改进【服务端的对客户端传输的信息的操作可以写成线程任务从而创建多线程】
public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建客户端ServerSocket对象ServerSocket serverSocket new ServerSocket(10002);//2.监视客户端等待请求while (true) {Socket socket serverSocket.accept();//socket有参构造得到一个socket的线程任务ThreadSocket threadSocket new ThreadSocket(socket);Executors.newFixedThreadPool(10).submit(threadSocket);//也可自定义线程池new ThreadPoolExecutor(5,//核心线程数8,//最大线程数1,//临时线程存在时间TimeUnit.MINUTES,//时间单位new ArrayBlockingQueue(8),//阻塞队列Executors.defaultThreadFactory(),//线程工程new ThreadPoolExecutor.AbortPolicy()//拒绝策略).submit(threadSocket);}}
}//线程任务实现类
public class ThreadSocket implements Runnable {private Socket socket;public ThreadSocket(Socket socket) {this.socket socket;}Overridepublic void run() {BufferedOutputStream bos null;try {//3.网络输入流读取客户端信息BufferedInputStream bis new BufferedInputStream(socket.getInputStream());//本地输出流将文件写入硬盘String s UUID.randomUUID().toString();bos new BufferedOutputStream(new FileOutputStream(day15_mySocket\\src\\com\\A\\ s .jpg));//边读边写byte[] bytes new byte[1024];int len bis.read(bytes);while (len ! -1) {bos.write(bytes, 0, len);len bis.read(bytes);}//4.读写完毕传递客户端//网络输出流BufferedWriter bw new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(上传成功);bw.newLine();bw.flush();} catch (IOException e) {e.printStackTrace();} finally {//关闭本地流if (bos ! null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}if (socket ! null) {//释放资源try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}6.TCP代码实现注意点
1阻塞方法 a.使用accept()【ServerSocket对象调用】来监听客户端并返回一个Socket对象【阻塞等待客户端请求】 ——解决客户端ip地址和端口号与服务端一致即可发送请求 b.read()【输入流读取】阻塞等待客户端输入【结束标记】 ——关闭流或者调用socket.shutdownOutput()方法给与一个结束标记但不会影响socket流的继续使用
2三次握手【建立连接】
3四次挥手【取消连接】