Java之网络编程

前提

  1. 网络模型
  2. IP地址
  3. 端口
  4. 传输协议

UDP

接收端

  1. 建立UDP、socket服务
  2. 创建数据包,用于存储接收到的数据,方便用数据包对象的方法分析
  3. 使用socket服务的receive方法接受的数据存储到数据包中
  4. 通过数据包解析数据
  5. 关闭资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPRecvDemo {

	public static void main(String[] args) throws IOException {
		System.out.println("接收端启动");
		
		//1.建立udp服务,接收数据,必须先明确一个端口号
		DatagramSocket ds=new DatagramSocket(10000);
		//2. 创建数据包,用于存储接收到的数据,方便用数据包对象的方法分析
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		//3. 使用socket服务的receive方法接受的数据存储到数据包中
		ds.receive(dp);//阻塞式
		//4. 通过数据包解析数据
		String ip=dp.getAddress().getHostAddress();
		int port=dp.getPort();
		String text=new String(dp.getData(),0,dp.getLength());
		System.out.println(ip+":"+port+":"+text);
		//5. 关闭资源
		ds.close();
	}

}

发送端

  1. 创建udp的socket服务
  2. 将要发送的数据封装到数据包
  3. 通过udp的socket服务将数据包发送出去
  4. 关闭socket服务
import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSendDemo {

	public static void main(String[] args) throws IOException {
		System.out.println("发送端启动");
		
		//1. 创建udp的socket服务
		DatagramSocket ds=new DatagramSocket(8080);
		//2. 将要发送的数据封装到数据包
		String str="建立UDP连接并成功传输数据";
		byte[] buf =str.getBytes();
		DatagramPacket dp=
				new DatagramPacket(buf, 
						buf.length,InetAddress.getByName("60.176.47.13"),10000);
		//3. 通过udp的socket服务将数据包发送出去
		ds.send(dp);
		//4. 关闭socket服务
		ds.close();
		
		
	}

}

TCP

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientDemo {

	public static void main(String[] args) throws UnknownHostException, IOException {
		//1. 创建tcp的socket服务,明确目的地址
		//2. 连接建立成功,获取输入输出流
		//3. 使用输出流将数据写出
		//4. 关闭资源
		
		//1. 创建tcp客戶端的socket服务
		Socket socket =new Socket("192.168.64.1",10000);
		//2. 连接建立成功,获取输出流
		OutputStream out=socket.getOutputStream();
		//3. 使用输出流将数据写出
		out.write("tcp建立连接成功".getBytes());
		//4. 关闭资源
		socket.close();
	}

}

服务端

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerDemo {

	public static void main(String[] args) throws IOException {
		//1.创建服务端的socket服务,通过serversocket对象
		//2. 服务端必须对外提供一个端口,否则客户端无法连接
		//3.获取连接过来的客户端对象
		//4. 通过客户端对象获取socket流读取客户端发来的数据
		//5. 关闭资源
		
		//1.创建服务端的socket服务,通过serversocket对象
		ServerSocket ss=new ServerSocket(10000);
		//2. 服务端必须对外提供一个端口(如上面的10000),否则客户端无法连接
		Socket s=ss.accept();
		String ip=s.getInetAddress().getHostAddress();
		System.out.println("I'm Server:"+ip);
		//3.获取连接过来的客户端对象
		
		InputStream in=s.getInputStream();
		
		//4. 通过客户端对象获取socket流读取客户端发来的数据
		byte[] buf =new byte[1024];
		int len =in.read(buf);
		String text=new String(buf,0,len);
		System.out.println("server "+ip+":"+text);
		//5. 关闭资源
		s.close();
		ss.close();
	}

}

TCP通信+多线程

思路:服务器和客户端的收发都各自作为一个线程,一共四个线程

Client

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

class TCPClientSend implements Runnable{
	private Socket socket;

	public TCPClientSend(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			OutputStream out = socket.getOutputStream();
			BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while((line=bufr.readLine())!=null) {
				Thread.sleep(10);
				out.write(line.getBytes());
				if (line.equals("exit")) {
					socket.close();
					break;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
}
class TCPClientRecv implements Runnable{
	private Socket socket;

	public TCPClientRecv(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			String localip=socket.getLocalAddress().getHostAddress();
			String localname=socket.getLocalAddress().getHostName();
			String connectip = socket.getInetAddress().getHostAddress();
//			String connectname = socket.getInetAddress().getHostName();
			System.out.println("I'm Client-" +localname+"-"+ localip+":"+socket.getLocalPort());
			// 2. 连接建立成功,获取输出流
			OutputStream out = socket.getOutputStream();
			// 3. 使用输出流将数据写出
			String str="连接到Server:"+connectip+":"+socket.getPort();
			System.out.println(str);
			// 读取服务端返回数据
			InputStream in = socket.getInputStream();
			while (true) {
				Thread.sleep(10);
				byte[] buf = new byte[1024];
				int len = in.read(buf);
				String text = new String(buf, 0, len);
				System.out.println("client receive data of [" + connectip + ":"+socket.getPort()+ "] :" + text);
				//out.write("Client收到".getBytes());
				if(text.equals("exit")) {
					socket.close();
					break;
				}				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

public class TCPClient {
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket socket=new Socket("192.168.64.1", 10000);
		TCPClientSend tcs=new TCPClientSend(socket);
		TCPClientRecv tcr=new TCPClientRecv(socket);
		
		new Thread(tcs).start();
		new Thread(tcr).start();
		
		
	}
}

Server

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


class TCPServerSend implements Runnable {
	private Socket socket;

	public TCPServerSend(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			OutputStream out = socket.getOutputStream();
			BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while((line=bufr.readLine())!=null) {
				Thread.sleep(10);
				out.write(line.getBytes());
				if (line.equals("exit")) {
					socket.close();
					break;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
}
class TCPServerRecv implements Runnable{
	private Socket socket;

	public TCPServerRecv(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			String localip=socket.getLocalAddress().getHostAddress();
			String localname=socket.getLocalAddress().getHostName();
			String connectip = socket.getInetAddress().getHostAddress();
//			String connectname = socket.getInetAddress().getHostName();
			System.out.println("I'm Server:" +localname+"-"+ localip+":"+socket.getLocalPort());
			// 2. 连接建立成功,获取输出流
			OutputStream out = socket.getOutputStream();
			// 3. 使用输出流将数据写出
			String str="Client Join:"+connectip+":"+socket.getPort();
			System.out.println(str);
			// 读取服务端返回数据
			InputStream in = socket.getInputStream();
			while (true) {
				Thread.sleep(10);
//				InputStream in = socket.getInputStream();
				byte[] buf = new byte[1024];
				int len = in.read(buf);
				String text = new String(buf, 0, len);
				System.out.println("server receive data of [" + connectip + ":"+socket.getPort() + "] :"+ text);
				//给客户端返回数据
//				out.write("Server收到".getBytes());
				if (text.equals("exit")) {
					socket.close();
					break;
				}
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

public class TCPServer {
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket socket=ss.accept();
		TCPServerSend tss=new TCPServerSend(socket);
		TCPServerRecv tsr=new TCPServerRecv(socket);
		
		new Thread(tss).start();
		new Thread(tsr).start();
		
		
	}
}

论TCP的IP和Port

  1. 建立套接字
    Socket socket=new Socket(< ip >,< port >);
  2. 获取源相关信息:Addresses、Port、Name等
    ①socket.getLocalAddress()
    ——获取套接字绑定的本地地址
    ②socket.getLocalAddress().getHostAddress();
    ——返回本地 IP 地址字符串
    ③socket.getLocalAddress().getHostName();
    ——返回本地 IP 地址的主机名字符串
    ④socket.getLocalPort()
    ——返回本地套接字端口(int形式返回)
  3. 获取目的相关信息
    ①socket.getLocalAddress()
    ——获取套接字连接到的远程 IP 地址
    ②socket.getLocalAddress().getHostAddress();
    ——返回目的 IP 地址字符串
    ③socket.getLocalAddress().getHostName()
    ——返回目的 IP 地址的主机名字符串
    ④socket.getPort()
    ——返回远程套接字端口(int形式返回)

txt文件上传

FileUploadCient

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class FileUploadCient {
	//上传文本文件-TCP
	public static void main(String[] args) throws UnknownHostException, IOException {
		String file="From.txt";
		Socket socket =new Socket(InetAddress.getLocalHost().getHostAddress(),10000);
		
		String localip=socket.getLocalAddress().getHostAddress();
		String localname=socket.getLocalAddress().getHostName();
		String connectip = socket.getInetAddress().getHostAddress();
//		String connectname = socket.getInetAddress().getHostName();
		System.out.println("I'm Client-" +localname+"-"+ localip+":"+socket.getLocalPort());
		BufferedReader bufr=
				new BufferedReader(new FileReader(file));
		
		PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
		
		String line=null;
		while((line=bufr.readLine())!=null){
			System.out.println("Upload:"+line);
			out.println(line);
		}
		
		BufferedReader bufin=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		String str=bufin.readLine();
		
		System.out.println(str);
		bufr.close();
		
	}

}

FileUploadServer

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.sound.midi.Receiver;

public class FileUploadServer {
	//上传文本文件-TCP
	public static void main(String[] args) throws UnknownHostException, IOException {
		String file="Out.txt";
		
		ServerSocket ss=new ServerSocket(10000);
		Socket socket =ss.accept();
		String localip=socket.getLocalAddress().getHostAddress();
		String localname=socket.getLocalAddress().getHostName();
		String connectip = socket.getInetAddress().getHostAddress();
//		String connectname = socket.getInetAddress().getHostName();
		System.out.println("I'm Server:" +localname+"-"+ localip+":"+socket.getLocalPort());
		
		BufferedReader bufr=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if (line.equals("over")) {
				break;
			}
			System.out.println("Receive:"+line);
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		
		PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
		out.println("上传成功");
		
		//bufr.close();
		bufw.close();
		socket.close();
		ss.close();
	}

}

图片文件上传

//客户端上传图片
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class FileUploadCient2 {
	//上传文本文件-TCP
	public static void main(String[] args) throws UnknownHostException, IOException {
		String file="picture.jpg";
		Socket socket =new Socket(InetAddress.getLocalHost().getHostAddress(),10000);
		
		FileInputStream fis=new FileInputStream(file);
		
		String localip=socket.getLocalAddress().getHostAddress();
		String localname=socket.getLocalAddress().getHostName();
		String connectip = socket.getInetAddress().getHostAddress();
//		String connectname = socket.getInetAddress().getHostName();
		System.out.println("I'm Client-" +localname+"-"+ localip+":"+socket.getLocalPort());
		
		OutputStream out=socket.getOutputStream();
		
		byte[] buf=new byte[1024];
		int len=0;
		while((len=fis.read(buf))!=-1){
			out.write(buf, 0, len);
		}
		
		socket.shutdownOutput();
		
		InputStream in=socket.getInputStream();
		
		byte[] bufin=new byte[1024];
		int lenin=in.read(buf);
		String str=new String(bufin,0,lenin);
		System.out.println(str);
		
		fis.close();
		socket.close();
		
	}

}
//服务器接收图片
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.sound.midi.Receiver;

public class FileUploadServer2 {
	//上传文本文件-TCP
	public static void main(String[] args) throws UnknownHostException, IOException {
		String filename="copypicuure.jpg";
		
		ServerSocket ss=new ServerSocket(10000);
		Socket socket =ss.accept();
		String localip=socket.getLocalAddress().getHostAddress();
		String localname=socket.getLocalAddress().getHostName();
		String connectip = socket.getInetAddress().getHostAddress();
//		String connectname = socket.getInetAddress().getHostName();
		System.out.println("I'm Server:" +localname+"-"+ localip+":"+socket.getLocalPort());
		
		InputStream in=socket.getInputStream();		
		
		File file = new File(filename);
		
		FileOutputStream fos=new FileOutputStream(file);
		
		byte[] buf=new byte[1024];
		int len=0;
		while((len=in.read(buf))!=-1){
			fos.write(buf, 0, len);
			fos.flush();
		}
		
		OutputStream out=socket.getOutputStream();
		out.write("上传成功".getBytes());
		
		fos.close();
		ss.close();
		socket.close();
	}

}

关于shutdown和close

在这里插入图片描述
重点:shutdown将输入输出流置入末尾-1

常见的客户端和服务端

客户端:
浏览器:IE 各种网页
服务端:
服务器:Tomcat

package com.yyxx.day15;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTomcat {

	public static void main(String[] args) throws IOException {
		ServerSocket ss=new ServerSocket(10000);
		Socket socket=ss.accept();
		System.out.println(socket.getInetAddress().getHostAddress()+"..connected");
		InputStream inputStream= socket.getInputStream();
		byte[] buf =new byte[1024];
		int len =inputStream.read(buf);
		String text = new String(buf,0,len);
		System.out.println(text);
		
		//给客户端一个反馈信息
		PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
//		out.println("欢迎光临");
		out.println("<font color='red' size='7'>欢迎光临</font>");
		socket.close();
		ss.close();
	}

}
//IE浏览器显示,正常收到反馈信息
//60.176.47.239..connected
//GET / HTTP/1.1
//Cache-Control: max-age=0
//User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
//Accept-Language: zh-CN
//Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
//Upgrade-Insecure-Requests: 1
//Accept-Encoding: gzip, deflate
//Host: 60.176.47.239:10000
//Connection: Keep-Alive

URL&URLConnection

网络类之一,URL(统一资源定位器),再Internet上用来描述信息资源的字符串,主要用在各种www客户沉痼和服务器程序上,采用URL,可以用一种统一的格式来描述各种信息资源
URLConnection:抽象类,应用程序与URL至今的通信连接
步骤:

  1. 创建URL对象
  2. URL的openConnection方法创建URLConnection对象
  3. 配置参数
  4. 读首部字段
  5. 获取输入流,读数据
  6. 获取输出流,写数据
  7. 关闭连接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLDemo {

	public static void main(String[] args) throws IOException {
		String str_url="http://www.baidu.com";
		URL url = new URL(str_url);
		//获取协议
		System.out.println("Protocol:"+url.getProtocol());
		//获取主机名
		System.out.println("Hostname:"+url.getHost());
		//获取端口号
		System.out.println("Port:"+url.getPort());
		//URL转字符串
		System.out.println("toString:"+url.toString());
		
		//读取网站信息
		InputStream input = url.openStream();
		byte[] buf = new byte[1024];
		int len = input.read(buf);
		String text = new String(buf,0,len);
		System.out.println(text);
		input.close();
		
//		URLConnection conn=url.openConnection();
//		System.out.println(conn);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值