文档章节

Java---网络编程

汪小昕
 汪小昕
发布于 2016/01/27 17:24
字数 1589
阅读 79
收藏 5
点赞 2
评论 0

    谈起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架构师的书籍推荐!

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想...

欧阳海阳
07/16
0
0
五本值得一读的超棒Java电子书(附下载)

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

itwaka
2011/06/27
0
0
Java程序员必读书单,家族又添新成员

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

异步社区
05/09
0
0
用RMI实现基于Java的分布式计算(1)

向您介绍使用RMI实现Java的分布式计算。由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络Java分布式应用的时候,可以用它自身的机制实现分布式计算。 概述 随...

山哥
2012/02/24
0
0
操作系统,windows编程,网络,socket

首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改。 这十几天学了点关于操作系统、windows编程和网络,主要看的书有...

祁达方
2015/11/11
0
0
《Java从小白到大牛精简版》之第1章 开篇综述

Java诞生到现在已经有20多年了,但是Java仍然是非常热门的编程语言之一,很多平台中使用Java开发。表1-1所示的是TIOBE社区发布的2016年5月和2017年5月的编程语言排行榜,可见Java语言的热度,...

tony关东升
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部