Java核心---网络编程


1.网络协议

IP协议:
用于将多个包交换网络连接起来,在原地址和目的传递数据包,还提供了对数据大小重新组装的功能。
TCP协议:
是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据传输之前先是三次握手搭建通道,然后才开始传输数据。
UDP协议:
不需要建立连接,每个数据包的大小的限制,因为不用提前建立连接所以速度快,效率高,不过不够安全。


具体7层
数据格式
功能与连接方式
典型设备
应用层 Application
 
网络服务与使用者应用程序间的一个接口
 
表示层 Presentation
 
数据表示、数据安全、数据压缩
 
会话层 Session
 
会话层连接到传输层的映射;会话连接的流量控制;数据传输;会话连接恢复与释放;会话连接管理、差错控制
 
传输层 Transport
数据组织成数据段Segment
用一个寻址机制来标识一个特定的应用程序(端口号)
 
网络层 Network
分割和重新组合数据包Packet
基于网络层地址(IP地址)进行不同网络系统间的路径选择
路由器
数据链路层 Data Link
将比特信息封装成数据帧Frame
在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址
网桥、交换机、网卡
物理层Physical
传输比特(bit)流
建立、维护和取消物理连接
光纤、同轴电缆、
双绞线、中继器和集线器

示例(获取自己的主机IP地址):
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();
        }
}




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值