文档章节

Java---网络编程

汪小昕
 汪小昕
发布于 2016/01/27 17:24
字数 1589
阅读 79
收藏 5

    谈起Java的网络编程,首先要了解网络通信的基本原理。

    首先要了解的是网络三要素:ip地址,端口,网络链接。 如何理解这三要素呢,例如我要去个小区找个人,那么首先我需要知道这个小区在什么地方,即ip地址。知道小区在哪里之后,就需要知道此人的家在小区的哪个地方例如几栋几室,即为端口。网络连接顾名思义,客户端与服务端需要连接需要有链接路径,如无线wifi,网线等。

    那么建立链接后,服务端与客户端如何通过链接进行彼此通信呢,就比如2座小岛可以通过船进行货物的传输,船是需要停靠在码头上来装载货物然后进行传输的。同理,网络中建立链接后同样也需要这种“码头”来装载货物。因此就提出了Socket的概念。其实网络编程也即Socket编程。

    我们知道数据有不同的格式,那么为了双方均能解析数据,因此就需要达成统一的协议,例如2个人交谈,1个只会说中文,另1个只会说英文,那么这2个人交流便会不知所云。因为他们即使能接收到对方说的话(数据),但不能了解其中的含义(无法解析)。因此,双方达成统一协议时才能进行有效的通信。目前较普遍的有UDP和TCP两种通信协议。

    UDP:User Datagram Protocl。用户数据协议。是一种不需要服务端与客户端建立连接的传输协议。当用户需要上传数据给服务端时,直接发数据,服务端收没收到不考虑。其优点是速度快,缺点便是传输不可靠。

    TCP:Transmission Control Protocl:传输控制协议。是需要服务端与客户端建立连接的传输协议。只有当2者建立连接后才能进行数据传输。优点是保证数据的传输,缺点是速度慢。

    Java中分别对2种传输协议有其对应的Socket类。对于UDP中均使用DatagramSocket进行Socket连接的建立(即建立码头)。而TCP中则对应客户端的Socket由Socket类实现,服务端的Socket由SocketServer实现。

    下面分别针对2种传输协议进行代码实现:

    UDP:实现的是客户端从控制台发送数据给服务端,服务端接收到后打印出来。并只有输入exit时才断开连接。

import java.net.*;
import java.util.Scanner;
//发送端
class SocketSend{
	public static void main(String[] args) throws Exception{
		//建立socket链接
		DatagramSocket ds = new DatagramSocket(10000);
		while(true){
			//准备数据
			Scanner sc = new Scanner(System.in);
			String str = sc.next();
			byte[] data = str.getBytes();
			//数据封包  DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
			DatagramPacket dp = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),20000);
			//发送数据
			ds.send(dp);
			//判断是否断开链接
			if(str.equals("exit"))
				break;
		}
		//关闭链接
		ds.close();
	}
}
//接收端
class SocketRece{
	public static void main(String[] args) throws Exception{
		//建立socket链接
		DatagramSocket ds = new DatagramSocket(20000);
		while(true){
			//准备数据包接收数据
			byte[] data = new byte[1024];
			DatagramPacket dp = new DatagramPacket(data,data.length);
			//通过socket的receive方法接收数据
			ds.receive(dp);
			//取出数据	
			String name = dp.getAddress().getHostName();
			String address = dp.getAddress().getHostAddress();
			String date = new String(dp.getData(),0,dp.getLength());
			int port = dp.getPort();
			
			//判断是否断开链接
			if(date.equals("exit"))
				break;
			System.out.println(name+"---"+address+"---"+date+"---"+port);
		}
		ds.close();
	}
}

    首先客户端发送数据的步骤如下:

  1. 建立Socket连接。

  2. 准备要发送的数据。

  3. 通过Socket发送数据。

    那么服务端的接收数据步骤如下:

  1. 建立Socket连接。

  2. 建立数据包装载接收过来的数据包。

  3. 读取数据包中的数据。

    那么UDP的发送与接收主要分为这几部。接下来是TCP的传输,其要实现的功能是客户端上传一个文件给服务端,服务端收到后并返回给客户端一个反馈信息。

    代码如下:

import java.net.*;
import java.io.*;

//TCP客户端
class SocketClient{
	public static void main(String[] args) throws Exception{
		//建立Socket链接
		Socket ss = new Socket("192.168.0.104",10003);
		//获取输出流,准备发送
		PrintWriter pw = new PrintWriter(ss.getOutputStream(),true);
		//准备需上传的文件
		BufferedReader br = new BufferedReader(new FileReader("D:/Java-Exercise/SocketDemo/SocketDemo.java"));
		//向流中注入数据
		String line = null;
		while((line=br.readLine())!=null){
			pw.println(line);
		}
		//关闭输出流
		ss.shutdownOutput();
		//接收是否收到服务器的反馈
		BufferedReader brback = new BufferedReader(new InputStreamReader(ss.getInputStream()));
		String back = brback.readLine();
		System.out.println(back);
		//关闭链接
		ss.close();
	}
}


//TCP服务端
class SocketServer{
	public static void main(String[] args) throws Exception{
		//建立SocketServer链接
		ServerSocket ss = new ServerSocket(10003);
		//获取链接过来的socket
		Socket s = ss.accept();
		String ip = s.getLocalAddress().getHostAddress();
		System.out.println(ip+"-------connected");
		//通过输入流读出数据
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
		//准备缓存读入接收的数据
		PrintWriter pw = new PrintWriter(new FileWriter("123.txt"),true);
		//向缓存文件中写入数据
		String data = null;
		while((data=br.readLine())!=null){
			pw.println(data);
		}
		//上传完成后向客户端进行反馈
		PrintWriter pwback = new PrintWriter(s.getOutputStream(),true);
		pwback.println("上传成功");
		
		pw.close();
		s.close();
	}
}

    那么客户端的上传文件的基本步骤如下:

  1. 建立Socket连接。

  2. 准备要上传的文件(因为上传的是文本文件,都是字符,因此使用字符流PrintWriter,需使用其println方法进行数据的刷新)。

  3. 获取Socket的输出流。

  4. 将文件写入输出流。并在文件全部写完后关闭输出流。

  5. 获取Socket的输出流,判断是否收到服务端的反馈。

    服务端的接收文件并反馈基本步骤如下:

  1. 建立Socket连接。

  2. 获取客户端的Socket对象。

  3. 通过客户端的Socket对象获取输入流。

  4. 建立新文件,装载输入流中的数据。

  5. 将输入流中的数据写入新创建的文件中。

  6. 获取客户端Socket对象的输出流。在输出流中写入反馈信息。

    TCP的传输大致如此。需要注意的便是在使用PrintWriter时需使用println方法才能成功写入。(具体原因进一步探究)。

    了解TCP上传原理后,自然也能上传图片,视频等数据文件。不过它们是字节文件需使用字节流处理。

© 著作权归作者所有

共有 人打赏支持
汪小昕
粉丝 0
博文 1
码字总数 1589
作品 0
南昌
程序员
私信 提问
什么是Java语言?java语言简介

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的W...

阿秀a
2010/10/19
0
0
一句话讲清楚什么是JavaEE

Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多的Jav...

qq58edeba279279
2018/06/26
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
2018/05/09
0
0
晒晒你看过的哪些Java相关的书。

@红薯 要我们晒Jar包 , 我倒想看看大家都看过什么Java编程相关的书籍,我先来:如下 1、iText in Action 主要内容: a、自动化静态和动态XFA表单 b、如何从XML生成动态PDF或数据库 c、如何添...

刘学炜
2012/09/27
317
4
Java面试无非也就这几个知识点,大家是否都掌握了

Java语言的关键点 掌握静态方法和属性 重视接口 学好集合框架 例外捕捉 多线程需要理解机理(多线程原理和多线程安全) 了解网络编程 不需要精通,掌握以下知识点,面试基本没有问题。 这里没有...

土豆宝
2016/08/22
9.4K
37

没有更多内容

加载失败,请刷新页面

加载更多

查询改写参数配置

参数配置有哪些选项:

Java搬砖工程师
20分钟前
2
0
elasticsearch知识点

elasticsearch基础知识: 基础知识: 1 集群: 主节点不涉及文档级别的变更或搜索 只负责索引的变更 删除 和 集群节点的加入和删除 技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 12...

geek土拨鼠
22分钟前
2
0
ECS(Entity-Component-System)

ECS是一种思想 TODO

梦想游戏人
23分钟前
1
0
Navicat使用教程:使用Navicat Premium 12自动执行数据库复制(一)

下载Navicat Premium最新版本 Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。 与...

电池盒
25分钟前
4
0
docker 新手向 - 防止容器自动退出的解决方案

本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。 docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是...

big_cat
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部