Java核心---网络编程
2015-11-13 14:10
447 查看
1.网络协议
IP协议:用于将多个包交换网络连接起来,在原地址和目的传递数据包,还提供了对数据大小重新组装的功能。
TCP协议:
是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据传输之前先是三次握手搭建通道,然后才开始传输数据。
UDP协议:
不需要建立连接,每个数据包的大小的限制,因为不用提前建立连接所以速度快,效率高,不过不够安全。
具体7层 | 数据格式 | 功能与连接方式 | 典型设备 |
应用层 Application | 网络服务与使用者应用程序间的一个接口 | ||
表示层 Presentation | 数据表示、数据安全、数据压缩 | ||
会话层 Session | 会话层连接到传输层的映射;会话连接的流量控制;数据传输;会话连接恢复与释放;会话连接管理、差错控制 | ||
传输层 Transport | 数据组织成数据段Segment | 用一个寻址机制来标识一个特定的应用程序(端口号) | |
网络层 Network | 分割和重新组合数据包Packet | 基于网络层地址(IP地址)进行不同网络系统间的路径选择 | 路由器 |
数据链路层 Data Link | 将比特信息封装成数据帧Frame | 在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址 | 网桥、交换机、网卡 |
物理层Physical | 传输比特(bit)流 | 建立、维护和取消物理连接 | 光纤、同轴电缆、 双绞线、中继器和集线器 |
import java.net.*; class GetIpDemo { public static void main(String[] args) throws Exception { InetAddress ip = InetAddress.getLocalHost();//获取本地主机IP地址对象 System.out.println(ip.getHostName()); //通过get方法获取主机名 System.out.println(ip.getHostAddress());//通过get方法获取主机地址 } }运行结果:
UDP协议:
Socket 就像是插座一样。是通信两端的交接处。数据就通过Socket进行传输。示例(建立一个UDP的传送端):
/* 思路: 1 创建socket端口 2 将要发送的数据封装到包中 3 用socket端口的发送方法发送数据包 4 关闭socket服务 */ import java.net.*; class UDPSendDemo { public static void main(String[] args) throws Exception { System.out.println("UDP send ..."); //使用DatagramSocket对象创建端口 DatagramSocket ds = new DatagramSocket(9999); //要发送的数据 String str = "示例数据传输"; //封装数据 byte[] buf = str.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.80.65.191"),10000); //数据发送 ds.send(dp); //端口关闭 ds.close(); } }
示例(UDP接收端):
import java.net.*; class UDPReceDemo { public static void main(String[] args) throws Exception { System.out.println("UDP Rece ..."); DatagramSocket ds = new DatagramSocket(10000);//创建一个接受端口 while(true)//接受端打开后就循环接受数据不关闭 { byte[] buf = new byte[1024]; //创建接受的缓冲区 DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); int port = dp.getPort();//获取发送端的端口号 String str = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+":"+str); } } }
运行结果:
因为UDP的高效性,所以像一般的聊天工具QQ之类的都用它。
示例(广播主机程序不点地向外播出信息);
import java.net.*; class Weather extends Thread //创建类,该类为多线程执行程序 { String weather = "节目预报:晚上7点有晚会,请注意收听"; int port = 10000; //定义端口 InetAddress id = null; MulticastSocket socket = null; //声明多点广播套接字 Weather()throws Exception{ //构造方法 id = InetAddress.getByName("224.255.10.0"); socket = new MulticastSocket(port); //实现化多点广播套接字 socket.setTimeToLive(1); //指定发送范围是本地网络 socket.joinGroup(id); } public void run(){ //run()方法 while(true) { DatagramPacket packet = null; byte data[] = weather.getBytes(); packet = new DatagramPacket(data,data.length,id,port); //打包数据 System.out.println(new String(data)); //将广播信息输出 try { socket.send(packet); //发送数据 sleep(3000); //线程休眠 } catch (Exception e) { e.printStackTrace(); //输出异常信息 } } } public static void main(String[] args) throws Exception { Weather w = new Weather(); //创建本类对象 w.start(); //启动线程 } }运行结果:
创建UDPmessage类,它集继承了JFrame成为窗体类并实现了ActionListener接口可以处理按钮的动作处理。
该类包含多个成员变量,它们分别是信息接收文本域、信息发送文本框、IP文本框、“发送”按钮和数据报套接字。
import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.net.*; import javax.swing.*; public class UDPmessage extends JFrame implements ActionListener { private JTextArea text; private JTextField ipText; private JTextField sendText; private JButton button; private DatagramSocket socket; private JScrollBar vsBar; public UDPmessage() { setTitle("UDP聊天程序"); setBounds(100, 100, 400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); text = new JTextArea(); text.setEditable(false); JScrollPane textPanel = new JScrollPane(text); vsBar = textPanel.getVerticalScrollBar(); add(textPanel, BorderLayout.CENTER); JPanel panel = new JPanel(); BorderLayout panelLayout = new BorderLayout(); panelLayout.setHgap(5); panel.setLayout(panelLayout); ipText = new JTextField("10.80.65.191"); panel.add(ipText, BorderLayout.WEST); sendText = new JTextField(); panel.add(sendText, BorderLayout.CENTER); button = new JButton("发送"); panel.add(button, BorderLayout.EAST); add(panel, BorderLayout.SOUTH); setVisible(true); server(); button.addActionListener(this); } private void server() { try { socket = new DatagramSocket(9527); byte[] buf = new byte[1024]; final DatagramPacket dp1 = new DatagramPacket(buf, buf.length); Runnable runnable = new Runnable() { public void run() { while (true) { try { Thread.sleep(100); socket.receive(dp1); int length = dp1.getLength(); String message = new String(dp1.getData(), 0, length); String ip = dp1.getAddress().getHostAddress(); if (!InetAddress.getLocalHost().getHostAddress() .equals(ip)) text.append(ip + ":\n " + message + "\n"); vsBar.setValue(vsBar.getMaximum()); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } }; new Thread(runnable).start(); } catch (SocketException e) { e.printStackTrace(); } } public void actionPerformed(ActionEvent ev) { try { String ip = ipText.getText(); InetAddress address = InetAddress.getByName(ip); byte[] data = sendText.getText().getBytes(); DatagramPacket dp = new DatagramPacket(data, data.length, address, 9527); String myip = InetAddress.getLocalHost().getHostAddress(); text.append(myip + ":\n " + sendText.getText() + "\n"); socket.send(dp); sendText.setText(null); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args[]) { JFrame frame = new UDPmessage(); } }运行结果:
TCP协议:
客户端要和服务端建立连接,形成通道(IO流),然后数据在通道内传输。用Socket和ServerSocket建立客户端和服务端
示例(客户端):
/* 创建一个客户端思路: 1.创建客户端的Socket服务 2.获取Socket中的输出流 3.使用输出流将数据写出 */ import java.net.*; import java.io.*; class TCPClientDemo { public static void main(String[] args)throws Exception { //创建Socket端,指定地址和端口 Socket socket = new Socket("10.80.65.191",10000); //用OutputStream流关联socket中的数据 OutputStream out = socket.getOutputStream(); //用write方法将数据写入流中 out.write("示例数据 示例数据 示例数据"getBytes()); //关闭端口 socket.close() } }示例(服务端):
import java.io.*; import java.net.*; class TCPServerDemo { public static void main(String[] args) throws Exception { //创建一个服务端端口 ServerSocket ss = new ServerSocket(10000); //用accept方法就收客户端发过来的数据 Socket s = ss.accept(); //获取客户端的ip地址 String ip = s.getInetAddress().getHostAddress(); //用流关联数据 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); //打包数据 String text = new String(buf,0,len); System.out.println(ip+":"+text); //关闭端口 s.close(); ss.close(); } }
TCP上传图片:
示例(客户端):
import java.io.*; import java.net.*; public class UploadPicServer { public static void main(String[] args) throws Exception { //创建tcp的socket服务端。 ServerSocket ss = new ServerSocket(10000); //获取客户端。 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + "连接成功"); //读取客户端发来的数据。 InputStream in = s.getInputStream(); //将读取到的数据存储到一个文件中。 File dir = new File("d:\\pic"); if(!dir.exists()){ dir.mkdirs(); } File file = new File(dir,ip + ".bmp"); FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[1024]; int len = 0; while((len = in.read(buf)) != -1){ fos.write(buf,0,len); } //获取socket输出流,将上传成功字样发给客户端。 OutputStream out = s.getOutputStream(); out.write("上传成功".getBytes()); fos.close(); s.close(); ss.close(); } }TCP服务端:
import java.net.*; import java.io.*; public class UploadPicClient { public static void main(String[] args) throws Exception{ //1. 创建客户端socket。 Socket s = new Socket("10.80.65.191",10000); //2. 读取客户端要上传的图片文件。 FileInputStream fis = new FileInputStream("d:\\1.bmp"); //3. 获取socket输出流,将读到图片数据发送给服务端。 OutputStream out = s.getOutputStream(); byte[] buf = new byte[1024]; int len = 0; while((len = fis.read(buf)) != -1){ out.write(buf,0,len); } //让服务端停止读取。 s.shutdownOutput(); //读取服务端发回的内容。 InputStream in = s.getInputStream(); byte[] bufIn = new byte[1024]; int lenIn = in.read(buf); String text = new String(buf,0,lenIn); System.out.println(text); fis.close(); s.close(); } }
相关文章推荐
- PHP 使用header函数设置HTTP头的示例方法 表头
- 用tomcat搭建https
- 通过cacti监控netstat不同网络状态并发连接数
- 搜索引擎—网络爬虫抓取策略
- Java安全通信:HTTPS与SSL
- Java安全通信:HTTPS与SSL
- Java安全通信:HTTPS与SSL
- Java安全通信:HTTPS与SSL
- Java安全通信:HTTPS与SSL
- void与void*详解 http://zhengdl126.iteye.com/blog/1739165
- (void *)1,(void *)0 ,(void *)-1什么意思 [复制链接] http://bbs.chinaunix.net/thread-1944990-1-1.html
- java.net.URLConnectioin的http(get,post)请求(原生)
- SVN-serve支持httpd安装及常用命令
- Ping N个IP测试网络连通性
- IIS 安装后没有默认网站 新建网站绑定没有http 重装无效 如何解决
- 2013-2015阿里双十一技术网络文章总结
- Android判断网络是否连接以及连接类型
- 在ios9下,使用afnetworking执行http请求(http://apitest.XXX.com/Login),但是一直返回的是error
- 黑马程序员-java网络编程以及IO流的应用
- 从网络获取图片本地保存