一、TCP
1.简单代码实例
实现客户端向服务器端发送文件
服务器端:
package com.hkd.server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class MyServer {
public static void main(String[] args) {
//创建服务
try {
ServerSocket ss=new ServerSocket(9999);
System.out.println("服务端开启了");
Socket s=ss.accept();
System.out.println("客户端连接上了");
InputStream is=s.getInputStream();
FileOutputStream fos=new FileOutputStream(new File("copy.png"));
byte[] buffer=new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
System.out.println("服务端接受完了");
//通知客户端我们接受完毕了
OutputStream os=s.getOutputStream();
os.write("我已经接受完毕了,你可以断开了".getBytes(StandardCharsets.UTF_8));
fos.close();
is.close();
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package com.hkd.server;
import java.io.*;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) {
//创建一个socket连接
try {
Socket s=new Socket("localhost",9999);
//2.创建一个输出流
OutputStream os=s.getOutputStream();
//读取文件
FileInputStream fis=new FileInputStream(new File("D:\\大三下学期java学习\\实训\\test\\1.png"));
//读出文件
byte [] buffer=new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
s.shutdownOutput();
System.out.println("客户端发送完l");
//确认服务器接受文件后,才能断开连接
InputStream inputStream=s.getInputStream();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
baos.close();
inputStream.close();
fis.close();
os.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.实现客户端向服务器端发送实体类,并接受返回信息
由于是两个项目,就通过文件展示了
二.UDP
原理:发短信:不用连接,需要知道对方的地址
1.发送消息
- 一方是发送端,一方是接收端
实现代码如下:
发送端:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
public class UdpSendDemo1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket=new DatagramSocket(8888);
//准备数据 system.in
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));
while (true){
String data=bufferedReader.readLine();
byte[] datas=data.getBytes(StandardCharsets.UTF_8);
DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
socket.send(packet);
if (data.equals("bye")){
System.out.println("你选择了退出");
break;
}
}
socket.close();
}
}
接收端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.SocketException;
public class UdpReceiveDemo1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);
while (true) {
//准备接受包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);//阻塞式接受包裹
//断开连接 bye
byte[] data= packet.getData();
String receiveData= new String(data,0,data.length);
//输出接受到的数据
System.out.println(receiveData.trim());
//判断结束到的数据是bye吗,如果是就结束循环,结束程序
if (receiveData.trim().equals("bye")){
break;
}
}
socket.close();
}
}
2.在线咨询
- 两个人都可以是发送方,也可以是接收方
TalkReceive工具类
package com.hkd.chat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TalkReceive implements Runnable {
DatagramSocket socket =null;
//接受端端口号
private int port;
//来自谁的信息
private String msgFrom;
private SimpleDateFormat sdf=new SimpleDateFormat("hh:mm:ss");
public TalkReceive(int port,String msgFrom) {
this.port = port;
this.msgFrom=msgFrom;
try {
socket=new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
//准备接受包裹
byte[] container = new byte[2048];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);//阻塞式接受包裹
//断开连接 bye
byte[] data= packet.getData();
String receiveData= new String(data,0,data.length);
//输出接受信息的时间
System.out.println("-----------"+sdf.format(new Date())+"-----------");
//输出接受到的数据
System.out.println(msgFrom+":"+receiveData.trim());
//判断结束到的数据是bye吗,如果是就结束循环,结束程序
if (receiveData.trim().equals("bye")){
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
//关闭资源
socket.close();
}
}
TalkSend工具类
package com.hkd.chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
public class TalkSend implements Runnable {
DatagramSocket socket=null;
BufferedReader bufferedReader=null;
//来自本机的那个端口
private int fromPort;
//接收端的ip和端口号
private String toIp;
private int toPort;
public TalkSend(int fromPort, String toIp, int toPort) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toPort = toPort;
try {
socket = new DatagramSocket(fromPort);
bufferedReader=new BufferedReader(new InputStreamReader(System.in));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
String data=bufferedReader.readLine();
byte[] datas=data.getBytes(StandardCharsets.UTF_8);
DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));
socket.send(packet);
if (data.equals("bye")){
System.out.println("你选择了退出");
break;
}
}
catch (Exception e){
e.printStackTrace();
}
}
//关闭资源
socket.close();
}
}
客户端A
package com.hkd.chat;
/**
* 用户A的客户端
*/
public class TalkA {
public static void main(String[] args) {
//用户A的两个线程
//1.用户A的发送线程
// 参数 来自用户A的7777端口号 用户B的地址 用户B的接受端口号
new Thread(new TalkSend(7777,"localhost",9999)).start();
//2.用户A的接收线程
//用户A的接收端口号 来自用户B的提示信息
new Thread(new TalkReceive(8888,"用户B")).start();
}
}
客户端B
package com.hkd.chat;
/**
* 用户B的客户端
*/
public class TalkB {
public static void main(String[] args) {
//用户B的两个线程
//1.用户B的发送线程
// 参数 来自用户B的5555端口号 用户A的地址 用户A的接受端口号
new Thread(new TalkSend(5555,"localhost",8888)).start();
//2.用户B的接收线程
//用户B的接收端口号 来自用户A的提示信息
new Thread(new TalkReceive(9999,"用户A")).start();
}
}
三、URL下载网络资源
URl:统一资源文件符、定位互联网上的某一个资源
- 协议://
- DNS域名解析:将www.baidu.com转化为110.242.68.4ip地址的过程
了解一下URL这个类
package com.hkd.chat;
import java.net.URL;
public class URLDemo1 {
public static void main(String[] args) throws Exception {
URL url=new URL("http://localhost:8080/helloworld/index.jsp?username=lxl&password=123456");
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());//参数
}
}
开始测试
测试一 下载tomcat本地服务器的资源
- 打开tomcat,bin目录下的startup.bat,启动服务
- 在webapps创建一个urlDemo1文件夹,在里面新建一个test1.txt文本文档
- 然后我们在idea里面通过java的类下载下来这个文本文档
package com.hkd.chat;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLDemo2 {
public static void main(String[] args) throws Exception {
//1.下载地址
URL url=new URL("http://localhost:8080/urlDemo1/test1.txt");
//2.连接到这个资源 HTTP
HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
InputStream is=urlConnection.getInputStream();
FileOutputStream fos=new FileOutputStream("test1.txt");
byte[] bytes=new byte[1024];
int len;
while ((len=is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//关闭资源
fos.close();
is.close();
urlConnection.disconnect();
}
}
测试二 下载网络资源
我是直接下载网易云的音乐资源,当然是免费的资源才行
- 打开网易云官网,打开审查元素的网络,点击一个歌曲播放
- 找到.m4a文件或者其他歌曲格式文件,在新标签页打开测试能否播放
- 可以的话,复制链接
- 开始写java类
package com.hkd.chat;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLDemo2 {
public static void main(String[] args) throws Exception {
//1.下载地址
URL url=new URL("http://localhost:8080/urlDemo1/test1.txt");
//2.连接到这个资源 HTTP
HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
InputStream is=urlConnection.getInputStream();
FileOutputStream fos=new FileOutputStream("test1.txt");
byte[] bytes=new byte[1024];
int len;
while ((len=is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//关闭资源
fos.close();
is.close();
urlConnection.disconnect();
}
}
发现已经下载下来了