Day 23

08 Udp接收端
09 Udp键盘录入数据方式
10 Udp聊天
11 TCP传输
12 TCP传输2
13 TCP练习
14 TCP复制文件

08 Udp接收端

需求:
定义一个应用程序,用于接收udp协议传输的数据并处理。

思路:
1.定义UdpSocket服务。
2.定义一个数据报包,因为要存储接收到的字节数据,
而数据报包对象中有更多的功能可以提取字节数据中不同的数据信息。
3.通过socket服务的receive方法将接收到的数据存入已经定义好的数据报包中。
4.通过数据报包对象的特有功能。将这些不同的数据取出,打印在控制台上。
5.关闭资源。

 import java.net.*;
public class UdpReceive
{
public static void main(String[] args)
{
try
{
//1.创建Udp Socket,建立端点
DatagramSocket ds=new DatagramSocket(10000); //2.定义数据报包,用来存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length); //3.通过Socket服务的receive方法接收到的数据存入数据包
ds.receive(dp); //通过数据报包中的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort(); System.out.println(ip+"::"+data+"::"+port);
//关闭资源
ds.close(); }
catch (Exception e)
{
e.printStackTrace();
} }
}

09 Udp键盘录入数据方式

read和receive都是阻塞式方法,如果接收不到数据,就会等待。

java.net包和java.io包通常一起使用。

测试程序如下:

 public class UdpSend2
{
public static void main(String[] args) throws IOException
{
DatagramSocket ds=new DatagramSocket(10001);
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
byte[] buf=line.getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10000);
ds.send(dp);
}
ds.close();
}
}
 import java.net.*;
import java.io.*;
public class UdpReceived2
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(10000);
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(buf,0,dp.getLength());
System.out.println(ip+"::"+data);
} }
}

10 Udp聊天

实现简单的聊天功能,以ip地址辨别不同身份。

 /*
聊天
*/
import java.net.*;
import java.io.*;
class Send implements Runnable
{
private DatagramSocket s;
public Send(DatagramSocket s)
{
this.s=s;
}
public void run()
{
try
{
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null)
{
if("over".equals(line))
break;
byte[] buf=line.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("172.29.115.1"),10005);
s.send(dp); }
}
catch (Exception e)
{
throw new RuntimeException("发送端失败!"); }
}
}
class Receive implements Runnable
{
private DatagramSocket s;
public Receive(DatagramSocket s)
{
this.s=s;
}
public void run()
{
try
{
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
s.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data); }
}
catch (Exception e)
{
throw new RuntimeException("接受端失败!"); }
}
}
public class ChatDemo
{
public static void main(String[] args)throws Exception
{
DatagramSocket send=new DatagramSocket();
DatagramSocket rece=new DatagramSocket(10005); new Thread(new Send(send)).start();
new Thread(new Receive(rece)).start();
} }

11 TCP传输

TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据传输
关闭Socket
同样,服务器端和客户端是两个独立的应用程序。

 /*
需求:给服务器端发送一个文本数据
步骤:
1.创建Socket服务,并指定要连接的主机和端口
*/
import java.net.*;
import java.io.*;
class TcpClient
{
public static void main(String[] args)
{
try
{
//创建客户端的Socket服务,指定目的主机和端口
Socket s=new Socket("127.0.0.1",10000); //为了发送数据,应该获取Socket中的输出流。
OutputStream out=s.getOutputStream(); out.write("hahaha".getBytes());
s.close(); }
catch (Exception e)
{
throw new RuntimeException("客户端建立失败!");
} }
}
/*
需求:定义端点接收数据并打印在控制台。
服务端:
1.建立服务端的socket服务,ServerSocket();
并监听一个端口
2.获取连接过来的客户端对象。
通过ServerSocket的accept方法。
没有连接,就一直等待,所以这是一个阻塞式方法。
3.客户端如果发送来数据,那么服务端要使用对应的客户端对象,并获取到该客户端
对象的读取流来读取发过来的数据。
4.关闭服务端。
*/
class TcpServer
{
public static void main(String[] args)
{
try
{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress(); InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.print(ip+":");
System.out.println(new String(buf,0,len)); s.close(); }
catch (Exception e)
{
throw new RuntimeException("服务端建立失败!");
} }
}

12 TCP传输2

演示tcp的传输的客户端和服务端的互访
需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

客户端:
1.建立socket服务。指定要连接主机和端口。
2.获取socket流中的输出流。将数据写到该流中,通过网络发送给服务端。
3.获取socket流中的输入流,将服务器反馈的数据获取到,并打印。
4.关闭客户端。

 import java.net.*;
import java.io.*;
class TcpClient2
{
public static void main(String[] args)
{
try
{
Socket s=new Socket("172.29.115.1",10000);
OutputStream os=s.getOutputStream();
os.write("你好啊,服务端!".getBytes()); byte[] buf=new byte[1024];
InputStream is=s.getInputStream();
int len=is.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
catch (Exception e)
{
throw new RuntimeException("客户端建立失败!");
} }
}
class TcpServer2
{
public static void main(String[] args)
{
try
{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept(); InputStream is=s.getInputStream();
byte[] buf=new byte[1024];
int len=is.read(buf);
System.out.println(s.getInetAddress().getHostAddress()+"::"+new String(buf,0,len)); OutputStream os=s.getOutputStream();
os.write("你也好,欢迎光临!".getBytes()); s.close();
ss.close(); }
catch (Exception e)
{
throw new RuntimeException("服务端建立失败!");
}
}
}

13 TCP练习

需求:建立一个文本形式转换服务器。
客户端给服务端发送文本,服务端会将文本转换成大写再返回给服务端。
而且,客户端可以不断地进行文本发送,当客户端输入over时,转换结束。

分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并且按照io的操作规律来思考。
源:键盘录入
目的:网络设备,网络输出流
而且操作的是文本数据,可以选择字符流。

步骤:
1.建立服务
2.获取键盘录入
3.将数据发送给服务端
4.接受服务端返回的大写数据
5.结束,关闭资源。

 import java.net.*;
import java.io.*;
class TransClient
{
public static void main(String[] args) throws Exception
{
//建立socket服务
Socket s=new Socket("172.29.115.1",10000);
//获取键盘录入
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//向服务端发送数据
BufferedWriter bufOut=
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line=null;
//接受服务端返回的数据
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush(); String str=bufIn.readLine();
System.out.println("server:"+str); }
bufr.close();
s.close(); }
}
class TransServer
{
public static void main(String[] args) throws Exception
{
//建立服务
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept(); //接受客户端的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); //返回给客户端大写的文本
BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line=null; while((line=bufIn.readLine())!=null)
{
System.out.println(line);
bufOut.write(line.toUpperCase());
bufOut.newLine();
bufOut.flush();
} ss.close(); }
}

14 TCP复制文件

从客户端向服务端上传文件。

 import java.net.*;
import java.io.*;
class TextClient
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("127.0.0.1",10006);
BufferedReader bufr=
new BufferedReader(new FileReader("ChatDemo.java"));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
s.shutdownOutput();
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=bufIn.readLine();
System.out.println("server:"+str);
bufr.close();
s.close(); }
}
class TextServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10006);
Socket s=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"....connected");
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);
String line=null;
while((line=bufIn.readLine())!=null)
{
out.println(line); }
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功!"); s.close();
ss.close();
out.close(); }
}

网络编程2--毕向东java基础教程视频学习笔记的更多相关文章

  1. 多线程--毕向东java基础教程视频学习笔记

    目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...

  2. 网络编程1--毕向东java基础教程视频学习笔记

    目录: 01 网络编程概述1 02 网络编程概述2 03网络编程 网络模型 04网络编程 IP地址 05网络编程 TCP和UDP 06网络编程 Socket 07网络编程 UDP发送端 01 网络编程 ...

  3. 网络编程4--毕向东java基础教程视频学习笔记

    Day24 06 自定义浏览器-Tomcat服务端07 自定义图形界面浏览器-Tomcat服务端08 URL-URLConnection09 小知识点10 域名解析 06 自定义浏览器-Tomcat服 ...

  4. 网络编程3--毕向东java基础教程视频学习笔记

    Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...

  5. IO流05--毕向东JAVA基础教程视频学习笔记

    Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...

  6. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...

  7. IO流01--毕向东JAVA基础教程视频学习笔记

    提要 01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通过缓冲区复制文本文件)04 IO流(readLine的原理)05 IO流(MyBuffer ...

  8. 集合3--毕向东java基础教程视频学习笔记

    Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...

  9. 集合2--毕向东java基础教程视频学习笔记

    Day14 08 LinkedList09 LinkedList练习10 ArrayList练习11 ArrayList练习2 12 HashSet13 HashSet存储自定义对象14 HashSe ...

随机推荐

  1. "Hello World!" for the NetBeans IDE

    "Hello World!" for the NetBeans IDE It's time to write your first application! These detai ...

  2. 第 28 章 CSS3 多列布局

    学习要点: 1.早期多列问题 2.属性及版本 3.属性解释 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的多列布局,通过多列布局我们方便的创建流体的多列布局. 一.早期多列问题 我们 ...

  3. [moka同学笔记]window下.htacess文件 与linux下.htacess文件

    windows下 # Turn on URL rewritingRewriteEngine On# Installation directoryRewriteBase /# Protect hidde ...

  4. 03Mybatis_mybatis框架原理——执行流程

    mybatis的框架的原理(执行流程).

  5. js的动态加载、缓存、更新以及复用(四)

    本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...

  6. javascript模式 (3)——工厂模式和装饰模式

    上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...

  7. 关于HTML面试题汇总之H5

    一.H5有哪些新特性,移除了哪些元素?如何处理h5新标签的浏览器兼容性问题,如何区分html和html5 1. html5不在是SGL(通用标记语言)的一个子集,而包含了:图像.位置.存储.多任务等功 ...

  8. MontageJS:构建现代 Web App 的 HTML5 框架

    MontageJS 可以帮助您构建高可扩展性和可维护性的 HTML5 应用.有了 MontageJS,开发人员可以创建可重用的用户界面组件和模块,组件和控制器之间的绑定属性,并且同步 DOM 查询和更 ...

  9. ABAP中的Table Control编程

          SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑.       简单来说,Table Control是一组屏幕元素在Screen上的重 ...

  10. ABAP中RETURN与EXIT语句的区别

    EXIT:1) EXIT如果出现在循环中,退出的是整个循环操作,.程序会从循环结束处开始继续执行,其作用相当于Java与C++中的break.2)EXIT如果出现在循环之外,退出的是当前执行的程序块( ...