@[TOC]网络编程2
①.初识Tomcat
- 服务端:
原本—自定义 Server
后来—Tomcat服务器 Server :Java后台开发- 客户端
原来—自定义 Client
后来—浏览器 BTomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
下载地址:https://tomcat.apache.org/download-10.cgi
②.UDP消息发送
发短信:不用连接,但是要提前知道对方地址
发送消息
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
//UDP不需要链接服务器
public class UDPTalkSend01 {
public static void main(String[] args) throws Exception {
//1.建立一个Socket
DatagramSocket socket = new DatagramSocket();
//2.建立一个包,传入发送的地址以及端口
byte[] msg = "你好服务器".getBytes(StandardCharsets.UTF_8);
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg,0,msg.length,address,port);
//3.发送包
socket.send(packet);
//4.关闭流
socket.close();
}
}
接收消息
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//还是要等待客户端的链接
public class UDPTalkReceive {
public static void main(String[] args) throws Exception{
//1.开放端口
DatagramSocket socket = new DatagramSocket(9090);
//2.接收包数据
byte[] receive = new byte[1024];
DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
socket.receive(packet); //阻塞接收
System.out.println(new String(packet.getData()));
//3.关闭流
socket.close();
}
}
③.UDP实现聊天
循环发送消息
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
public class UdpSend01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
//准备从控制台读取数据
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
while (true){
byte[] data = br.readLine().getBytes(); //读取一行,存为数组
DatagramPacket packet = new DatagramPacket(data,0,data.length,
new InetSocketAddress("127.0.0.1",6666));
socket.send(packet);
//结束判断
if(new String(data).equals("bye")){
break;
}
}
socket.close();
}
}
循环接收消息
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);
while(true){
//准备接收数据
byte[] receive = new byte[1024];
DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
socket.receive(packet); //阻塞式接收
//断开判断
String msg = new String(packet.getData(),0, packet.getLength());
System.out.println(msg);
if (msg.equals("bye")){
break;
}
}
socket.close();
}
}
③.UDP多线程在线咨询
发送线程
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class TalkSend implements Runnable{
DatagramSocket socket = null;
BufferedReader br = null;
private String userName;
private int toPort;
private String toIP;
//构造器,初始化参数,获取Socket
public TalkSend(String userName, int toPort, String toIP) {
this.userName = userName;
this.toPort = toPort;
this.toIP = toIP;
try{
socket = new DatagramSocket();
br = new BufferedReader(new InputStreamReader(System.in));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
try{
while (true){
String msg = this.userName +":" + br.readLine();
byte[] data = msg.getBytes(); //读取一行,存为数组
DatagramPacket packet = new DatagramPacket(data,0,data.length,
new InetSocketAddress(this.toIP,this.toPort));
socket.send(packet);
//结束判断
if(new String(data).equals("bye")){
break;
}
}
}catch (Exception e){
e.printStackTrace();
}
socket.close();
}
}
接收线程
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class TalkReceive implements Runnable{
DatagramSocket socket = null;
private String userName;
private int localPort;
public TalkReceive(String userName, int localPort) {
this.userName = userName;
this.localPort = localPort;
try{
socket = new DatagramSocket(this.localPort);
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
try{
while(true){
//准备接收数据
byte[] receive = new byte[1024];
DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
socket.receive(packet); //阻塞式接收
//断开判断
String msg = new String(packet.getData(),0, packet.getLength());
System.out.println(msg);
if (msg.contains("bye")){
break;
}
}
}catch (Exception e){
e.printStackTrace();
}
socket.close();
}
}
调用线程的两个实例
public class User1 {
public static void main(String[] args) {
TalkSend send = new TalkSend("iFinder",8080,"127.0.0.1");
TalkReceive receive = new TalkReceive("iFinder",9090);
new Thread(send).start();
new Thread(receive).start();
}
}
public class User2 {
public static void main(String[] args) {
new Thread(new TalkSend("Tom",9090,"127.0.0.1")).start();
new Thread(new TalkReceive("Tom",8080)).start();
}
}
④.URL下载网络资源
URL:统一资源定位符,用于定位互联网上的某一个资源
- 组成部分:
协议:http:// ftp://
IP地址/域名
端口号
具体资源协议 : // ip地址 : 端口 / 项目名 / 资源 / …
package com.NetLearning;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLDown {
public static void main(String[] args) throws Exception {
//1.网络资源地址
URL url = new URL("https://m.mp3.1155.net/12345.m4a");
//2.连接到这个资源 HTTP
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream inputStream = connection.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("down.m4a"));
int temp;
while((temp = inputStream.read()) != -1){
bos.write(temp);
}
//关闭资源
bos.close();
inputStream.close();
connection.disconnect(); //断开连接
}
}