1 网络模型

2 网络通讯要素

IP

网络中的标识

本地回环地址:127.0.01 主机名 localhost

端口

用于标识进程的逻辑地址,不同的进程的标识

有效的端口0-65535  0-1024系统使用或保留端口

传输协议

通讯的规则

常见协议:TCP UDP

UDP:对讲机

TCP:打电话

3 域名解析

4 UDP

1,发送时,创建待了送数据包pack,其中指定目标主机的ip地址和接收的端口

调用DatagemSocket的send(pack)方法发送pack数据报,发送端口由java绑定一个可用的端口

2,接收时,创建指定的端口的DatagramScoket调用基receve(pack)方法招收数据报接收的数据存放在pack包的缓冲区中,在调用pack.getData()方法获得里面的数据

接收方必须指定接收端口,该接收端口正是发送数据包中指定的端口,而发送端口可以是任意一个可用的端口

发送

/** 思路:

* 1,建立udp的socket服务,

* 2,将要发送的数据封装支数据包中去

* 3,通过udp的socket服务将数据包发送出去

* 4,关闭socket服务

*

**/System.out.println("发送端启动");

DatagramSocket ds= newDatagramSocket();

String str= "我来了";byte [] buf =str.getBytes();

DatagramPacket dp=

new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);

ds.send(dp);

ds.close();

接收

/** 接收端

* 思路:

* 1,建立scoket服务,因为要接收数据,必须要明确端口号

* 2,创建数据包,用于存储接收到的数据,方便解析

* 3.使用scoket服务的receive方法接收的数据存储到数据包中

* 4,通过数据包的方法解析数据包的数据

* 5.关闭资源

*

**/System.out.println("接收启动");//建立 udp scoket服务

DatagramSocket ds = new DatagramSocket(10000);//创建数据包

byte [] buf = new byte[1024];

DatagramPacket dp= newDatagramPacket(buf,buf.length);//使用接收方法

ds.receive(dp);//通过数据包的方法.解析数据.比如:地址,端口,数据内容

String ip =dp.getAddress().getHostAddress();int port =dp.getPort();

String text= new String (dp.getData(),0,dp.getLength());

System.out.println(ip+":"+port+":" +text);

ds.close();

5 聊天程序

发送端

DatagramSocket ds = newDatagramSocket();//加上键盘录入

BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));

String line= null;while((line = bufr.readLine())!= null){byte [] buf =line.getBytes();

DatagramPacket dp=

new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10001);

ds.send(dp);if("over".equals(line))break;

}

接收端

Whlie循环,让它一直接收

上面是两个进程的工作,还要切换进程 ,可以创建两个线程,让它在五一个

进程中.这时要用到线程技术

发送端

classTest implements Runnable {privateDatagramSocket ds;publicTest (DatagramSocket ds){this.ds=ds;

}

@Overridepublic voidrun() {try{

System.out.println("发送端启动");//加上键盘录入

BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));

String line= null;while((line = bufr.readLine())!= null){byte [] buf =line.getBytes();

DatagramPacket dp=

new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10002);

ds.send(dp);if("over".equals(line))break;

}

ds.close();

}catch(Exception e){

}

}

}

接收端

public classTest2 implements Runnable {privateDatagramSocket ds ;publicTest2(DatagramSocket ds){this.ds=ds;

}

@Overridepublic voidrun() {try{while(true){

System.out.println("接收启动");//建立 udp scoket服务//创建数据包

byte [] buf = new byte[1024];

DatagramPacket dp= newDatagramPacket(buf,buf.length);//使用接收方法

ds.receive(dp);//通过数据包的方法.解析数据.比如:地址,端口,数据内容

String ip=dp.getAddress().getHostAddress();int port =dp.getPort();

String text= new String (dp.getData(),0,dp.getLength());

System.out.println(ip+":"+port+":" +text);

}

}catch(Exception e){

}

}

}

数据测试

public static voidmain(String[] args) throws SocketException {

DatagramSocket send= newDatagramSocket();

DatagramSocket rec= new DatagramSocket(10002);

Test s= newTest (send);

Test2 r= newTest2(rec);newThread(s).start();new Thread(r).start();

6 TCP

客户端

//tcp传输.客户端建立过程

/**

* 1,创建tcp 客户端socket服务,使用的是scoket对象

* 2.如果连接建立成功,说明数据通道连接成功

* 可以通过getOutputSteam() 和getInputStream来获取两个字节流

* 3, 使用输出流 或者输入流

*

**/

//创建客户端服务

Socket socket= new Socket("127.0.0.1",20000);//获取流

OutputStreamout =socket.getOutputStream();//使用输出流将指定的数据写出去

out.write("人的家".getBytes());//关闭资源

socket.close();

服务端

public static voidmain(String[] args) throws IOException {/** 建立tcp服务端折思路

* 1,创建服务端socket服务,通过serverSocket对象

* 2,服务端必须提供一个端口,否则客户端无法连接

* 3, 获取连接过来的客户端对象

* 4,通过客户端对象获取 socket流读取客户端发来的数据

* 5.关闭资源,关客房端,关服务端

*

**/ServerSocket ss= new ServerSocket(20000);

Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();

InputStreamin =s.getInputStream();byte [] buf = new byte [1024];int len = in.read(buf);

String text=new String (buf,0,len);

System.out.println("server:"+text);

System.out.println(ip);

s.close();

ss.close();

}

7 文本转换

易错点:

1,结束标记的原理

2,当遇到上传过程中,会发生都在阻塞状态,

文本转换-客户端

public classTransClient {/**

* @param args

* @throws IOException

* @throws*/

public static voidmain(String[] args) throws IOException {

System.out.println("客户端运行......");//客户端://步骤://1,创建socket,明确地址和端口。

Socket s= new Socket("192.168.1.223", 10005);//2,源:键盘录入。获取需要转换的数据。

BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));//3,目的:网络,socket输出流。将录入的数据发送到服务端。//OutputStream out = s.getOutputStream();//既然都是字符数据,为了便于操作,使用额外功能,转换。同时提高效率。//BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out));可以使用打印流

PrintWriterout = new PrintWriter(s.getOutputStream(),true);//4,源:socket,socket读取流,读取服务端发回来的大写数据。//InputStream in = s.getInputStream();

BufferedReader bufIn= new BufferedReader(newInputStreamReader(s.getInputStream()));//5,目的:客户端显示器,将大写数据显示出来。直接使用输出语句。//6,频繁的读写操作。

String line= null;while((line=bufr.readLine())!=null){//将读取键盘的数据发送到服务端。

out.println(line);//out.flush();

if("over".equals(line)){break;

}//读取服务端返回的数据。

String upperText=bufIn.readLine();

System.out.println(upperText);

}//7,关闭资源。

s.close();

}

}

文本转换-服务端

public classTransServer {/**

* @param args

* @throws IOException*/

public static voidmain(String[] args) throws IOException {

System.out.println("服务端运行....");//服务端://思路://1,创建服务端socket 明确端口。

ServerSocket ss= new ServerSocket(10005);while (true) {//获取客户端对象。

Socket s=ss.accept();

System.out.println(s.getInetAddress().getHostAddress()+".....connected");//2,源:socket输入流。读取客户端的发过来的数据。

BufferedReader bufIn= new BufferedReader(newInputStreamReader(

s.getInputStream()));//3,目的:socket输出流。将转成大写的数据发送给客户端。

PrintWriterout = new PrintWriter(s.getOutputStream(),true);//4,频繁的读写操作。

String line= null;while ((line = bufIn.readLine()) != null) {if("over".equals(line)){//如果客户端发过来的是over,转换结束。

break;

}

System.out.println(line);//将读取到的字母数据转成大写,发回给客户端。

out.println(line.toUpperCase());//out.flush();

}//5,关闭客户端。

s.close();

}

}

}

8 上传文件

易错点:

1结束标记的原理

客户端

public static voidmain(String[] args) throws UnknownHostException, IOException {

System.out.println("上传文件客户端运行......");//客户端://步骤://1,创建socket,明确地址和端口。

Socket s= new Socket("192.168.1.223", 10006);//2,源:读取文本文件。获取需要转换的数据。

BufferedReader bufr= new BufferedReader(new FileReader("tempfile\\client.txt"));//3,目的:网络,socket输出流。将录入的数据发送到服务端。

PrintWriterout = new PrintWriter(s.getOutputStream(),true);//4,频繁的读写操作。

String line= null;while((line=bufr.readLine())!=null){out.println(line);

}//给服务端发送一个结束标记。这个标记是约定标记。有点麻烦。可以更简单。使用socket对象的shutdownOutput();//out.println("over");

s.shutdownOutput();//向服务端发送了结束标记。可以让服务端结束读取的动作。//5,源:socket,socket读取流,读取服务端发回来的上传成功信息。

BufferedReader bufIn= new BufferedReader(newInputStreamReader(s.getInputStream()));

String info=bufIn.readLine();

System.out.println(info);//6,关闭资源。

bufr.close();

s.close();

}

服务器端

public static voidmain(String[] args) throws IOException {

System.out.println("上传文本服务端运行....");//服务端://思路://1,创建服务端socket 明确端口。

ServerSocket ss= new ServerSocket(10006);while (true) {//获取客户端对象。

Socket s=ss.accept();

System.out.println(s.getInetAddress().getHostAddress()+".....connected");//2,源:socket输入流。读取客户端的发过来的数据。

BufferedReader bufIn= new BufferedReader(newInputStreamReader(

s.getInputStream()));//3,目的:文件。

PrintWriter pw= new PrintWriter(new FileWriter("tempfile\\server.txt"),true);//4,频繁的读写操作。

String line= null;while ((line = bufIn.readLine()) != null) {//if("over".equals(line)){//break;//}

pw.println(line);

}//5,发回给客户端上传成功字样。

PrintWriterout = new PrintWriter(s.getOutputStream(),true);out.println("上传成功");//6,关闭客户端。

s.close();

}

}

9 字符流不可以传输媒体文件

有可能你在查表时不能查到,造成你你原来文件和转换后的不一样.

比如下面图片里面的”1122”,查不到,那么表会给他一个默认的编码”1122”

10 上传图片

客户端

上面图片要用到字节流public static voidmain(String[] args) throws IOException {

System.out.println("上传图片客户端运行......");//1,创建socket。

Socket s= new Socket("192.168.1.223", 10007);//2,读取源图片。

File picFile= new File("tempfile\\1.jpg");

FileInputStream fis= newFileInputStream(picFile);//3,目的是socket 输出流。

OutputStreamout =s.getOutputStream();byte[] buf = new byte[1024];int len = 0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);

}//告诉服务器端图片数据发送完毕,不要等着读了。

s.shutdownOutput();//读取上传成功字样。

InputStreamin =s.getInputStream();byte[] bufIn = new byte[1024];int lenIn = in.read(bufIn);

System.out.println(new String(bufIn,0,lenIn));//关闭。

fis.close();

s.close();

}

服务端

String ip =s.getInetAddress().getHostAddress();

System.out.println(ip + ".....connected");//读取图片数据。

InputStreamin =s.getInputStream();//写图片数据到文件。

File dir= new File("e:\\uploadpic");if (!dir.exists()) {

dir.mkdir();

}//为了避免覆盖,通过给重名的文件进行编号。

int count = 1;

File picFile= new File(dir, ip + "(" + count + ").jpg");while(picFile.exists()) {

count++;

picFile= new File(dir, ip + "(" + count + ").jpg");

}

FileOutputStream fos= newFileOutputStream(picFile);byte[] buf = new byte[1024];int len = 0;while ((len = in.read(buf)) != -1) {

fos.write(buf,0, len);

}//给客户端一个回馈信息。

OutputStreamout =s.getOutputStream();out.write("上传成功".getBytes());//关闭资源。

fos.close();

s.close();

解决重名覆盖问题

//为了避免覆盖,通过给重名的文件进行编号。

int count = 1;

File picFile= new File(dir, ip + "(" + count + ").jpg");while(picFile.exists()) {

count++;

picFile= new File(dir, ip + "(" + count + ").jpg");

}

解决并发问题

public voidrun() {try{

String ip=s.getInetAddress().getHostAddress();

System.out.println(ip + ".....connected");//读取图片数据。

InputStreamin =s.getInputStream();//写图片数据到文件。

File dir= new File("e:\\uploadpic");if (!dir.exists()) {

dir.mkdir();

}//为了避免覆盖,通过给重名的文件进行编号。

int count = 1;

File picFile= new File(dir, ip + "(" + count + ").jpg");while(picFile.exists()) {

count++;

picFile= new File(dir, ip + "(" + count + ").jpg");

}

FileOutputStream fos= newFileOutputStream(picFile);byte[] buf = new byte[1024];int len = 0;while ((len = in.read(buf)) != -1) {

fos.write(buf,0, len);

}//给客户端一个回馈信息。

OutputStreamout =s.getOutputStream();out.write("上传成功".getBytes());//关闭资源。

fos.close();

s.close();

}catch(IOException e) {

}

}

11 Http

演示二:

客户端:浏览器。

服务端:自定义的服务端 myServer

看到了如下信息:

HTTP的请求消息:请求头+请求体,中间有空行。

GET /myweb/1.html HTTP/1.1 // 请求行:请求方式   访问资源的路径  HTTP协议版本。

Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

Host: 192.168.1.223:9090

Connection: Keep-Alive

空行

请求体

演示三:模拟一个浏览器。

客户端:自定义的浏览器。

服务端:Tomcat

发送和IE相同的HTTP协议的消息,收到了Tomcat服务器返回的数据。

HTTP的应答消息:

HTTP/1.1 200 OK  //应答行  http协议版本  应答状态码  应答描述信息

Server: Apache-Coyote/1.1

Accept-Ranges: bytes

ETag: W/"467-1374891778953"

Last-Modified: Sat, 27 Jul 2013 02:22:58 GMT

Content-Type: text/html

Content-Length: 467

Date: Sun, 01 Sep 2013 07:26:09 GMT

Connection: close

空行

应答体

我自己定义的服务器

public static voidmain(String[] args) throws IOException {/** 自定义server 服务端

* 获取浏览器的信息。并反馈信息。*/System.out.println("my server run....");

ServerSocket ss= new ServerSocket(9090);

Socket s=ss.accept();

System.out.println(s.getInetAddress().getHostAddress()+"....connected");//读取客户端的数据。

InputStreamin =s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);

String text= new String(buf,0,len);

System.out.println(text);//给客户端回馈数据。

PrintWriterout = new PrintWriter(s.getOutputStream(),true);out.println("欢迎光临");

s.close();

ss.close();

}

模拟客户端

/** 模拟一个浏览器。发送之前IE发送的http消息。*/Socket s= new Socket("192.168.1.223",8080);//把IE的信息发送给服务端。

PrintWriterout = new PrintWriter(s.getOutputStream(),true);out.println("GET /myweb/3.html HTTP/1.1");out.println("Accept: */*");out.println("Host: 192.168.1.223:8080");out.println("Connection: close");out.println();//空行。//读取服务端的数据。

InputStreamin =s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);

String text= new String(buf,0,len);

System.out.println(text);

s.close();

12 URL对象

Url常用方法和URLConnection

*/

public static voidmain(String[] args) throws IOException {

String str_url= "http://192.168.1.223:8080/myweb/2.html";//将url地址封装成对象。

URL url= newURL(str_url);//System.out.println("getProtocol:"+url.getProtocol());//System.out.println("getHost:"+url.getHost());//System.out.println("getPort:"+url.getPort());//System.out.println("getPath:"+url.getPath());//System.out.println("getFile:"+url.getFile());//System.out.println("getQuery:"+url.getQuery());//获取指定资源的连接对象。//封装了socket。

URLConnection conn=url.openConnection();//System.out.println(conn);

InputStreamin =conn.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);

String text= new String(buf,0,len);

System.out.println(text);

}

13 HTTP1.0和HTTP1.1区别

HTTP1.0:一次连接一次请求。

HTTP1.1:一次连接多次请求。

14 常见的网络架构

C/S: client / server

特点:

1,程序员需要开发客户端和服务端。

2,维护较为麻烦。

3,将一部分运算转移到客户端来完成,减轻服务器端的压力。

B/S: browser / server

特点:

1,程序员只需要开发服务端。客户端使用系统已有的浏览器即可。

2,维护很简单。只需要维护服务端。

3,所有的运算的都在服务端。

目前流行BS

一亩田招聘java_java-网络编程相关推荐

  1. 套接字技术java_java网络编程之套接字TCP

    套接字学习 什么是套接字? 计算机网络基础知识 基于套接字的网路编程案例? 什么是套接字? 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程 ...

  2. urlconnection java_Java 网络编程:必知必会的 URL 和 URLConnection

    java.net.URL 类将 URL 地址进行了封装,并提供了解析 URL 地址的基本方法,比如获取 URL 的主机名和端口号.java.net.URLConnection 则代表了应用程序和 UR ...

  3. udp 传输文件 java_Java 网络编程 之 UDP 文件传输

    服务器端 package com.udp; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcepti ...

  4. udp java_Java实现Udp网络编程

    在看到本文之前,如果读者没看过笔者的上一个系列 Java实现Socket网络编程,建议先翻阅. 笔者将在上期Demo的基础上,进一步修改和扩展,达到本次Demo的运行效果. 首先展示Demo的演示效果 ...

  5. aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍

    从JDK 7版本开始,Java新加入的文件和网络io特性称为nio2(new io 2, 因为jdk1.4中已经有过一个nio了),包含了众多性能和功能上的改进,其中最重要的部分,就是对异步io的支持 ...

  6. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  7. 2014阿里巴巴实习生招聘-研发工程师笔试题/网络编程小结

    一.单选 1.假设一个主机ip为192.168.5.121,子网掩码为255.255.255.248,则该主机的网络号部分(包括子网号部分)为-- A.192.168.5.12  B 192.168. ...

  8. Objective-c 网络编程1 Web请求和响应

    2019独角兽企业重金招聘Python工程师标准>>> // // ViewController.m // 网络编程 // // Created by DC017 on 15/12/ ...

  9. Java网络编程——11.非阻塞I/O

    2019独角兽企业重金招聘Python工程师标准>>> 要允许CPU速度高于网络,传统的Java解决方案是缓冲和多线程.对于相对简单的服务器和客户端,如果不需要非常高的性能,这种方法 ...

最新文章

  1. 包邮送书 | 中科院博士推荐的50本高质量Python、数据分析书籍
  2. 《转》每天起床时,优秀创业者都会问自己这3个问题
  3. java中的取模_Java 中的取模和取余
  4. 云原生应用实现规范 - 初识 Operator
  5. DedeCms织梦彩色标签云(tag)随机颜色和字体大小
  6. Fedora 20 安装试用体验全程讲解
  7. 人工智能秘史(二):美国第一台计算机背后的女程序员
  8. oracle数据泵导入分区表,Oracle 10g 数据泵分区表的导出
  9. 云计算仿真框架CloudSim介绍
  10. 准备创业或刚创业的朋友必读
  11. 传输层协议(11):超时重传
  12. java引用计数法、可达性分析法、强软虚弱、强引用、软引用、弱引用、虚引用、回收方法区、finalize()方法
  13. cad直线和圆弧倒角不相切_建议收藏:史上最全CAD快捷键大全
  14. 基于51单片机的直流电机驱动(L298…
  15. koa 设置cache_nodejs cache 缓存机制的简单实现
  16. CUDA学习(四)-整体结构
  17. 1号线彭埠站故障已经查明 是积水导致转辙机信号不良
  18. SDOI2019 R2退役记
  19. Packet Tracer - 排除 VLAN 间路由故障
  20. 撩妹奇招——修改Excel单元格默认格式

热门文章

  1. Linux如何手动编译fcitx文件,linux下安装和配置fcitx中文输入法
  2. SCA、CSA、SOA比较
  3. 计算机类智能问答助手论文,写论文不用愁,AI 来当小助手
  4. ArcGIS提取面状道路中心线
  5. zzcms v8.3
  6. STM32C0介绍(1)----概述
  7. Google 谷歌 AI博客:发布Objectron 3D对象检测模型数据集
  8. 如何在线观看或直播2018年奥运会(无电缆)
  9. 数字图像处理第四章频率域滤波(低通滤波器、高通滤波器、拉普拉斯滤波、同态滤波器)
  10. Google Play开发者账号注册 信用卡绑定心得