文档章节

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
南昌
程序员
一句话讲清楚什么是JavaEE

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

qq58edeba279279
06/26
0
0
一句话讲清楚什么是JavaEE

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

qq592fbb5b34ad7
07/02
0
0
什么是Java语言?java语言简介

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

阿秀a
2010/10/19
0
0
学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖
06/10
0
0
五本值得一读的超棒Java电子书(附下载)

http://www.itwaka.com/ 网络上有很多关于Java的免费电子书,但是大多数都是过时的或者是不准确的。这是说的Java免费电子书是我收藏中最好的五本,它们在使用 Java编程语言的人群中是出名的,...

itwaka
2011/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
0
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
0
0
学习设计模式——中介者模式

1. 认识中介者模式 1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。 2. 结构: Mediator:中介者...

江左煤郎
昨天
0
0
深入理解Plasma(1):Plasma 框架

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章作为开篇,主要目的是理解 Plasma 框架。 Plasma 作为以太坊的二层扩容...

HiBlock
昨天
0
0
Java 8 日期 示例

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需...

阿刚ABC
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部