public class Client {
/*
* public static void main(String[] args) throws IOException {
//创建客户端对象
DatagramSocket ds = new DatagramSocket();
//字符串
String str = "i am client";
//准备报文对象
DatagramPacket dp =new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("192.168.54.2"), 8888);
//客户端发送报文对象
ds.send(dp);
//关闭资源
ds.close();
}
*/
public static void main(String[] args) throws IOException {
//准备一个ip数组
String[] ips = {"192.168.54.2","192.168.54.19","192.168.54.29"};
//循环
for (String ip : ips) {
//调用send
send(ip);
}
}
//写个方法循环发送
public static void send(String ip) throws IOException {
//创建客户端对象
DatagramSocket ds = new DatagramSocket();
//字符串
String str = "i am client 888";
//准备报文对象
DatagramPacket dp =new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(ip), 8888);
//客户端发送报文对象
ds.send(dp);
//关闭资源
ds.close();
}
}
/*
* 利用TCP程序写一个聊天室,提示 服务端
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建服务端套接字对象
ServerSocket ss = new ServerSocket(8888);
//死循环
while(true) {
//接收客户端套接字对象
Socket s = ss.accept();
//获得输入流对象
InputStream is = s.getInputStream();
int len;
byte[] b = new byte[1024];
//循环写字符串
while((len = is.read(b))>0) {
System.out.println(new String(b,0,len));
}
//关闭客户端
is.close();
s.close();
}
}
}
上传
模拟,因为tcp编程做不到接收客户端自定义上传的文件,所以服务端这边写出去的文件也只能是写死的文件名。
逻辑:
1 客户端创建套接字对象,获取输入流(读取本地文件),获得输出流(向服务器上传)
/*
* 上传方
*/
public class Client {
public static void main(String[] args) throws IOException {
/*
客户端创建套接字对象,,获得输出流(向服务器上传)
*/
Socket s = new Socket(InetAddress.getLocalHost(), 8888);
//try ... with ...resource 在小括号定义流对象,这种写法不再需要,也无须担心finally释放资源忘记写
try(InputStream is = new FileInputStream("C:\\work\\第一阶段\\20220228-20220304\\0228(网络编程)\\作业\\作业.txt");
//套接字获得输出流
OutputStream os = s.getOutputStream();
) {
//常规io *** 作
int len;
byte[] b = new byte[1024];
//while循环
while((len = is.read(b)) > 0) {
//往服务器写
os.write(b, 0, len);
}
//提示
System.out.println("上传文件成功...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 服务端创建服务端套按字,获取输入流对象,创建输出流对象(向机器写入文件)
public class Server {
public static void main(String[] args) throws IOException {
/*
服务端创建服务端套按字,获取输入流对象,
*/
ServerSocket ss = new ServerSocket(8888);
//获得客户端套接字
Socket s = ss.accept();
try(
//客户端获得输入流对象
InputStream is = s.getInputStream();
//创建输出流对象(向机器写入文件)
OutputStream os = new FileOutputStream("C:\\Users\\粤嵌\\Desktop\\作业.txt");
){
//常规io *** 作
int len;
byte[] b = new byte[1024];
//循环
while((len = is.read(b)) >0) {
os.write(b, 0, len);
}
System.out.println("保存成功...");
} catch (Exception e) {
e.printStackTrace();
}
//关闭资源
s.close();
ss.close();
}
}
课堂练习:
客户端上传成功的消息是服务端通知的!要接收服务器响应的消息
public static void main(String[] args) throws IOException {
//客户端创建套接字对象,,获得输出流(向服务器上传)
Socket s = new Socket(InetAddress.getLocalHost(), 8888);
//try ... with ...resource 在小括号定义流对象,这种写法不再需要,也无须担心finally释放资源忘记写
try(InputStream is = new FileInputStream("C:\\work\\第一阶段\\20220228-20220304\\0228(网络编程)\\作业\\作业.txt");
//套接字获得输出流
OutputStream os = s.getOutputStream();
) {
//常规io *** 作
int len;
byte[] b = new byte[1024];
//while循环
while((len = is.read(b)) > 0) {
//往服务器写
os.write(b, 0, len);
}
//告诉服务器,客户端这边输出已经结束了,不写,两边的线程都会阻塞,无法结束
s.shutdownOutput();
//获取输入流
InputStream s_is = s.getInputStream();
int len2;
//循环
while((len2 = s_is.read(b)) > 0) {
System.out.println(new String(b,0,len2));
}
s_is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
提示:客户端上传后,要关闭输出流对象(打标志),再通过客户端获得输入流对象(接收消息用)
public static void main(String[] args) throws IOException {
/*服务端创建服务端套按字,获取输入流对象, */
ServerSocket ss = new ServerSocket(8888);
//获得客户端套接字
Socket s = ss.accept();
try(
//客户端获得输入流对象
InputStream is = s.getInputStream();
//创建输出流对象(向机器写入文件)
OutputStream os = new FileOutputStream("C:\\Users\\粤嵌\\Desktop\\作业2.txt");
){
//常规io *** 作
int len;
byte[] b = new byte[1024];
//循环 //客户端写了一行s.shutdownOutput(); -1标志就有了
while((len = is.read(b)) >0) {
os.write(b, 0, len);
}
//往客户端发送消息
OutputStream s_os = s.getOutputStream();
s_os.write("文件上传成功".getBytes());
s_os.close();
} catch (Exception e) {
e.printStackTrace();
}
//关闭资源
s.close();
ss.close();
}
TCP通信模型
课堂练习:
完成下载的代码编写
public class Client {
public static void main(String[] args) throws IOException {
//创建客户端套接字对象
Socket s = new Socket(InetAddress.getLocalHost(), 8888);
try(
//获得客户端的输入流对象
InputStream is = s.getInputStream();
//创建输出流对象,保存
OutputStream os = new FileOutputStream("C:\\work\\第一阶段\\20220228-20220304\\0301(网络编程)\\不如跳舞.m4a")
){
int len;
byte[] b = new byte[1024];
//循环
while((len = is.read(b)) >0) {
os.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
//关闭资源
s.close();
}
}
public class Server {
/*
public static void main(String[] args) throws IOException {
//创建服务端的套接字对象
ServerSocket ss = new ServerSocket(8888);
//while
while(true) {
//获得客户端
Socket s = ss.accept();
//客户端的输出流对象
try(OutputStream os = s.getOutputStream();
//读一个文件的输入流
InputStream is = new FileInputStream("C:\\Users\\粤嵌\\Desktop\\123.m4a");
){
//循环写出去
int len;
byte[] b = new byte[1024];
while((len = is.read(b)) >0) {
os.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
*/
public static void main(String[] args) throws IOException {
//创建服务端的套接字对象
ServerSocket ss = new ServerSocket(8888);
//while
while(true) {
//获得客户端
Socket s = ss.accept();
//创建下载线程对象
Download d = new Download(s);
//借助Thread构造器
Thread t = new Thread(d);
//启动线程
t.start();
}
}
}
public class Download implements Runnable{
//Socket对象
private Socket s;
//对已有的对象进行增强,装饰者模式
public Download(Socket s) {
this.s = s;
}
@Override
public void run() {
//客户端的输出流对象
try(OutputStream os = s.getOutputStream();
//读一个文件的输入流
InputStream is = new FileInputStream("C:\\Users\\粤嵌\\Desktop\\123.m4a");
){
//循环写出去
int len;
byte[] b = new byte[1024];
while((len = is.read(b)) >0) {
os.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
URL
URL
表示统一资源定位符,指向万维网上的“资源”的指针 我们日常生活中,给个链接,给个URL
访问某东:【N-ZONES7】NZONE S7 双5G全网通手机 5000mAh大电池 22.5W疾速快充 青山翠 6GB+128GB 双卡双待手机 华为智选【行情 报价 价格 评测】-京东
构造器:URL(String str) 构建一个URL对象
方法: openConnection()
URLDecoder解码
URLEncoder
编码
public class DecoderAndEncoder {
public static void main(String[] args) throws IOException {
//字符串
String s = "中国";
//编码
String encode = URLEncoder.encode(s, "utf-8");
System.out.println("中国编码后:" + encode);
System.out.println("ie浏览编码:%E4%B8%AD%E5%9B%BD");
System.out.println("******************");
//模拟后台对编码后的字符进行解码
String s2 = "%E4%B8%AD%E5%9B%BD";
//解码对象.解码(字符串,编码格式)
String decode = URLDecoder.decode(s2, "utf-8");
System.out.println("解码后:" + decode);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)