网络编程
TCP协议
- 客户端
- 连接服务器Socket
- 发送消息
public static void main(String[] args) {
Socket socket = null;
OutputStream outputStream = null;
try {
// 1.要知道服务器地址,端口号
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 8080;
// 2.创建Socket连接
socket = new Socket(address,port);
// 3.发送消息
outputStream = socket.getOutputStream();
outputStream.write("select * from student".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 服务端
- 简历服务器端口 ServerSocket
- 等待用户的连接 accept
- 接收用户的消息
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
ByteArrayOutputStream bos = null;
try {
// 1.创建服务端地址,给定端口号
serverSocket = new ServerSocket(8080);
// 2.等待连接
socket = serverSocket.accept();
// 3.读取客户端消息
inputStream = socket.getInputStream();
// 4.建立管道流
bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
bos.write(buffer,0,len);
}
String s = bos.toString();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
inputStream.close();
}
if (bos!=null){
bos.close();
}
}
}
文件上传
客户端
public static void main(String[] args) throws IOException {
// 获取服务地址端口建立连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8080);
// 创建一个输出流
OutputStream outputStream = socket.getOutputStream();
// 读取文件
FileInputStream fileInputStream = new FileInputStream("0_001551.jpg");
// 写出文件
byte[] buffer = new byte[1024];
int len;
while ((len=fileInputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
// 通知服务器,已经发送完毕
socket.shutdownOutput();
// 确定服务器接收完毕,才能断开连接
InputStream inputStream = socket.getInputStream();
// 创建管道
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[256];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
bos.write(buffer,0,len2);
}
String s = bos.toString();
System.out.println(s);
// 关闭连接
inputStream.close();
bos.close();
socket.close();
outputStream.close();
fileInputStream.close();
}
服务端
public static void main(String[] args) throws IOException {
// 创建服务
ServerSocket serverSocket = new ServerSocket(8080);
// 监听客户端的连接
Socket socket = serverSocket.accept();
// 获取输入流
InputStream inputStream = socket.getInputStream();
// 文件输出
FileOutputStream outputStream = new FileOutputStream("CopyFile.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
// 通知客户端,我接收完毕
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write("yes".getBytes());
// 关闭连接
outputStream1.close();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
Tomcat
服务端
- 自定义S
- Tomcat服务器S :Java后台开发
客户端
- 自定义C
- 浏览器B
UDP协议
- 发消息:不需要连接,只需要知道地址
发送端
public static void main(String[] args) throws IOException {
// 1.建立一个Socket
DatagramSocket socket = new DatagramSocket();
// 2.消息,地址,端口
String msg = "你好,服务器!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
// 3.建包
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
// 4.发送
socket.send(packet);
// 关闭资源
socket.close();
}
接收端
public static void main(String[] args) throws IOException {
// 1.开发端口
DatagramSocket socket = new DatagramSocket(9090);
// 2.接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
// 3.阻塞接收
socket.receive(packet);
// 查看
String s = new String(packet.getData(),0,packet.getData().length);
System.out.println(s);
// 关闭资源
socket.close();
}
咨询聊天循环发送
发送端
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8888);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String data = "QQ1: " + reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, InetAddress.getByName("localhost"), 6666);
socket.send(packet);
if (data.equals("byte")){
break;
}
}
socket.close();
}
接收端
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6666);
while (true) {
//准备容器
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);//阻塞接收包裹
//断开连接
byte[] data = packet.getData();
String msg = new String(data,0,data.length);
//打印消息
System.out.println(msg.trim());
if (msg.equals("bye")){
break;
}
}
socket.close();
}
在线聊天
创建封装发送消息的线程,继承Runnable
public class TaskSend implements Runnable{
private int startPort;
private String toIP;
private int toPort;
private String myRole;
DatagramSocket socket = null;
BufferedReader reader = null;
public TaskSend(int startPort,String toIP,int toPort,String myRole){
this.startPort = startPort;
this.toIP = toIP;
this.toPort = toPort;
this.myRole = myRole;
try {
socket = new DatagramSocket(this.startPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String data = this.myRole + ":" + reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, InetAddress.getByName(this.toIP), this.toPort);
socket.send(packet);
if (data.equals("byte")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
创建封装消息线程,继承Runnable接口
public class TaskReceive implements Runnable{
DatagramSocket socket = null;
private int port;
public TaskReceive(int port) {
this.port = port;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
//准备容器
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);//阻塞接收包裹
//断开连接
byte[] data = packet.getData();
String msg = new String(data,0,data.length);
//打印消息
System.out.println(msg.trim());
if (msg.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
创建两个客户端,并且创建发送和接收线程
学生端
public class TaskStudent {
public static void main(String[] args) {
//开启两个线程
new Thread(new TaskSend(6666,"localhost",8888,"学生")).start();
new Thread(new TaskReceive(4444)).start();
}
}
老师端
public class TaskTeacher {
public static void main(String[] args) {
//开启两个线程
new Thread(new TaskSend(5555,"localhost",4444,"老师")).start();
new Thread(new TaskReceive(8888)).start();
}
}
URL
https://www.baidu.com/
统一资源定位符:定位互联网上的某一个资源
DNS域名解析 www.baidu.com xxx.x…x…x
协议://ip地址:端口/项目名/资源
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:8080/yingsen/index.jsp?username=yingsen&passwword=123");
System.out.println(url.getProtocol()); // 获取协议
System.out.println(url.getHost()); // 获取主机ip
System.out.println(url.getPort()); // 获取端口
System.out.println(url.getPath()); // 获取路径
System.out.println(url.getFile()); // 获取文件
System.out.println(url.getQuery()); // 获取参数
}
下载资源
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:8080/yingsen/query.txt");
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream outputStream = new FileOutputStream("copyText.txt");
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
urlConnection.disconnect();
}
获取一个网络图片
public static void main(String[] args) throws IOException {
// 一个图片的地址
URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1115%2F0ZR1095111%2F210ZP95111-7-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1660662153&t=c95d31d0bcb090c9e9c068473d58edd9");
// 连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 获取输入流
InputStream inputStream = urlConnection.getInputStream();
// 文件输出流
FileOutputStream fileOutputStream = new FileOutputStream("baidu.jpg");
// 循环写出
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1) {
fileOutputStream.write(buffer,0,len);
}
// 关闭资源
fileOutputStream.close();
inputStream.close();
urlConnection.disconnect();
}