Java网络编程入门(UDP&TCP)
Java网络编程入门(UDP&TCP)
Java网络编程需要你具备文件、IO流、计算机网络等基本知识储备,本人博客下有IO编程系列博客可点击‘File&IO入门’进入阅读。下面我将以Demo驱动的方式带着大家一起入门UDP&TCP。
前期知识储备
网络编程三要素之IP概述
* 每个设备在网络中的唯一标识
* 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
* ipconfig:查看本机IP192.168.12.42
* ping:测试连接192.168.40.62
* 本地回路地址:127.0.0.1 255.255.255.255是广播地址
* IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
* IPv6:8组,每组4个16进制数。
* 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
* 1a2b::aaaa:0000:0000:0000:aabb:1f2f
* 1a2b:0000:aaaa::aabb:1f2f
* 1a2b:0000:aaaa::0000:aabb:1f2f
* 1a2b:0000:aaaa:0000::aabb:1f2f网络编程三要素之端口号概述
* 每个程序在设备上的唯一标识
* 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
* 端口号范围从0-65535
* 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
* 常用端口
* mysql: 3306
* oracle: 1521
* web: 80
* tomcat: 8080
* QQ: 4000
* feiQ: 2425网络编程三要素协议
* 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
* UDP
* 面向无连接,数据不安全,速度快。不区分客户端与服务端。
* TCP
* 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
* 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据Socket套接字概述:
* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
* 通信的两端都有Socket。
* 网络通信其实就是Socket间的通信。
* 数据在两个Socket间通过IO流传输。
* Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
Socket&Packet关系图解如下:
UDP编程入门
服务端
客户端
Demo实战
Demo题目:UDP聊天图形化界面
TCP编程入门
TCP知识储备
TCP知识储备:面向连接(三次握手),数据安全,速度略低,分为客户端和服务端。 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据。在实际的TCP编程中要抓中3次握手的特点,总是客户端——>服务端——>客户端,下面大致介绍以下TCP编程步骤:
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* 2.服务端
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流
Deom实战
Demo题目:客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串。
1.分析流程:
客户端:
*创建Socket(指定主机IP、端口号),包装输入输出流
*键盘录入生成有效File
*向服务端发送文件名
*从服务端接收文件是否存在
*若文件不存在,则上传文件
*关闭Socket与IO流
服务端:
*创建ServerSocket(指定端口号),产生Socket,包装IO流
*从客户端接收文件名
*判断文件是否已经存在,将存在与否信息传给客户端(若已经存在则关闭Socket)
*若不存在,就接收客户端上传文件
*关闭Socket
2.编程实现
(1)客户端
(2)服务端
//服务端
public static void main(String[] args) throws IOException
{
ServerSocket server=new ServerSocket(12345); //创建server
//采用多线程接收服务端数据
new Thread() {
public void run() {
Socket socket;
try
{
System.out.println("服务器启动成功。。。。。。");
socket = server.accept(); //接收客户端信息
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
FileInputStream fis=(FileInputStream) socket.getInputStream();
PrintStream ps=new PrintStream(socket.getOutputStream());
String fileName=br.readLine(); //从客户端获取文件名
File file=new File("upload");
file.mkdir();
File desFile=new File(file,fileName); //产生目标上传文件
//判断目标上传文件是否已经存在
if(desFile.exists())
{
ps.println("存在");
System.out.println("文件已经上传,请不要重复上传!");
}
else
{
ps.println("不存在");
//将客户端上传的文件写入服务端指定文件夹内
FileOutputStream fos=new FileOutputStream(desFile);
byte[] bytes=new byte[8192];
int len=0;
while((len=fis.read(bytes))!=-1) {
fos.write(bytes, 0, len);
}
fos.close();
}
//关闭socket(server一般是不关闭的)
socket.close();
//server.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}.start();
}
【注】:整个Coding过程中要注意数据传输方向,做到客户端传入服务端的数据要及时接收,防止影响之后数据上传操作!
专注Java系列博客,喜欢就关注吧! ----知飞翀