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系列博客,喜欢就关注吧!                            ----知飞翀

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值