网络编程概述及实例练习
2017-10-12 21:57
120 查看
一、网络编程概述
1.网络模型
计算机网络之间以何种规则进行通信,就是网络模型研究问题。 网络模型一般是指OSI(OpenSystem Interconnection开放系统互连)参考模型 TCP/IP参考模型
二、网络编程三要素
1.IP地址:InetAddress
网络中设备的标识,不易记忆,可用主机名 要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,在TCP/IP协议中,这个标识号就是IP地址。
那么,我们如果获取和操作IP地址呢?
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用。
没有构造方法,那么如何使类提供的功能呢?
要掌握的功能
获取任意主机:getByName
主机名:getHostName 主机Ip地址:getHostAddress
2.端口号
用于标识进程的逻辑地址,不同进程的标识
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
通过360可以查看端口号
3.传输协议
通讯的规则 常见协议:TCP,UDP
三、UDP编程
1.UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
2.UDP编程小例子
(1).多线程实现eclipse下显示UDP通信
ChatRomm.java package cn.itcast_05; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoom { public static void main(String[] args) throws IOException { DatagramSocket dsSend = new DatagramSocket(); DatagramSocket dsReReceive = new DatagramSocket(12306); SendThread st = new SendThread(dsSend); ReceiveThread rt = new ReceiveThread(dsReReceive); Thread t1 = new Thread(st); Thread t2 = new Thread(rt); t1.start(); t2.start(); } } ---------- ReceiveThread.java package cn.itcast_05; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveThread implements Runnable { private DatagramSocket dsReceive; public ReceiveThread(DatagramSocket dsReceive) { this.dsReceive = dsReceive; } @Override public void run() { // TODO Auto-generated method stub try { while (true) { byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); dsReceive.receive(dp); String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println("from " + ip + " data is: " + s); } } catch (IOException e) { // TODO: handle exception } } } ---------- SendThread.java package cn.itcast_05; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendThread implements Runnable { private DatagramSocket dsSend; public SendThread(DatagramSocket dsSend) { this.dsSend = dsSend; } @Override public void run() { // TODO Auto-generated method stub try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.1.103"), 12306); dsSend.send(dp); } dsSend.close(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } }
四、TCP编程
1.TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
2.TCP编程小例子
UserThread.java import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class UserThread implements Runnable { private Socket s; public UserThread(Socket s) { this.s = s; } @Override public void run() { try { // 封装通道内的流 BufferedReader br = new BufferedReader(new InputStreamReader( s.getInputStream())); String newName = System.currentTimeMillis() + ".java"; BufferedWriter bw = new BufferedWriter(new FileWriter(newName)); String line = null; while ((line = br.readLine()) != null) { // 阻塞 bw.write(line); bw.newLine(); bw.flush(); } // 给出反馈 BufferedWriter bwServer = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功"); bwServer.newLine(); bwServer.flush(); // 释放资源 bw.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } } ---------- UploadClient.java import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class UploadClient{ public static void main(String[] args) throws IOException { // 创建客户端Socket对象 Socket s = new Socket("192.168.1.103", 11111); // 封装文本文件 // BufferedReader br = new BufferedReader(new FileReader( // "InetAddressDemo.java")); BufferedReader br = new BufferedReader(new FileReader( "a.txt")); // 封装通道内流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( s.getOutputStream())); String line = null; while ((line = br.readLine()) != null) { // 阻塞 bw.write(line); bw.newLine(); bw.flush(); } // Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了 s.shutdownOutput(); // 接收反馈 BufferedReader brClient = new BufferedReader(new InputStreamReader( s.getInputStream())); String client = brClient.readLine(); // 阻塞 System.out.println(client); // 释放资源 br.close(); s.close(); } } ---------- UploadServer.java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class UploadServer { public static void main(String[] args) throws IOException { // 创建服务器Socket对象 ServerSocket ss = new ServerSocket(11111); while (true) { Socket s = ss.accept(); new Thread(new UserThread(s)).start(); } } }
五、Socket
Socket套接字:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。
InetAddress类的使用
获取任意主机:getByName 主机名:getHostName 主机Ip地址:getHostAddress
相关文章推荐
- Go语言练习:网络编程实例——简易图片上传网站
- 黑马程序员-网络编程TCP练习(服务端)
- 网络编程练习代码——使用客户端登陆
- 网络编程练习-TCP socket
- Linux网络编程--epoll 模型原理详解以及实例
- 7种网络编程I/O模型代码实现实例
- iOS网络编程-iCloud键值数据存储编程实例
- c++基本网络编程实例
- iOS网络编程-iCloud键值数据存储编程实例
- TCP套接字网络编程实例(二)
- Java基础知识网络编程(TCP练习)
- 网络编程_网络编程三要素之IP概述
- win32网络编程实例——重叠IO
- 神经网络与深度学习编程练习(coursera 吴恩达 )(3)
- C#网络编程概述 二
- Io流,多线程,网络编程的融合练习
- python网络编程之读取网站根目录实例
- 关于Java网络编程的几个实例
- Java基础-网络编程(TCP练习)