网络概述

网络模型

了解更多OSI模型和TCP/IP模型参考http://blog.csdn.net/yuliu0552/article/details/6711659

IP地址

package cn.wangyu.net;import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;import org.junit.Test;/** * @author JiangMinyan** @version 2016/02/19 10:53:30*/
public class NetTest {@Test//测试IP对象public void testInetAddress() throws UnknownHostException{//获取本机信息InetAddress localHost = InetAddress.getLocalHost();sop(localHost);System.out.println("address: " + localHost.getHostAddress());System.out.println("name: " + localHost.getHostName());fengexian();//获取任意主机信息InetAddress ia = InetAddress.getByName("192.168.21.193");sop(ia);System.out.println("address: " + ia.getHostAddress());System.out.println("name: " + ia.getHostName());fengexian();//获取任意淘宝主机信息
//      InetAddress baidu = InetAddress.getByName("www.baidu.com");InetAddress[] taobao = InetAddress.getAllByName("www.taobao.com");sop(Arrays.asList(taobao));
//      System.out.println("address: " + baidu.getHostAddress());
//      System.out.println("name: " + baidu.getHostName());}public void sop(Object obj){System.out.println(obj);}public void fengexian(){System.out.println("-------------------------------");}
}

TCP/UDP

UDP:

  将数据及源和目的封装成数据包中,不需要建立连接。
每个数据包的大小限制在64k以内
由于无连接,不可靠协议
不需要建立连接,速度快
TCP:
建立连接,形成传输数据的通道
在连接中进行大数据传输
通过三次握手进行连接,是可靠连接
(好比如大学点名,老师叫学生名字,学生起立答到,老师叫其坐下 三次握手)
必须建立连接,效率会稍低
了解更多TCP/UDPhttp://blog.csdn.net/yipiankongbai/article/details/24435977

Socket

socket就是为网络服务提供的一种机制
通信的两端都有socket
网络通信其实就是socket之间的通信
数据在两个socket之间通过IO传输
了解更多sockethttp://blog.csdn.net/zapldy/article/details/5813984

UDP传输

DataGramSocket与DatagramPacket
建立发送端,接收端
调用Socket的发送接收方法
关闭Socket
发送端与接收端是两个独立的运行程序
发送发:
package cn.wangyu.net;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @author JiangMinyan* * @version 2016/02/19 14:20:58*/
public class UDPSendSocket {/*** 需求: 通过UDP传输方式,将一段文字数据发送出去 思路: 1,简历UDPsocket服务 2,提供数据,并将数据封装到数据包中* 3,通过socket服务的发送功能,将数据包发送出去 4,关闭资源* * @throws Exception*/public static void main(String[] args) throws Exception {// 1 创建UDP服务,通过DatagramSocket对象DatagramSocket ds = new DatagramSocket(8989);// 2 确定数据,并封装成数据包byte[] buf = "udp ge men lai le ".getBytes();DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.21.158"), 7080);// 3 通过socket服务,将封装好的数据包发送出去ds.send(packet);// 4 关闭资源ds.close();}
}

接收方:

package cn.wangyu.net;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** @author JiangMinyan* * @version 2016/02/19 14:21:54*/
public class UDPReceiveSocket {/*** 需求: 用于接收udp协议传输的数据并处理 思路:* 1,定义udpsocket服务.通常会监听一个端口。其实就是给这个接受网络应用程序定义数字标识。 方便于明确那些数据过来该应用程序可以处理。* 2,定义一个数据包,因为要存储接收到的字节数据。 因为数据包对象中有更多功能可以提取字节数据中不同数据信息* 3,通过socket服务的receive方法将收到的数据存入已定义的数据包中 4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。* 5,关闭资源* * @throws Exception*/public static void main(String[] args) throws Exception {// 1 创建UDP服务,通过DatagramSocket对象DatagramSocket ds = new DatagramSocket(7080);// 2 定义数据包。用于存储数据byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);// 3 通过socket服务的receive方法将收到数据存入到数据包中ds.receive(packet);// 4 通过数据包的方法获取其中的数据String ip = packet.getAddress().getHostAddress();String data = new String(packet.getData(), 0, packet.getLength());int port = packet.getPort();System.out.println(ip + "::" + data + "::" + port);// 5 关闭资源ds.close();}
}

注意:可以开启两个Eclipse程序进行试验 或者开启两个DOS窗口 使用CMD命令。

键盘录入发送方:

package cn.wangyu.net;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @author JiangMinyan* * @version 2016/02/19 14:20:58*/
public class UDPSendSocket2 {/*** 需求: 通过UDP传输方式,将一段文字数据发送出去 思路: 1,简历UDPsocket服务 2,提供数据,并将数据封装到数据包中* 3,通过socket服务的发送功能,将数据包发送出去 4,关闭资源* * @throws Exception*/public static void main(String[] args) throws Exception {// 1 创建UDP服务,通过DatagramSocket对象DatagramSocket ds = new DatagramSocket(8989);// 2 确定数据,并封装成数据包BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = bufr.readLine()) != null){if ("886".equals(line)) break;byte[] buf = line.getBytes();DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.21.158"), 7080);// 3 通过socket服务,将封装好的数据包发送出去ds.send(packet);}// 4 关闭资源ds.close();}
}

模仿聊天小程序(UDP)

Send类:
package cn.wangyu.net;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @author JiangMinyan* * @version 2016/02/19 16:18:49*/
public class Send implements Runnable {private DatagramSocket ds;public Send(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {System.out.println("send............");try {BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = buff.readLine()) != null) {if ("886".equals(line)) {break;}byte[] bytes = line.getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.21.158"), 10005);ds.send(packet);}} catch (Exception e) {throw new RuntimeException("发送失败");}}}

Rece类:

package cn.wangyu.net;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** @author JiangMinyan* * @version 2016/02/19 16:26:33*/
public class Rece implements Runnable {private DatagramSocket ds;public Rece(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {System.out.println("rece............");try {while (true) {byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);ds.receive(packet);String ip = packet.getAddress().getHostAddress();String data = new String(packet.getData(), 0, packet.getLength());int port = packet.getPort();System.out.println(ip + "::" + data + "::" + port);}} catch (Exception e) {throw new RuntimeException("接收失败");}}}

Chat类:

package cn.wangyu.net;import java.net.DatagramSocket;/** * @author JiangMinyan** @version 2016/02/19 16:31:22*/
public class Chat {public static void main(String[] args) throws Exception {DatagramSocket send = new DatagramSocket();DatagramSocket rece = new DatagramSocket(10005);new Thread(new Send(send)).start();new Thread(new Rece(rece)).start();}
}

最好把三个文件分别在两台电脑上调式.或者开启两个eclipse改成对应IP。

TCP传输

Socket和ServerSocket

建立客户端和服务端
建立连接后,通过Socket中的IO流进行数据的传输。
关闭socket
客户端与服务端互访。
客户端:
package cn.wangyu.net;import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/** * @author JiangMinyan** @version 2016/02/22 9:56:24*/
public class TCPClient {/*** 客户端:* 通过查阅socket对象,发现在该对象建立时,就可以去连接指定的主机。* 因为TCP是面向连接的,所以在建立socket服务时,就要有服务端存在* ,并连接成功。形成通路,在该通道进行数据的传输。* * 步骤:* 1 创建socket服务,并指定要连接的主机和端口* @param args*/public static void main(String[] args) throws Exception {//创建客户端socket服务,指定目的主机和端口Socket s = new Socket("192.168.21.158", 10004);//为了发送数据,应该获取socket流中的输出流。OutputStream out = s.getOutputStream();out.write("tcp ge men lai le".getBytes());//获取服务端返回的数据InputStream input = s.getInputStream();byte[] buff = new byte[1024];int len = input.read(buff);System.out.println(new String(buff, 0 , len));s.close();}
}

服务端:

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/** * @author JiangMinyan** @version 2016/02/22 9:56:38*/
public class TCPServer {/*** 服务端:* 1 建立服务端的socket服务。ServerSocket(),并监听一个端口* 2 获取连接过来的客户端对象,通过ServerSocket的accept方法,没有连接就会等,所以这个方法是阻塞式的。* 3 客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,*   并打印在控制台。* 4 关闭服务端(可选)* @param args*/public static void main(String[] args) throws Exception{//建立服务端socket服务,并监听一个端口。ServerSocket server = new ServerSocket(10004);//通过accept方法获取连接过来的客户端对象Socket socket = server.accept();String ip = socket.getInetAddress().getHostAddress();System.out.println(ip + "........");//获取客户端发送过来的数据InputStream input = socket.getInputStream();byte[] buf = new byte[1024];int len  = input.read(buf);//向客户端返回数据OutputStream output = socket.getOutputStream();output.write("ni lai le a".getBytes());socket.close();System.out.println(new String (buf, 0 ,len));}
}

TCP小练习:

/**
* 需求:
* 建立一个文本转换服务器。客户端给服务端发送文本,服务端将文本转成大写在返回给客户端
* 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
*/
客户端:
package cn.wangyu.net;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;/** * @author JiangMinyan** @version 2016/02/22 10:34:23*/
public class TransClient {public static void main(String[] args) throws Exception{Socket client = new Socket("192.168.21.158", 10005);//定义读取键盘数据的流对象BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//定义目的,将数据写到socket输出流。发给服务端BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));//定义一个socket读取流,读取服务端返回的大写信息BufferedReader bufIn = new BufferedReader(new InputStreamReader(client.getInputStream()));String line  = null;while((line = bufr.readLine()) != null){if ("over".equals(line)) {break;}bufOut.write(line);bufOut.newLine();bufOut.flush();String str = bufIn.readLine();System.out.println("server:" + str);}bufr.close();client.close();}
}

服务端:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;public class TransServer {public static void main(String[] args) throws Exception{ServerSocket server = new ServerSocket(10005);Socket client = server.accept();String ip = client.getInetAddress().getHostAddress();System.out.println(ip + "......connected");//读取socket流中的数据。BufferedReader bufIn = new BufferedReader(new InputStreamReader(client.getInputStream()));//目的。socket输出流,将大写数据写入到socket输出流,并发送给客户端。BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));String line = null;while((line = bufIn.readLine()) != null){System.out.println(line);bufOut.write(line.toUpperCase());bufOut.newLine();bufOut.flush();}client.close();server.close();}
}

java_网络编程学习笔记(一)相关推荐

  1. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  2. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  3. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  4. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  5. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  6. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

  7. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  8. Linux网络编程学习笔记(TCP)

    文章目录 1 字节序 1.1 定义 1.2 字节序转换函数 2 Socket地址 2.1 通用socket地址(实际开发不使用) 2.2 专用socket地址 2 IP地址转换 3 TCP通信流程 3 ...

  9. Linux 网络编程学习笔记

    前言: 本文是学习<Linux 高性能服务器编程(游双 著)>时所记录的重点知识. 一.TCP/IP 协议族 二.IP 协议详解 三.TCP 协议详解 四.HTTP 通信 五.Linux ...

最新文章

  1. LIVE555中RTSP客户端接收媒体流分析及测试代码
  2. 保护站点上已存在另一个具有相同实例 UUID的虚拟机_LoadRunner性能测试系统学习教程:工具介绍(上)...
  3. np.vstack()和np.hstack()
  4. 知识点041-Samba 的安装
  5. ts-node 学习笔记 - 如何解决在 Windows10 下不能直接运行 ts-node 的问题
  6. 阿里云CDN+OSS完成图片加速
  7. asp,jsp,php等web开发必懂技术---什么时候使用静态页,什么时候必须使用动态页...
  8. 线程同步与互斥:POSIX无名信号量
  9. 开源web管理系统mysql_10个基于Web的开源项目管理系统
  10. ArcFace算法笔记
  11. 头文件<ctype.h>
  12. 打开Idea,弹出Server‘s certificate is not trusted 解决方法
  13. Android MediaPlayer多媒体系统框架
  14. 打开和设置IDEA欢迎界面
  15. Android studio 运行警告 We recommend using a newer Android Gradle plugin to use compileSdk = 33
  16. 不良光线下的语义分割论文调研
  17. 常用的算法(PHP 版)
  18. 程序人生:扒一扒程序员为什么总在加班?拿生命敲代码?
  19. Java毕设项目社区团购系统计算机(附源码+系统+数据库+LW)
  20. HTML5期末大作业 基于HTML+CSS+JavaScript学校官网首页(实训素材)

热门文章

  1. centos7安装mysql5.7.18.tat.gz
  2. 【转载】如何让自己像打王者荣耀一样发了疯、拼了命、石乐志的学习?
  3. 老调重弹-ffmpeg解码视频图像
  4. 东北电力计算机考研分数线,东北电力大学考研分数线_2021考研国家分数线什么时候出来...
  5. 多投影完美拼接——边缘融合投影技术
  6. JXTA技术与应用发展(转载)
  7. 清华大学出版社书评征集图书列表
  8. Zeus源码解读之定时任务执行与手动执行任务的过程分析
  9. LSP 语言服务协议
  10. 规范化(标准化)数据的方法