java网络编程

网络编程

概念

编写程序使得多台设备或多台计算机进行网络传输。

TCP和UDP

1)TCP和UDP是传输层的两个重要的协议。
2)TCP是连接的协议,TCP连接分为三个阶段:连接建立、数据传送、连接释放,类似于打电话。
3)UDP是非连接的协议,传输数据之前原始主机(源端)和目标主机(终端)不需要建立连接,类似于发短信。

HTTP

1)一种应用层协议,它是基于TCP协议上的请求响应式协议。
2)HTTP指定客户端和服务器端如何建立连接,客户端如何从服务器请求数据,以及服务器端如何响应数据。

端口号

1)0-1023:常规的端口号
2)1024-65535:自定义服务的端口号
3)端口号用来标识不同的服务
4)mysql:3306 tomact:8080 http:80

Socket编程

1)Socket:套接字 两台主机之间逻辑连接的端点,如果想要实现多个网络节点通信依赖于TCP/IP协议和HTTP协议。
2)TCP/IP协议是传输层协议,主要解决如何在网络中传播;
3)HTTP协议是应用层协议,主要解决如何包装数据 SOAP:HTTP + XML
4)Socket编程实际上是对TCP/IP协议的封装,Socket本身不是协议,而是一个调用的接口(API)
5)Socket编程主要涉及到客户端和服务端的编码,首先在服务器端创建一台服务器套接字(ServerSocket),并把他附加到一个端口上,服务器从这个端口监听连接。(端口1024-65535,选择一个没有被其他进程所使用的端口)

网络通信的第一要素:IP

1)InetAddress:代表IP地址,一个对象代表一个IP
2)创建InetAddress对象,getByName(String host)
3)getHostName():获取IP地址对应的域名
4)GetHostAddress():获取IP地址

TCP网络编程代码举例
package com.hpe.socket;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import org.junit.Test;

// TCP编程案例3:从客户端发送文件给服务器端,服务器端保存到本地,并响应到客户端
public class TestTCP3 {

	@Test
	public void client() throws Exception{
		// 1.创建Socket对象,向服务端发出套接字连接请求,指定服务器的IP地址,以及接收程序的端口号
		Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
		// 2.客户端向服务器发送数据,调用getOutputStream方法
		OutputStream os = socket.getOutputStream();
		FileInputStream fis = new FileInputStream(new File("褚.jpg"));
		byte[] bs = new byte[1024];
		int len;
		while((len = fis.read(bs)) != -1) {
			// 3.发送数据
			os.write(bs,0,len);
		}
		// 执行shutdownOutput():服务端响应给客户端
		socket.shutdownOutput();
		InputStream is = socket.getInputStream();
		byte[] b1 = new byte[1024];
		int len1;
		while((len1 = is.read(b1)) != -1) {
			// 将读出数据转化为字符串打印到控制台
			String str = new String(b1,0,len1);
			System.out.println(str);
		}
		// 关闭
		is.close();
		os.close();
		fis.close();
		socket.close();
	}
	
	@Test
	public void server()  throws Exception{
		// 1.创建ServerServer对象,指定开放服务的端口号,用于监听客户端的请求
		ServerSocket ss = new ServerSocket(9999);
		// 2.调用accept()方法,接收客户端发送的请求,返回一个Socket对象
		Socket s = ss.accept();
		// 3.调用Socket对象的getInputStream方法,获取客户端发过来的输入流包装的数据
		InputStream is = s.getInputStream();
		FileOutputStream fos = new FileOutputStream(new File("2.jpg"));
		byte[] b = new byte[1024];
		int len;
		while((len = is.read(b)) != -1) {
			fos.write(b,0,len);
		}
		System.out.println("收到来到"+s.getInetAddress().getHostAddress() + "的文件");
		OutputStream os = s.getOutputStream();
		os.write("收到,谢谢".getBytes());
		os.close();
		fos.close();
		is.close();
		s.close();
	}
}
UDP编码实例
package com.hpe.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import org.junit.Test;
//用UDP实现传输数据
public class TestUDP1 {

	@Test
	public void client() throws Exception{
		// 1.创建DatagramSocket
		DatagramSocket ds = new DatagramSocket();
		byte[] b = "I love you forever.".getBytes(); 
		// 2.创建数据报
		DatagramPacket dp = new DatagramPacket(b, 0, b.length,InetAddress.getByName("127.0.0.1"),9999);
		// 3.发送数据报
		ds.send(dp);
		// 4.释放资源
		ds.close();
	}
	
	@Test
	public void server() throws Exception{
		DatagramSocket ds = new DatagramSocket(9999);
		byte[] b = new byte[1024];
		DatagramPacket dp = new DatagramPacket(b, b.length);
		ds.receive(dp);
		String s = new String(dp.getData(), 0, dp.getLength());
		System.out.println(s);
		ds.close();
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值