目录
前提
- 网络模型
- IP地址
- 端口
- 传输协议
UDP
接收端
- 建立UDP、socket服务
- 创建数据包,用于存储接收到的数据,方便用数据包对象的方法分析
- 使用socket服务的receive方法接受的数据存储到数据包中
- 通过数据包解析数据
- 关闭资源
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();
}
}
发送端
- 创建udp的socket服务
- 将要发送的数据封装到数据包
- 通过udp的socket服务将数据包发送出去
- 关闭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
- 建立套接字
Socket socket=new Socket(< ip >,< port >); - 获取源相关信息:Addresses、Port、Name等
①socket.getLocalAddress()
——获取套接字绑定的本地地址
②socket.getLocalAddress().getHostAddress();
——返回本地 IP 地址字符串
③socket.getLocalAddress().getHostName();
——返回本地 IP 地址的主机名字符串
④socket.getLocalPort()
——返回本地套接字端口(int形式返回) - 获取目的相关信息
①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至今的通信连接
步骤:
- 创建URL对象
- URL的openConnection方法创建URLConnection对象
- 配置参数
- 读首部字段
- 获取输入流,读数据
- 获取输出流,写数据
- 关闭连接
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);
}
}